USB-MIDI (11)

システム・エクスクルーシブ・メッセージ (System Exclusive Message) はステータス・バイト 0xF0 に始まり 0xF7 (EOX: End Of eXclusive) に終わる、MIDI メッセージでは唯一の可変長のメッセージです。
USB-MIDI イベント・パケット内のペイロードは 3 バイト分しかないので、不定長のメッセージを 3 バイトごとに区切ってパケットに載せ、複数のパケットに分散してエンコードします。
そのための CIN (Code Index Number) として、開始端 / 中間パケットの印として CIN = 0x04 が、終端パケットの印として CIN = 0x05 〜 0x07 が割り当てられています。
そのエンコードの様子を表したのが下の図です。

青色の太線で囲った部分がパケットのペイロード部分の 3 バイトを示し、上に書いてある数字 1、2、3 はそれぞれ 1 バイト目、2 バイト目、3 バイト目を表します。
背景色が緑色の「セル」は、データとして有効なバイトであることを示し、背景色が白色のセルは MIDI メッセージのシーケンスの中に含まれないデータであることを示しています。
システム・エクスクルーシブ・メッセージは CIN = 0x04 のパケットから始まります。 開始パケットの第 1 バイトにはステータスバイトの 0xF0 がそのまま格納されます。
続くデータ・バイト部分をパケットのペイロードに詰めていき、3 バイト分が満たされると USB-MIDI イベント・パケットがひとつ完成したことになり、エンドポイント側に送り出します。
データ・バイトが続くかぎり、CIN = 0x04 を維持したまま同様に繰り返して、3 バイト分埋まるたびに完成したパケットを送りだします。
開始パケットと中間パケットで同一の CIN を使っていますが、パケットの受け取り側で両者を区別する必要がある場合には、ペイロードの第 1 バイトが 0xF0 かどうかを見れば判断できます。
システム・エクスクルーシブ・メッセージの終わりの印である EOX (0xF7) が到着した場合には、現在エンコード中のパケットの「看板」を「終端」であることを表す CIN = 0x05 〜 0x07 のいずれかに掛け替えます。
0xF7 の位置が第 1 バイトの場合に CIN = 0x05、第 2 バイトの場合に CIN = 0x06、第 3 バイトの場合に CIN = 0x07 とします。
まだ埋まっていないバイトがある場合には「0」で埋めてパケットを完成させエンドポイント側に送り出し、システム・エクスクルーシブのエンコードのモードから抜けます。
特殊なケースとして 0xF0 から 0xF7 までのシーケンス長が 2 バイトあるいは 3 バイトで、0xF0 と 0xF7 とが同じパケットにおさまる場合が考えられます。
この場合、システム・エクスクルーシブ・メッセージとしての実質的な意味はありません。
2 バイト長ではエクスクルーシブの「中身」が全くの「カラ」となりますし、3 バイト長でも中身は ID 番号しか指定できず、操作の内容を表現できません。
エンコード自体は下のように、2 バイト長の場合には CIN = 0x06、3 バイト長の場合には CIN = 0x07 の単独のパケットになります。

  • 2 バイト長 : 0x06 0xF0 0xF7 0x00
  • 3 バイト長 : 0x07 0xF0  XX  0xF7

CIN の表を下に再掲しますが、背景色がシアンの欄 (CIN = 0x04 〜 0x07) がシステム・エクスクルーシブ・メッセージに対するものです。
システム・エクスクルーシブ・メッセージ 1 バイト終端と、1 バイトのシステム・コモン・メッセージとで同一の CIN = 0x05 を共有していますが、エンド・オブ・エクスクルーシブ 0xF7 は分類上はシステム・コモン・メッセージに属しているので、1 バイトの 0xF7 を CIN = 0x05 でエンコードしても矛盾ではありません。

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シングル・バイト (システム・リアルタイム・メッセージ)