2020-03-23

RolandのミキサーM-200iのREACポートのオーディオをLinuxマシンで録音

Rolandという浜松にある音響機器メーカーが出しているM-200iというオーディオミキサーがある。 このミキサーには、REACポートというディジタル音声を40チャネル出力するポートが備わっている。 ステージボックスとの接続や他のミキサーとの接続に使用するポートで、Ethernetパケットに音声情報を載せて送るようになっている。

Windows用には、このポートを通して録音するソフトが出ている。 Mac OS X用には、サードパーティからREAC driverというGPL3のツールが出ている。 どちらもLinuxでは使用できないので、REAC driverのソースを参考に、Linuxで動くものを作成し始めた。

REAC driverのようなカーネル空間で動くオーディオドライバにすると扱いやすいのだろうが、そこまでするのは大変なので、ユーザー空間で動かすプログラムをつくることにした。 Linuxのsocketをつかってプログラムを書いてみたが、パケットロスを回避するのが難しく断念、最終的に、tcpdumpでファイルに保存しておき、後処理をすることにした。

  1. まず、M-200iのREACポートとLinuxマシンとをLANケーブルで接続する。 (1 Gbpsでリンクすることを期待していたのだが、dmesgを見るとなぜか100 Mbpsでリンクしていた。)
    e1000e: enp0s31f6 NIC Link is Up 100 Mbps Full Duplex, Flow Control: None
    e1000e 0000:00:1f.6 enp0s31f6: 10/100 speed: disabling TSO
    
    今回はストレートケーブルを使って、スイッチングハブなどを介さずに接続した。
  2. 以下のようにtcpdumpでキャプチャし、ファイルに保存する。このとき、オプション-Bでカーネル上のバッファサイズを大きく取っておく。今回使用した環境 (Intel Core i7-7700 + H270) では、256MiBに設定したらようやくパケットロスしなくなった。
    $ tcpdump -i enp0s31f6 -B 262144 -w a.pcap
    
    このときtcpdumpはパケットロスしたと報告するのだが、次のステップでパケットを解析すると、音声情報が載ったパケットのロスは無かった.
  3. そのあと、自作のプログラムで、チャネルを選択して24-bit WAVE形式に変換する。プログラム自体はそのうちGitHubで公開するかもしれない。
    $ reacrecorder --save-channels 21,22,39,40 --save-wav-24 --load-pcap-file a.pcap
    

REAC driverにはM-200iとのネゴシエーションなどいろいろな処理が書かれているのだが、今回の用途には必要なかった。 REAC masterとなるM-200iから常に音声データがブロードキャストされている。 そのパケットをキャプチャしてWAVEに変換すれば良いだけだった。

0 件のコメント:

コメントを投稿