ムライボックス (15) --- ソフトウェア (7)

PIC 版のソフトウェアでは 8 ビット幅に削減していますが、本来のビットマスク・テーブルは 1 エントリあたり 16 ビット幅のデータを 16 エントリ持つ配列として構成されています。
このデータ量 (32 バイト) を一度に転送できるシステム・エクスクルーシブ・メッセージとしては、XG にも GS にもある、 16 ドット × 16 ドットのビットマップ・イメージを音源パネルのグラフィクス表示部に表示させるメッセージを (本来の目的外ですが) 利用することができます。
ビットマップ・イメージは音源本体のパネルに数秒間表示されるだけで、本来の「音」には何も影響を及ぼしません。
メッセージ長は XG で 56 バイト、GS で 74 バイトとなっており、メッセージ長の短い XG を使うことにしました。
XG 音源はグラフィック・ディスプレイ部を持つ MU90 を所持していますが、GS 音源はグラフィック・ディスプレイ部を持たない SC-D70 しか所持していないことも理由のひとつです。
XG 音源である MU90 の本体パネル部分の写真を下に示します。

液晶表示部の下半分の中央やや左の部分に 16 × 16 ドットのグラフィック表示部があります。

拡大したものを左に示します。
通常の状態では、プログラム・チェンジにより選択されたプログラム番号の楽器のシンボルのアイコンが表示されています。 左の例ではプログラム番号 1 の「グランドピアノ」が表示されています。
アスペクト比」は 1:1 ではなく、横長のピクセルになっています。
表示領域の上側中央やや右に下向きの逆三角のマークがありますが、これはグラフィック・ディスプレイの一部ではなく、下側のベゼルに記されている「BANK/PGM#」の「PGM#」が本体のボタンで変更可能なパラメタとして選ばれていることを示しています。

下に簡単なパターンを表示させてみた例を示します。



このグラフィック表示のための XG エクスクルーシブ・メッセージは「Display Bitmap Data」と呼ばれ、 XG パラメタ・チェンジのクラスに属するメッセージとなっています。
その先頭部分は、

  0xf0 :  Start Of System Exclusive
  0x43 :  YAMAHA ID
  0x1n :  n = Device Number
  0x4c :  XG Model Number
  0x07 :  Address High
    vh :  Address Mid (vertical/horizontal)
  0x00 :  Address Low

となっています。 この後に 48 バイトのデータ・バイトが続き、最後は「End Of Exclusive」の 0xf7 でメッセージ終了となります。
以降、簡単のため「XG Display Bitmap Data システム・エクスクルーシブ」のことを単に「sysx」と呼ぶことにします。
sysx の 3 バイト目の 0x1n の「n」は「デバイス番号」で、通常の表記でデバイス 1 〜 16、sysx 中の数値としては下位 4 ビットが 0x0 〜 0xf の 16 種類となります。
ここで指定されている番号と一致するデバイスだけが反応する決まりになっています。
通常、デバイス番号は「1」になっていることが多いので、邪魔をしないようにムライボックスとしてはデバイス番号 16 として振る舞い、sysx の 3 バイト目が 0x1f の場合だけ実行するようにしました。
XG 音源 MU90 の場合には、デバイス番号は 1 〜 16 および全てのデバイス番号に応答する「ALL」があります。
XG モード」の場合には、もちろんデバイス番号の選択は正しく機能しますが、「TG300B モード」(GS モード) の場合にはデバイス番号を「ALL」に選ばないと GS のシステム・エクスクルーシブを受け付けない状態となるようです。
そのためなのか、音源のデフォルトではデバイス番号は「ALL」が選ばれた状態となっています。
sysx 5 バイト目 (Address High) の「0x07」が Display Bitmap Data 機能の指定になっています。
sysx 6 バイト目 (Address Mid) の「vh」はビットマップの拡張位置を示します。 「v」は垂直方向の位置で値は 0 〜 7、「h」は水平方向の位置で値は 0 〜 15 です。
16 × 16 ドットのビットマップを水平方向に 16 個連結可能で、垂直方向は 8 個連結可能なので、最大縦 128 ドット × 横 256 ドットのビットマップまで拡張可能です。
本体パネルのグラフィック表示部は vh = 0x00 に相当します。 それ以外の拡張部分は本体には表示されません。
このバイトを 3 種あるリマップ/ビットマスク・テーブルの指定に使っています。
48 バイトのデータ・バイト部の割り付けは下の図のようになっています。

赤色の小さな「箱」はビットマップのピクセルひとつを示し、中に書いてある数字は左端を「15」、右端を「0」とするビット番号を示しています。
ビットマップの箱の上に書いてある「b6」などの表記は、エクスクルーシブ・メッセージのデータバイトでのビット位置を示しています。
データバイトなので、b7 は常に「ゼロ」であり、それ以外の 7 ビットについて示してあります。
ひとつのデータバイトには 7 ビット分の情報しか載せられないので、16 ビット幅のイメージを

    7:7:2

のビット幅で分割し、計 3 個のデータバイトに割り当てます。
左端の 7 ビット・データを第 1 ラインから第 16 ラインまで順に、Data0 〜 Data15 として並べます。
次に、中央の 7 ビット・データを第 1 ラインから第 16 ラインまで順に、Data16 〜 Data31 として並べます。
最後に、右端の 2 ビット・データを第 1 ラインから第 16 ラインまで順に、Data32 〜 Data47 として並べ、計 48 バイトのデータの完成です。
GS のエクスクルーシブ・メッセージでは、16 ビット幅のビットマップを

    5:5:5:1

のように 4 バイトに分割しているので、データバイト部が計 64 バイトとなり、それがメッセージが長くなる原因です。