PIC32MX220F032B USB MIDI ホスト (2)

自作の USB-MIDI コンバータ・デバイスを入力方向、つまり、

MIDI IN → USB MIDIバイス → USB ケーブル → USB ホスト

方向のデータの流れに対応させて USB MIDI ホスト・プログラムをテストしたところ、「バグ」というか、「仕様」というか、不具合が見つかり、修正しました。
修正版のプログラムは Yahoo! ボックス上に置いてあります。(→こちら)
問題点のひとつは、USB デバイスの「コンフィグ・ディスクリプタ」のサイズが 256 バイトを超えると正常に読み込めなくなり、無限ループにおちいることです。
その原因は USB MIDI ホスト・ライブラリ中でコンフィグ・ディスクリプタをスキャンする際に、1 バイト変数でインデクスしているためです。
純粋な MIDIバイスであれば、コンフィグ・ディスクリプタはそれほど大きくはならないので、1 バイト変数で十分だと考えてライブラリは設計されているのでしょう。
ここでは USB ライブラリ内の関数は修正せず、デバイス側でディスクリプタ・サイズを 256 バイト以下に制限します。
USB の MIDI ストリーミング・サブクラスは、オーディオ・クラスのサブクラスとして定義されており、自作の USB-MIDIバイスは、マイコンの USB オーディオ・インターフェースのサンプル・プログラムに乗っかる形で MIDI 機能を追加しています。
そのため、オーディオ + MIDI 入出力のためのコンフィグ・ディスクリプタのサイズは 267 バイトとなり、現状のホスト・プログラムでは正しく扱えません。
解決策としては、不要なオーディオ部分を削除するのがスジですが、ちょっと面倒なため、MIDI 入力と出力のどちらか一方だけを有効になるようにしています。
つまり、入力用の構成でコンパイルしたプログラムは入力側のテスト専用デバイス、出力用の構成でコンパイルしたブログラムは出力側のテスト専用デバイスとして機能させています。
もうひとつの不具合は、デバイス側から入力される MIDI メッセージは 3 バイト長であるとプログラムで決め打ちしていることです。
ノート ON (0x9n) / ノート OFF (0x8n) / コントロール・チェンジ (0xBn) などは 3 バイト長のメッセージなので、純粋なキーボード・コントローラでノート ON / OFF ぐらいしか出力しない場合には問題ありません。
2 バイト長以下のメッセージの場合には、本来のメッセージの後に余計な「ゼロ」が出力されます。
たとえば、プログラム・チェンジ (0xCn) は 2 バイト長なので余計な 1 バイトの「ゼロ」が出力され、これが受信側のデバイスでは「ランニング・ステータス」となり、「ゼロ番」の音色「Grand Piano」を選択するものと見なされてしまいます。
その結果、どの音色番号を選んでも「グランド・ピアノ」以外の音色に切り替わらないことになります。
さらに、システム・エクスクルシーブ・メッセージの中間部では正しくないデータと誤認され、データが破棄されてしまいます。