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)
  • YAMAHA (XG システム・エクスクルーシブ)
    • XG システムオン
      (F0 43 10 4C 00 00 7E 00 F7)
    • XG ディスプレイ・レター
      (F0 43 10 4C 06 00 00 ... F7)
  • 独自
    • MA-2 音色データ・ロード
      (F0 43 00 03 08 nn 00 ... F7)

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 セント単位のステップサイズなので、テーブルを使って変換をしています。