USB-MIDI (10)

MIDI ケーブルの中を流れる MIDI データは、「バイト・オリエンテッド」なビット・レート 31.25 kbps、データビット数 8、パリティなし、1 ストップビットの調歩同期形式です。
一方、USB を介してやりとりされる MIDI データの形式は「バイト・オリエンテッド」ではなく、下の図のような 4 バイト (32 ビット) の固定長の「USB-MIDI イベント・パケット」にエンコードされます。

不定MIDI メッセージである「システム・エクスクルーシブ・メッセージ」を除き、他の 1 〜 3 バイトの固定長 MIDI メッセージは、ステータス・バイトが省略されることなく「完全」な形のメッセージとしてパケットのペイロード部分 (バイト 1 〜 バイト 3) に格納されます。
「USB-MIDI イベント・パケット」の最初のバイト (バイト 0) は、そのパケットに含まれる MIDI メッセージの性質を表すものとなっています。
その上位ニブル (上位 4 ビット) は「ケーブル・ナンバー」(CN: Cable Number) で、「USB エンドポイント」から「埋め込み (Embedded) MIDI ジャック」へ張る「仮想 (virtual) MIDI ケーブル」番号を表すものです。
エンドポイントには複数の埋め込み MIDI ジャックを関連付けることができ、関連付けリストの 1 番目に現れる埋め込み MIDI ジャックとエンドポイントとの間で転送されるパケットには CN = 0 を付加して区別します。
もし、関連付ける埋め込み MIDI ジャックがひとつしかないなら、エンドポイントとの間で転送されるパケットは、すべて CN = 0 になります。
同様に、関連付けリストの 2 番目の埋め込み MIDI ジャックとの間で転送されるパケットには CN = 1 を付加します。
ひとつのエンドポイントには 16 個までの埋め込み MIDI ジャックを関連付けることができ、その場合、ケーブル・ナンバー・フィールドは CN = 0x00 から CN = 0x0F までの 16 通りのバリエーションを持つことになります。
ホスト PC 側では、ひとつのエンドポイントとの間で転送するパケットにケーブル・ナンバーを付加して区別するだけで、実際に別々の外部 MIDI IN / 外部 MIDI OUT 端子に振り分けるのは USB-MIDI ファームウェアの責任です。
バイト 0 の下位ニブル (下位 4 ビット) はコード・インデクス・ナンバー (CIN: Code Index Number) で、バイト 1 以降に格納される MIDI メッセージの種別を表します。
下にその対応表を示します。

CINMIDI_x
サイズ
説明
0x001, 2, 3種々の用途のために予約
0x011, 2, 3ケーブル・イベントのために予約
0x0222 バイト・システムコモン・メッセージ
(MTC、ソングセレクト)
0x0333 バイト・システムコモン・メッセージ (SPP)
0x043システム・エクスクルーシブ始端 / 中間
0x0511 バイト・システムコモン・メッセージ
システム・エクスクルーシブ終端 (1 バイト)
0x062システム・エクスクルーシブ終端 (2 バイト)
0x073システム・エクスクルーシブ終端 (3 バイト)
0x083ノート OFF
0x093ノート ON
0x0A3ポリフォニック・キー・プレッシャ
0x0B3コントロール・チェンジ
0x0C2プログラム・チェンジ
0x0D2チャネル・プレッシャ
0x0E3ピッチベンド・チェンジ
0x0F1シングル・バイト (システム・リアルタイム・メッセージ)

背景色が「灰色」の欄 (CIN = 0x00 〜 0x01) は現在未定義で使用されていません。
背景色が「白色」の欄 (CIN = 0x08 〜 0x0E) はステータス・バイト 0x8n の「ノート OFF」からステータス・バイト 0xEn の「ピッチ・ベンド・チェンジ」までの「チャンネル・メッセージ」で、2 〜 3 バイトのシーケンスからなる (ステータス・バイトを省略しない) 完全なメッセージをパケットのバイト 1 〜 バイト 3 に格納します。 CIN の値は、ステータス・バイトの上位ニブル (上位 4 ビット) の値そのものになっています。
ステータス・バイト 0xFn の「システム・メッセージ」に対応する CIN の値は 0x0F (背景色が黄色の欄) ですが、これは「シングル・バイト」用として、ステータス・バイト 0xF8 〜 0xFF の「システム・リアルタイム・メッセージ」専用に確保されています。
他の「システム・コモン・メッセージ」および「システム・エクスクルーシブ・メッセージ」用には別の範囲の CIN = 0x02 〜 0x07 が割り当てられています。
ステータス・バイト 0xF8 〜 0xFF の「システム・リアルタイム・メッセージ」は 1 バイトのメッセージで、他のメッセージのシーケンスの途中でも、どこにでも現れることができます。
USB-MIDI イペント・パケットでもシステム・リアルタイム・メッセージは特別扱いで、パケットのエンコード時に、現在組み立て中の MIDI メッセージの途中でシステム・リアルタイム・メッセージが現れると、エンコードは一時中断し、CIN = 0x0F のシステム・リアルタイム・メッセージのパケットを作成し、先に送り出します。
このような「エスケープ」あるいは「割り込み」処理が行われるので、システム・リアルタイム・メッセージと他のメッセージ・シーケンスとは互いに別々のパケットにエンコードされ、ひとつのパケットの途中にシステム・リアルタイム・メッセージがはさまった形のままエンコードされることはありません。
背景色が「緑色」の欄 (CIN = 0x02 〜 0x03) は「システム・コモン・メッセージ」のために割り当てられています。
CIN = 0x02 は 2 バイト・シーケンス (0xF1: MTC クォーターフレーム、0xF3: ソング・セレクト)、CIN = 0x03 は 3 バイト・シーケンス (0xF2: ソング・ポジション・ポインタ) を表します。
1 バイトのシステム・コモン・メッセージに対しては、CIN = 0x05 をシステム・エクスクルーシブ・メッセージと共用します。
残りの「システム・エクスクルーシブ・メッセージ」については次回説明します。