更新日:
確認環境: MIDIFabric 開発版、JUNO-D の定義 1.4.1。自動テストと、2026-09-27 の JUNO-D での範囲の要求の確認

Roland のシンセのメモリの一部を読むには、4 バイトのアドレスと 4 バイトのサイズを付けた RQ1 を送ります。JUNO-D では、Tone Part 1 の Partial LFO 2 は 02 00 32 00、サイズは 00 00 01 1E です。MIDI インプリメンテーションには、7 つのトーンパート、8 つのシーンパート、88 のドラムキーについて、こうしたブロックが並んでいます。しかもアドレスは 128 で繰り上がる 7 ビットの数です。手で打つのは遅く、間違えやすく、返ってきたメッセージも DT1 02 01 32 00 ... だけでは、調べるまで何のデータか分かりません。

そこで、MIDIFabric のデバイス定義にアドレスマップを加えました。機器のメモリの領域とブロックを、名前付きで並べた表です。MIDI Debugger はこれを使って名前をアドレスに変え、モニタはアドレスを名前に戻します。

マップの書き方

マップは領域の一覧です。各領域は先頭のアドレスとブロックの一覧を持ち、各ブロックはオフセットとサイズを持ちます。領域とブロックは、決まった間隔で繰り返すこともできます。JUNO-D の定義の一部です。

{
  "id": "tone", "name": "Temporary Tone Part", "address": "02 00 00 00",
  "repeat": { "count": 7, "stride": "01 00 00" },
  "blocks": [
    { "id": "lfo", "name": "Partial LFO", "offset": "00 30 00", "size": "00 00 01 1E",
      "repeat": { "count": 4, "stride": "00 02 00" } }
  ]
}

アドレス、オフセット、サイズは、Roland の資料と同じくバイトで書きます。MIDIFabric は内部で普通の数に直すので、02 00 30 00 に 00 02 00 を足すと、7 ビットの繰り上げを含めて 02 00 32 00 になります。

繰り返しは、入力できる名前になります。tone:1〜tone:7、lfo:1〜lfo:4、sequencer-data:1〜sequencer-data:8、ラベルを明示した場合は part:1〜part:7 と part:r です。表示名は「Temporary Tone Part 1」「Partial LFO 2」などになります。

JUNO-D のマップには、Roland の MIDI インプリメンテーションにない範囲が 2 つあります。トーンパート全体(tone:1 all、8,350 バイト)とシーン全体(scene all、41,856 バイト)です。2026-09-27 に JUNO-D がこれらの要求に応答したことを確かめてから加え、定義にもその注記を残しています。ドラムキーのインストのエンベロープのように、資料に全体のサイズが書かれていないブロックは、推測で埋めずに外しました。

名前で要求を入力する

MIDI Debugger では、メッセージ、領域、ブロックの順に入力します。

sysex data request 1 (rq1) tone:1 lfo:2

これは、アドレスとサイズを数で 2 0 50 0 0 0 1 30 と打ったのと同じバイト列になり、MIDIFabric が Roland のチェックサム(ここでは 2D)と F7 を付けます。ほかにも scene sequencer-data:8、scene part:r、tone:1 all、drum-kit partial-eq:108 のように入力できます。大文字と小文字は区別しません。

入力中は、補完の候補に名前とアドレス、サイズが並びます。

lfo:2    Partial LFO 2 · 02 00 32 00 (2 0 50 0) / size 00 00 01 1E (158 bytes)

最初は候補に長い名前を大きく表示していましたが、実際に入力するのは短い名前なので、短い名前を先に、長い名前を補足として表示するように変えました。

DT1 では、アドレスだけを展開し、データは自分で入力します。

sysex data set 1 (dt1) tone:1 common 74
→ F0 41 10 01 05 0A 12 02 00 00 00 4A 34 F7

マップに合わない入力は、送る前に拒否します。ブロックのない領域だけの指定(tone:1)、存在しないパート(tone:8 common)、範囲外のブロック番号(tone:1 lfo:5)、データのない DT1 などです。

名前で返事を読む

DT1 が届くと、モニタはその先頭のアドレスをマップで探し、領域とブロックを表示します。

JUNO-D: DT1 Temporary Tone Part 1 / Tone Common addr=02.00.00.00 (14 bytes)
JUNO-D: DT1 Temporary Scene / Scene Common +00 11 addr=01.00.00.11 (14 bytes)
JUNO-D: DT1 addr=04.00.00.00 (14 bytes)
  • アドレスがブロックの途中なら、名前の後にオフセットを表示します(+00 11)。
  • マップにないアドレスは、名前なしで表示します。
  • 送った RQ1 にも、同じように名前を付けます。

ブロックは重なることがあります。「Partial LFO 2」は「Tone All」の中にあります。MIDIFabric は、そのアドレスを含むブロックのうち一番小さいものを選び、大きさが同じなら定義の中で先にあるものを選びます。そのため、02 01 32 00 への返事は「Tone All」ではなく「Temporary Tone Part 2 / Partial LFO 2」と表示されます。

まだできないこと

  • マップはブロックの単位です。ブロックの中の個々のパラメータに名前を付けること、ダンプを値に展開すること、値を意味付きで表示することは、まだできません。
  • 照合に使うのは先頭のアドレスだけです。DT1 のデータが、照合したブロックに収まるかは確かめていません。
  • 名前での入力と表示は、自動テストで確かめています。実機の JUNO-D では上の範囲の要求を確認しましたが、Debugger から実機へ送る操作は、別の確認として記録していません。

MIDIFabric にとっての意味

同じデバイス定義を、モニタ、MIDI Debugger、そして今後のエディタが使います。アドレスマップを一度書けば、どの場所でも、要求は入力しやすく、返事は読みやすくなります。RQ1 と DT1 の構成とチェックサムは、「Roland の SysEx(RQ1 / DT1)の送り方と、チェックサムの計算方法は?」で説明しています。

← 開発ノートの一覧