JUNO-D のデバイス定義を作るとき、Roland の MIDI インプリメンテーションを読みながら RQ1 を組み立て、実機に送って返事を確かめました。
Roland のシンセは、パラメータの読み書きに 2 つのシステムエクスクルーシブを使います。RQ1(コマンド 11H)は、指定したアドレスから指定したサイズのデータを送るよう機器に求めます。DT1(コマンド 12H)は、アドレスへデータを書き込みます。機器が返すデータも DT1 です。どちらも最後にチェックサムが付きます。アドレスのバイトとサイズ(またはデータ)のバイトを合計し、その合計を 128 の倍数にする数がチェックサムです。つまり 128 −(合計を 128 で割った余り) で、余りが 0 のときは 0 です。
メッセージの構成
JUNO-D(JUNO-D6 / D7 / D8)を例にします。
RQ1: F0 41 dev 01 05 0A 11 aa bb cc dd ss tt uu vv sum F7
DT1: F0 41 dev 01 05 0A 12 aa bb cc dd データ ... sum F7
| 部分 | 意味 |
|---|---|
F0 / F7 | SysEx の始まりと終わり |
41 | Roland のメーカー ID |
dev | デバイス ID。10H〜1FH(仕様の例は 10H で、機器ではデバイス ID 17 と表示)、または 7FH |
01 05 0A | JUNO-D のモデル ID |
11 / 12 | RQ1 / DT1 |
aa bb cc dd | アドレス(4 バイト) |
ss tt uu vv | 要求するデータのサイズ(4 バイト、RQ1 のみ) |
sum | チェックサム |
機器の Rx Exclusive の設定がオフだと、どちらのメッセージも無視されます。
チェックサムの計算
アドレスのバイトと、データのバイト(RQ1 ではサイズのバイト)を合計します。合計を 128 で割った余りを求め、128 からその余りを引いた値がチェックサムです。余りが 0 なら、チェックサムは 0 です。
例 1: シーンのレベルを 74 にする(DT1)。 Roland の MIDI インプリメンテーションにある例です。
- アドレス
01 00 00 11、データ4A(74)。 - 合計: 01 + 00 + 00 + 11 + 4A = 1 + 0 + 0 + 17 + 74 = 92。
- 92 を 128 で割った余りは 92 なので、チェックサムは 128 − 92 = 36 =
24H。
F0 41 10 01 05 0A 12 01 00 00 11 4A 24 F7
例 2: Tone Part 1 全体を要求する(RQ1)。
- アドレス
02 00 00 00、サイズ00 00 41 1E。 - 合計: 2 + 0 + 0 + 0 + 0 + 0 + 65 + 30 = 97 なので、チェックサムは 128 − 97 = 31 =
1FH。
F0 41 10 01 05 0A 11 02 00 00 00 00 00 41 1E 1F F7
受け取ったメッセージを確かめるときは、アドレス、データ、チェックサムのバイトを合計します。合計の下位 7 ビットが 0 なら正しいメッセージです。
アドレスとサイズは 7 ビットの数
アドレスやサイズの 1 バイトは、7 ビット(0〜127)しか使いません。128 進数の桁として読みます。aa bb = aa × 128 + bb です。上のサイズ 00 00 41 1E は、65 × 128 + 30 = 8,350 バイトになります。
アドレスにオフセットを足すときは、256 ではなく 128 で繰り上げます。たとえば JUNO-D の Scene Sequencer Data 8 は、00 47 00 + 7 × 00 20 00 から始まります。中央のバイトは 0x47 + 0xE0 = 295 = 2 × 128 + 39 になるので、シーンの領域の中で 01 02 27 00 になります。繰り上げを間違えると、機器が黙って要求を無視する原因になります。
JUNO-D で分かったこと
- Roland の MIDI インプリメンテーションには、アドレスマップに載っている決まった先頭アドレスとサイズでデータを要求するよう書かれています。
- 2026-09-27 に、JUNO-D がそれより大きな範囲の要求にも応答することを確認しました。Tone Part 1 全体(上の例 2。ブロックの間の未使用の部分を含めて 8,350 バイト)と、シーン全体(
01 00 00 00、サイズ00 02 47 00= 41,856 バイト)です。 - これは仕様の外の動作で、確認したのは JUNO-D だけです。ほかの機種は応答しないかもしれません。
大きなデータは、複数のメッセージで届く
JUNO-D の MIDI インプリメンテーションでは、256 バイトを超える DT1 のデータは 256 バイト以下に分け、20 ms 以上の間隔をあけて送ることになっています。JUNO-D 自身も、大きなデータを同じように送ります。大きな範囲を要求したら、返事は複数の DT1 で届くと考えてください。大きなデータを送るときは、送信の間に 20 ms 以上あけます。
MIDIFabric について
MIDIFabricの MIDI Debugger で RQ1 や DT1 を送ると、Roland のチェックサムを自動で付けます。JUNO-D のアドレスは、バイトではなく名前で入力できます。その仕組みは「JUNO-D の SysEx を名前で送り、名前で読む」で紹介しています。