USB-MIDI (7)


MIDIStraming 要素の MIDI ジャックや「エレメント」のトポロジーは、実際にはクラス固有ディスクリプタで表現されます。
MIDIStreaming の場合 (AudioStreaming なし) のコンフィギュレーションディスクリプタ(群) の構成図を左に示します。
先頭に「Std.」と付いているのは「標準」(クラス固有でない) のディスクリプタで、「CS」と付いているのはクラス固有 (Class-Specific) のディスクリプタです。
「標準」と「クラス固有」のディスクリプタは左の図のように「インターリーブ」された形で記述します。
「標準」ディスクリプタの直後に「クラス固有」ディスクリプタを置いて、そのインターフェース / エンドポイントに対するクラス固有の情報を補足します。
したがって、勝手な位置には置けません。


本来のコンフィギュレーションディスクリプタは一番上のひとうだけですが、デフォルト・パイプ (エンドポイント 0) のコントロール転送の「Get Descriptor」リクエストでコンフィギュレーションディスクリプタを取得する際には、上の図のようにエンドポイント・ディスクリプタまで一括で読み込みます。
ディスクリプタの先頭バイトにはディスクリプタ・サイズが格納されていて、ホスト側のソフトウェアでは逐次的にひとつひとつのディスクリプタを弁別しながら「パース」することができます。
それとは別に、複数のディスクリプタの合計のサイズを「ワード」(2 バイト整数) で記述するフィールドが3 箇所あります。
コンフィギュレーションディスクリプタ内の「wTotalLength」には、全ディスクリプタ・サイズを記述しておきます。
エニュメレーション過程では、ホスト側がこの値を読み取って、全ディスクリプタを読み込めるサイズのデータ領域を準備します。
クラス固有 AudioControl インターフェース・ディスクリプタでは、コントロールされる要素が何もない場合にはヘッダ部分しか存在せず、固定値の「9」を wTotalLength フィールドに書いておけばすみます。
クラス固有 MIDIStreaming インターフェース・ディスクリプタでは、含まれる MIDI ジャックやエレメントの数により、wTotalLength の値は変わります。
ここで、規格書 ("Universal Serial Bus Deveice Class Definition for MIDI Devices Release 1.0") の本文の記述では、エンドポイント・ディスクリプタ部分を含むと解釈できる文言はありませんが、付録 B のディスクリプタ例の wTotalLength フィールドの値は、後続するエンドポイント・ディスクリプタ部分のサイズを含むものとなっています。
ここでは本文にしたがって、エンドポイント部分は含まないものとして表現してあります。
ディスクリプタの説明は長くなるので、次回にまわします。