April 2020

JackTripを使ったリモート同期セッション

これまでリモートでの同期セッションには、MusicianLinkのJamLinkというセットトップボックスを使ってきた。

しかし、MusicianLinkは数年前から開店休業状態で新規アカウントを作ったり、既存アカウントのパスワードを変更したり、JamLinkのファームウェアをアップデートすることができない。またコンソールを呼び出せないので、従来のウェブサイトにログイン中の友人同士で簡単にリモート同期セッションすることもできない。

JamLinkのファームウェアが最新なら、JamLink同士で直接に接続してリモート同期セッションは可能だが、前述の通りファームウェアのアップデートができないので手元の古いJamLinkは利用価値がない。

よく似た製品とサービスには後発の
JamKazamがあるが、こちらも連絡がつきやすいというわけではなく、またJamLinkより高機能で魅力的に見えるセットトップボックスも受注生産のような状態にあって気軽に使えるものではない。

そこで、JamLinkの基盤となったリモート同期セッションの技術であるJackTripを試してみようと試行錯誤している。

JackTripは、まずmacOS、Windows、およびLinux系のOS上で動作するJackというサーバプログラムを起動させ、そこに複数のJackTripクライアント端末から接続して高音質で音声を双方向に送受信するというものだ。遅延(レーテンシー)を極力抑える点がミソで、通信速度が十分に高速なら、ある程度の距離までリアルタイムでセッションができる。距離が離れるほど遅延が大きくなるので、そんな遅延を改善するためには音質を下げていくことになるが、下げすぎると音は単なるノイズになってしまうので実際の端末同士で試験しながら調整する必要がある。

日本は比較的に高速な回線が張り巡らされているが、ほとんどがいわゆるベストエフォート方式なので時間帯や曜日などタイミングによって最適な設定が異なる点にも注意が必要だ。

JamLinkの場合、高速回線なら300km位の距離まで1対1でさほどの遅延なくCD音質でセッションできたので、JackTripでも同様なのではないかと想像している。

JackTripを試すには、まずWindowsかMac、あるいはLinuxマシンがあれば良いわけだが、試験用に専用マシンを用意しようと考えた。余っているMacBook Airもあるが、試験には2台の端末が必要になるので、どうせなら面白みがあった方が良いと考え、1台は非常に非力なUbuntu端末、Intel Computer Stick STCK1A8BLFCを使うことにした。


このSTCK1A8BLFCは、すでに製造は終了しているスティックコンピュータでRAMが1GBでストレージが8GBと最小構成、搭載されているUbuntuも最新でなく14.0.4という普通に考えたらまともに動くか不安になる製品だ。

しかし個人的にソフトウェアを試験する場合は、可能な限り貧弱で古い環境で試験するべきと考えているので、この製品は最適に思える。

で、端末(ターミナル)を呼び出して
apt-get install qjackctl jackd jacktripでJack用のUIであるqjackctl、jackサーバであるjackd、そしてJackTripをインストールしてみた。なお、jackdはqjackctlに含まれているはずなのに自分の環境ではうまくいかなかったのでjackdもインストールしているが、本来は不要かもしれない。

何の問題もなければ、qjackctlを起動して設定を行って開始をクリックしてjackサーバを起動し、端末からjacktrip -sと入力すればJackTripをサーバモードで起動してクライアントになるJackTripからの接続を待機する状態にできるはずだが、そんな簡単なものではなかった。

まずqjackctlを開始してもjackサーバが起動しない。設定がおかしいのだろうと色々といじった結果、まずはデフォルトのInterface名である「(既定)」が認識されていないようなので、これをdefaultに変更した。これで少し進んだようだ。

次に音声入出力が認識されていないようなので、
STCK1A8BLFC自体に音声入出力する機能がないことが原因だろうと考え、USBポートにオーディオインタフェース、Steinberg UR22mkIIを接続してみた。


ただし接続しただけではダメで、
qjackctlの入出力デバイスを両方ともhw:1に変更して明示的にオーディオインタフェースを指定した。

これでOKかと思えたがエラーは続き、ユーザがaudioグループに入れないようだったので、
sudo usermod -a -G audio theusernameaudioグループにユーザを追加してみた。

これでjackサーバは起動し、クライアントからの接続を待機する状態になったので問題は解決したと思われたが、クライアントが接続してくるとソケットをバインドできないエラーになってしまう。

これがどうしても解決できずに諦めかけたが、ひょっとしてと思い、アップデートを全て適用してみた。事前の試験で、このアップデートを行うとWiFiとBluetoothが使えなくなってしまうことがわかっていたので最後の手段ではあるが、USBハブをつけてUSB->Ethernetアダプタを介して有線でインターネットに接続した状態にし、アップデートを完了すると、ソケットの問題は自然に解消したようだ。

ちなみにUSBキーボードとマウスも必要なので、オーディオインタフェース、キーボード(と必要ならマウス)、そしてEthernetを接続するためにUSBハブは4口以上のものが理想となる。

これでとりあえず宅内でMacBook Airで稼働しているJackクライアントからJackサーバである
STCK1A8BLFCに接続してみると音声は双方向に送受信できているようだ。

音質を色々と調整したところ、サンプリングレートは4800、フレーム/ピリオド(バッファーサイズ)は512が最適なようだ。これ以下にするとノイズが入り始める。

とりあえず宅内ではうまくいったので、今後は実際に遠隔地で遅延なくリモートセッションができるかを試してみよう。その場合は、ルータで
JackTripが走る端末に対してUDPのポート44644465ポート転送する必要がある。

また、JamLinkのファームウェアが最新なら接続先としてIPアドレスを指定できるので、JackTripのサーバをJamLinkモードで起動しておいて、JamLinkをクライアントのセットトップボックスとして使うこともできるはずだ。JamLinkが使えれば面倒なソフトウェア的な設定も要らないから、MusicianLinkが少なくともファームウェアのアップデートを再開することに期待したい。