Bluetooth MIDIに関するメーカーとのやりとり

BLE-MIDI Adapters プログラミング

 WindowsでBluetooth MIDIアダプタを使用中に問題が発生し、メーカーに問い合わせた際のやりとりを記録(2021年3月)。メーカー側の了解は取っていないので、先方のメール内容は概要のみ記載。実際は英語でのやりとりだったのですが、ここでは日本語のみとします。当方からのメッセージを翻訳サイトで英語にしてから送信。先方からのメッセージも翻訳サイトで訳してから読んでいます。

 私が当時使用していたのは、CMEのWIDI MasterおよびWIDI JackというBluetooth MIDIアダプタ。Windows対応をうたった製品です。ということで、以下、CMEとのやりとり。

送信メッセージ 1

私は、WindowsでWIDI MasterとWIDI Jackを使っています。この組合わせで問題があるのでぜひ解決してほしい。
私はYAMAHA CBX-K1XGとRoland A-01に、WIDIをつないで使おうとしています。
Roland A-01でのみ問題が発生します。A-01でWIDIを使うと、Windowsソフトウェアが落ちます。YAMAHA CBX-K1XGでは問題は起きません。
MIDIberryとCakewalkで試しましたが、結果は同じです。2つのソフトに問題があるのではなく、WindowsのBLEスタックに問題があるだろうと私は推測しました。

私はWIDIのほかに、いくつかのBluetooth MIDIアダプタを所有しています。YAMAHA MD-BT01、QUICCO SOUND mi.1とmi.1 II。それらではこうした問題は起きません。WIDIとWindows特有の問題だと私は思いました。

私はBLEパケットをキャプチャして、他のBluetooth MIDIアダプタと比較してみました。そこで、気づきました。WIDIはランニングステータスの処理に問題があります。

以下は、ソフトがスタックするタイミングでのキャプチャ結果の一部を抜き出したものです。私はピッチベンド情報を送っています。

80 80 e0 00 47
80 80 f8 80 e0 40 44 80 40 42
80 80 e0 40 40 80 f8 80 00 42
80 80 e0 00 44 80 40 46 80 f8
80 80 e0 40 48 80 40 4b 80 f8
80 80 e0 40 4e 80 00 51

厳密なタイミングはわかりませんが、問題があると思われるのは3行目です。
80 80 e0 40 40 80 f8 80 00 42
MIDIステータスごとに分割すると以下のようになります。
[80 80 e0 40 40][80 f8][80 00 42]
Roland A-01は常にMIDIクロックを送信しており、私は送信をOFFにすることはできません(CBX-K1XGはMIDIクロックを送信しません)。上に挙げた例では、ピッチベンドデータ(e0)、MIDIクロックデータ(f8)、ピッチベンドデータが続いて送信されます。

MIDIの規格では同じMIDIステータスの情報が続く場合はMIDIステータスを省くことができますが、f8に続くピッチベンドデータ(e0)のステータスは省いてはいけません。
本来なら以下のようになるべきだと思います。
[80 80 e0 40 40][80 f8][80 e0 00 42]
このデータの並びをWindowsがパースできず、ソフトウェアが落ちていると思います。Windowsにも問題があるかもしれませんが、MIDI規格に適合していないデータを出力する側に大きな問題があると私は考えます。

この問題は、ピッチベンドだけでなく、コントロールチェンジやMIDIノートを送信する場合でも発生します。また、”f8″だけでなく”fe”でも問題が発生するかもしれません。

ぜひ、WIDIのファームウェアのアップデートをお願いします。

先方からの返信 1

メッセージは正しいように見える。
ファームウェアのバージョンを教えてほしい。
提示されれたメッセージには2つのイベントの間にクロックがある。ランニングステータスは失われることはない。

送信メッセージ 2

返信をありがとう。
私が先のメールで示したのは、WIDIがWindowsに送信したBLEパケットの内容です。
私が使用しているWIDIのファームウェアは以下のとおりです。

WIDI Master: 0.1.0.4
WIDI Jack: 0.1.0.0
WIDI Jack: 0.1.0.3
3つとも同じ結果となります。

WIDIをRoland A-01に接続して、私がA-01のキーボードを弾くと、途中でWindowsのBLE-MIDIアプリがクラッシュします。
私がWIDIのテストをした際のアプリがクラッシュしたタイミングでのスクリーンショットとBLEパケットのログを添付します。
ログはタイミングクロックのみを含むパケットは除外しています。

アプリがクラッシュした時点のパケットは以下のとおり(16行目)。
80 80 b0 01 1e 80 f8 80 01 1f
スクリーンショットの右にあるMIDIberryは、Control Change 1、値=30までを受信した。それ以降のデータは受信せず、クラッシュした。

スクリーンショットで使っているのは以下の2つ。
MIDIberry
https://www.microsoft.com/en-us/p/midiberry/9n39720h2m05
BLE packet checker
https://nts.linclip.com/blesynth/

>There is a midi. Clock between the two events, and running status should not be lost.

私は、ランニングステータスの仕様について勘違いしていた。あなたが言っていることを理解した。
ありがとう。

先方からの返信 2

BLEパケットにおいて、MIDIクロックとリアルタイムメッセージまたはシステムメッセージが、ランニングステータスをキャンセルすることはない。BLE MIDIの仕様を読んでほしい。

 80 80 b0 01 1e 80 f8 80 01 1f のパケットは正しい。

クロックを遅くすると結果はどうですか?

送信メッセージ 3

BLE MIDI仕様について説明してくれてありがとう。私はそれを理解した。

クロックを落としてみた(テンポを落としてみた)。しかし、クラッシュするタイミングがちょっと遅くなるだけで、結果は同じだった。


問題は、WIDIが出力するパケットではなく、Windowsがパケットを正しく処理できないことにあるようだ。この問題を解決すべきはマイクロソフトだろうと私は思う。


しかし、マイクロソフトはこうした問題に対処するのが非常に遅い。私はCMEがデバイスのファームウェアをアップデートすることで、この問題を解決することを望んでいる。お願いします。

先方からの返信 3

他のBLE MIDIインターフェイスには、この問題はありませんか?
もしそうならパケットを比較しましたか?
あなたが見つけた違いは、WIDI BLEパケット内で使用されている実行ステータスですか?

送信メッセージ 4

他のBLE MIDIインターフェイスにはこの問題はありません。
また、私はほかの製品とパケットを比較しました。

>Is the difference you found is the running status used within WIDI BLE packets ?

はい。 これらのインターフェイスでは、パケット内のf8のあとにランニングステータスが来ることはありません。パケットは分割されている。または、ステータスバイトを付加している。

私が持っている以下のインターフェイスのログを添付します。
YAMAHA MD-BT01
Quicco Sound mi.1
Quicco Sound mi.1 II
(ログは割愛)

先方からの返信 4

見たところ、WIDI Masterが送信したパケットはBLE MIDI仕様に準拠しているため、ステータスが省略されたデータの受信中にWindows BLEドライバに問題がある。

MIDIberryの開発者に、彼のソフトウェアが着信したランニングステータスを処理できるかどうか尋ねましたか?

送信メッセージ 5

Windows BLEドライバがなんらかの問題を持っているのは私も同意する。

私がMIDIberryの作者です。マイクロソフトのドキュメントによれば、ソフトウェア開発者はランニングステータスを処理する必要はないとあります(ドライバがすべて展開するという意味と思われる https://docs.microsoft.com/ja-jp/windows/win32/multimedia/receiving-running-status-messages)。

私は開発者として未熟だが、Cakewalkでも同じ問題が起きている。Cakewalkが私のようなミスをすることはないと思うので、やはり問題はWindows BLEドライバだと思う。

先方からの返信 5、6

Windowsで問題があることが確実な場合は、ランニングステータスを有効/無効にする設定を追加できるが、BLE MIDI仕様に準拠するだけで十分だ。

インターネットで検索したが、Windowsのランニングステータスについて、興味深い結果はみつからなかった。

KORG MIDI BLEドライバーがネイティブのWindowsドライバより優れていると読んだ。コルグのドライバがコルグ以外の製品で使用できるかわかりますか?

送信メッセージ 6

ランニングステータス有効/無効設定を追加できることについて。
マイクロソフトが昨年Windows バージョン2004をアップデートした際に、一部のBLE-MIDIデバイスでペアリングができなくなった。問題が解決するまでに半年以上かかった。だから、私は彼らに期待することはできない。

できれば、私はCMEに問題を解決してほしい。そのsetting to enable/disableを加えることはすばらしいアイデアだと私は思う。

ぜひ、開発をお願いします。

以下意外な方向へ

この項目は、以降のメールのやりとりの概要。

このあと、CMEのCEOがMMAのMicrosoftの代表のPete Brown他1名に報告(メール内容を転送)。

Peteは「WinRT MIDIで実行ステータスがまったくサポートされていないことを確信しています。」と回答。

また、「WinRT MIDIのBLE MIDIコードにバグが見つかった場合、修正にはほぼ確実に時間がかかるため、スイッチを追加してオフにすることをおすすめします。」ともありました。

また、Peteには、「F8(クロック)が途中に挟まらなければ、ランニングステータスで問題が起きることはない。ランニングステータスが常に問題を起こすわけではないと思う」とも伝えました。

「私がテンポを落とすと、エラーの出る確率は格段に下がります。F8がほほかのメッセージといっしょに一つのパケットに入る確率が減るからだと思う。」とも加えました。

以上。記録終わり。

この後、CMEはWIDIシリーズにKORG BLE MIDIドライバへの対応を追加しました。

コメント