M5StackのBLE-MIDIのレイテンシーを計測 ESP32 BLE ArduinoとNimBLE比較

M5Stack

 ESP32用のBLE-MIDIライブラリ「Arduino-BLE-MIDI」がアップデートしていたので試してみました。ESP32 BLE ArduinoとNimBLEの両方に対応している模様。そこでレイテンシーをチェックすべくいろいろテストしてみました。

Arduino-BLE-MIDI

 実のところ以前の状態がちょっとわからないのですが、今回のアップデートで、FortySevenEffects/arduino_midi_library のトランスポートレイヤーとして実装されたとのこと(意味があまりわかってない)。触ってみると、初期設定や受信のコールバックも含め、だいぶ使いやすいライブラリだとと感じました。そういえばESP32でBLE-MIDIを使い始めたころに使っていたコードはスニペット的なやつから必要な部分コピペしてた気がしますが、これはちゃんとしたライブラリって感じです。とにかく楽。

 で、冒頭に触れたとおり、ESP32 LE ArduinoとNimBLEに対応しています(インクルードするヘッダーで動作が切り替わるが、書くべきコードは同じでよい)。NimBLEはサイズが小さくなるというので期待していたのですが、Windowsではペアリングできず(iOSでは問題なし)。ツイッターでつぶやいたところ、こばさん(@wakwak_koba)が声をかけてくださり、修正したコードをアップしてくださいました。やりとりの中でいろいろと問題点が明らかになり、最終的にはArduino-BLE-MIDIとNimBLE両方が修正されることに(やりとりはこのへんから)。

 その中で、Arduino-BLE-MIDIとNimBLEのレイテンシーに差はあるか?的な話も出てきました。というわけで、この投稿はそれらのコードを使ったテストの結果です。

テスト方法

 使用したのは以下のもの。

  A-01はシーケンサー内蔵のシンセサイザーで、今回はシーケンサーとして使用。MIDI DIN端子とUSB-MIDI、BLE-MIDIに対応しているので、こうしたテストにはもってこいのシンセです(ただしすでに生産終了)。また、CakewalkはメジャーなDAWで最も早くBLE-MIDIに対応したソフトウェア。SONAR時代から使い慣れているもあり、これを受信、記録、比較に使います。

 このA-01の内蔵シーケンサーからMIDIメッセージを送信、MIDIモジュール搭載のM5Stack FIREでMIDIを受信し、さらにM5StackからBLE-MIDIでPCに送信、PCにのCakewalkで受信します。比較用として、A-01からUSB-MIDI経由でもCakewalkに記録します。BLE-MIDIとUSB-MIDIの2つを同時にレコーディングし、両者の時間の差を比較します。USBからBLEがどれだけ遅れているか=レイテンシーとして考えようというわけです。 

 以下がレコーディング用のプロジェクト。毎回、USB-MIDIとBLE-MIDIの2トラックをレコーディングしています。あと、わかりやすいよう色分けもしています。

Cakewalk

 レコーディングしたデータを比較するには、タイミングを数値で見られるイベントリストを使います。ただ、このイベントリストをテキストとしてコピーするといったことはできないようなので(うまい方法があったら教えて下さい)、画面を見ながらスプレッドシートに入力していきます。以下のような表を作成しました。

 A-01からシーケンスを流し、それを1小節レコーディング。停止後、いったんCakewalkを終了させ、BLE-MIDIデバイスを切断。再度Cakewalkを起動して続き、という手順でBLE-MIDIは6回ずつ測定しました。

 数値の単位はティックです。これはCakewalkだけでなく、シーケンサー/DAWで一般的に使われる単位で、1拍=960ティックとなります。時間はテンポによって変わるのですが、今回はテンポを120BPMとしているので、2拍で1秒、1920ティックで1秒、ということになります。

 けっこうばらつきがありますが、これがBLE-MIDI特有のジッターです。ジッターについては、藤本健さんのこれとかこれをご覧ください。ちなみに、一番左のデータはMIDI DINから受けたもの。USB-MIDIよりちょっとずれが出ますが、1ms程度です。使用したiConnectMIDI2+はiOSと同時使用が可能といった特殊なMIDIインターフェイスなので、こうした遅れが出ているようです。後ほど、別のを使ったら差はほぼ0ティック(たまに1ティック)でした。

テスト結果

 集計した結果はこんな感じです。

 今回のテストのメインとなるのは、「NimBLE」と「Arduino ESP32」です。それぞれ1小節(16ノート)を6回ずつ集計しています。それらの平均が一番右端です(見出し入れ忘れました)。これを見る限り、「NimBLE」と「Arduino ESP32」の差はほとんどないといっていいでしょう。

 40ms弱という数値は、使ったことがない人にはぴんとこないかもしれません。個人的な感想としては、ほぼ鍵盤を弾けない私が単音でメロディを弾こうとするには問題ないレベル。音がついてこないという感じはありません。バリバリに弾ける人なら遅れを感じるかも、といったところ。

 比較用として、市販の最新BLE-MIDIアダプタmi.1 Cableでの結果も最後に載せています。これはQuicco Soundの製品で、送受信が行えるアダプタを2個セットにしたもの。現在、同種の製品としては現時点で最速の5msでの低レイテンシーをうたった製品です。M5Stack(ESP32)と比べるとべらぼうに速いですね。いったんこっちを味わうと、ESP32はやっぱり遅れがあったのかな? と思う部分も(プラシーボかも)。あと、測定結果はスペックの5msより遅いじゃないか、と思う人もいるかもしれませんが、それはテスト環境が違うからこんなものじゃないですかね、といったところです。同時に2トラック録音とかしてますし、PCの負荷などもあるでしょうし、などなど。

 なお、mi.1 Cableは、MIDI楽器同士をつなげる製品なので、PCで使うにはMIDIインターフェイスが必要になります。受信側にiConnectMIDI2+を使おうと思ったのですが、これがMIDI OUTが給電していなのか使えず、別のインターフェイス(Roland UA-700)を使いました。

 ここまで来ると、ほかのBLE-MIDIアダプタはどうなの? という疑問も出てくるでしょう。私もそう思いました。

 というわけで、YAMAHA MD-BT01、US-BT01と、Quicco Sound mi.1 IIおよびmi.1 Rev.3があるので、後ほどそれらもテストしてみようと思います。あくまでもWindowsの話ですが。あと、今月発売のRoland WM-1も気になってます。どうしますかね。

 あと、ここまで書いてきてM5Stack用のプログラムはほんとに適切なのか? という疑問が出てきました。あとで見直します。

コメント