FM音源プログラム (29) -- MIDI デコーダ(3)
システム・エクスクルーシブのデコード
mididec() 関数の中で、エンド・オブ・エクスクルーシブ (EOX: 0xF7) によってシステム・エクスクルーシブ・メッセージの終結を認識すると、「sysxdec.c」ファイル中で定義されている sysx_dec() 関数を呼び出し、さらにデコードを続けます。
現在サポートしているエクスクルーシブは、次の通りです。
- MIDI 標準
ノンリアルタイム・ユニバーサル・システム・エクスクルーシブ- GM システムオン (F0 7E 7F 09 01 F7)
- GM2 システムオン (F0 7E 7E 09 03 F7)
- スケール/オクターブ・チューニング (1 バイト形式)
(F0 7E 7F 08 08 ff gg hh [ss] ... F7)
- MIDI 標準
リアルタイム・ユニバーサル・システム・エクスクルーシブ- マスター・ボリューム (F0 7F 7F 04 01 00 vv F7)
- マスター・ファイン・チューニング
(7F 7F 04 03 ll mm F7) - マスター・コース・チューニング
(7F 7F 04 04 00 mm F7) - スケール/オクターブ・チューニング (1 バイト形式)
(F0 7F 7F 08 08 ff gg hh [ss] ... F7)
- Roland (GS システム・エクスクルーシブ)
- GS システムオン
(F0 41 10 42 12 40 00 7F 00 41 F7)
- GS システムオン
- YAMAHA (XG システム・エクスクルーシブ)
- 独自
- MA-2 音色データ・ロード
(F0 43 00 03 08 nn 00 ... F7)
- MA-2 音色データ・ロード
sysx_dec() 関数では、まず、「Show Exclusive」モードの場合はエクスクルーシブ・データ・バッファ sysx_buf[] の中身を LCD バッファに書き込みます。
次に、マニュファクチャラ ID を調べ、
- MIDI 標準
ノンリアルタイム・ユニバーサル・システム・エクスクルーシブ - MIDI 標準
リアルタイム・ユニバーサル・システム・エクスクルーシブ - Roland (GS システム・エクスクルーシブ)
- YAMAHA (XG システム・エクスクルーシブ)
を区別し、それぞれをデコードする関数を呼び出します。
MA-2 音色データ・ロードは YAMAHA のエクスクルーシブの1種として (勝手に) 定義しています。
SMAF ファイルの Setup Data Chunk 中の MA-2 音色データのエクスクルーシブは、
FF F0 12 43 03 ... F7
というフォーマットになっているようです。
最初の「FF F0」は SMAF でエクスクルーシブの開始を表すコードで、最後の「F7」は終了を表すコードです。
「12」は、それ以降のバイト数で、「43」は YAMAHA のメーカー ID、「03」はフォーマット ID です。
「...」の部分は 15 バイトの音色データです。
これにならって、独自フォーマットとして、
F0 43 00 03 08 nn 00 ... F7
を MA-2 音色データ・ロードのエクスクルーシブとしました。 「nn」はチャンネル番号です。
SMAF のエクスクルーシブは 8 ビットフルに使えるフォーマットですが、MIDI のエクスクルーシブでは 7 ビットデータしか許されません。
そこで、単純に、元の 1 バイトデータを上位 4 ビットと下位 4 ビットに分解して、2 バイトデータとしています。
音色データは、現在使用中の ROM 上の音色データが展開されている RAM 上のワークエリアに上書きされます。
音色データとして保存されるわけではないので、別の音色を選ぶと ROM 上のデータによって、書き換えられ、どこにも残りません。
GM/GM2/GS/XG システムオンは、それぞれをデコードしますが、すべて同じリセット処理を行います。 もちろん、GS 音源の機能になったり、XG 音源の機能になったりするわけではありません。
スケール/オクターブ・チューニングは、ノンリアルタイム/リアルタイム両方とも同じ処理をしています。
チューニングの指定は 1 セント単位で -64 セント 〜 +63 セントの指定ですが、FM音源プログラムでは半音を 128 分割、つまり、100/128 セント単位のステップサイズなので、テーブルを使って変換をしています。