EternalWindows
MIDI / SysExイベント

SysExイベントは、システムエクスクルーシブメッセージを格納するイベントです。 システムエクスクルーシブメッセージは、個々の楽器メーカーが独自に作成したメッセージであり、 主に音源(MIDIデバイス)に対して何らかの設定をする場合に利用されます。 たとえば、1つのMIDIイベントならば1つのチャンネルに対してしか音量を変更できませんが、 システムエクスクルーシブメッセージならば音源の音量を変更できます。 この結果、全てのチャンネルの音量も変更されることになります、 システムエクスクルーシブメッセージは、SysExイベントとして次のように格納されています。

データ内容 バイト数 データ値
ステータスバイト 1byte 0xF0
データ長 1byte n
データ nbyte ...

SysExイベントのステータスバイトは、0xF0となります。 その後の1バイトにはデータの長さが格納され、 その後にシステムエクスクルーシブメッセージのデータが格納されています。 実際にデバイスに送信する場合は、このデータの先頭に0xF0を加えて送信することになります。 SysExイベントを取得するコードは、次のようになっています。

case 0xF0:
	if (lpEvent->state == 0xF0) { // SysExイベント
		mmioRead(hmmio, (HPSTR)&lpEvent->nData, sizeof(BYTE));

		lpEvent->lpData = (LPBYTE)Alloc(lpEvent->nData + 1); // 先頭の0xF0を含める
		lpEvent->lpData[0] = lpEvent->state; // 可変長データの先頭は0xF0
		mmioRead(hmmio, (HPSTR)(lpEvent->lpData + 1), lpEvent->nData);

		lpEvent->nData++;
	}

まず、イベントがSysExイベントであるかを特定するため、 ステータスバイトが0xF0であるかを確認します。 続いて、データ長を取得し、そのサイズに+1したメモリを確保します。 これは、データの先頭に0xF0を設定するためです。 データを取得するmmioReadでは、既に設定済みの0xF0を上書きしないように、 lpEvent->lpData + 1からデータを取得します。

システムエクスクルーシブメッセージのいくつかのバイトは、特定の意味を持っています。 たとえば、最後のバイトに0xF7を設定し、データの終了を明示する場合があります。 また、先頭に設定した0xF0の後に存在する1バイトは、メーカーIDと呼ばれています。 この値が0x7Dから0x7Fである場合、そのメッセージはユニバーサルエクスクルーシブメッセージと呼ばれます。


戻る