更新日:
確認環境: Roland JUNO-D(MIDI インプリメンテーション、2026-09-27 に実機で要求を確認)

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 / F7SysEx の始まりと終わり
41Roland のメーカー ID
devデバイス ID。10H〜1FH(仕様の例は 10H で、機器ではデバイス ID 17 と表示)、または 7FH
01 05 0AJUNO-D のモデル ID
11 / 12RQ1 / 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 を名前で送り、名前で読む」で紹介しています。

← 開発ノートの一覧