Updated:
Tested on: MIDIFabric development build, JUNO-D definition 1.4.1; automated tests, and range requests checked on a JUNO-D on 2026-09-27

To read a part of a Roland synth’s memory, you send an RQ1 with a 4-byte address and a 4-byte size. To the JUNO-D, Partial LFO 2 of Tone Part 1 is 02 00 32 00, and its size is 00 00 01 1E. The MIDI Implementation lists these blocks for 7 tone parts, 8 scene parts and 88 drum keys, and the addresses are 7-bit numbers that carry at 128. Typing them by hand is slow and error-prone, and a reply that is just DT1 02 01 32 00 ... tells you nothing until you look it up.

So we gave MIDIFabric’s device definitions an address map: a table of the device’s memory areas and blocks, with names. The MIDI Debugger uses it to turn names into addresses, and the monitor uses it to turn addresses back into names.

Writing the map

A map is a list of areas. Each area has a start address and a list of blocks, each with an offset and a size. Areas and blocks can repeat with a fixed stride. This is part of the JUNO-D definition:

{
  "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" } }
  ]
}

Addresses, offsets and sizes are written as bytes, the same way as in Roland’s documents. MIDIFabric turns them into ordinary numbers internally, so adding 00 02 00 to 02 00 30 00 gives 02 00 32 00 with the 7-bit carry handled for you.

Repeats become names you can type: tone:1 to tone:7, lfo:1 to lfo:4, sequencer-data:1 to sequencer-data:8, and part:1 to part:7 plus part:r when the labels are given explicitly. The display names become “Temporary Tone Part 1”, “Partial LFO 2”, and so on.

The JUNO-D map also has two ranges that are not in Roland’s MIDI Implementation: the whole of a tone part (tone:1 all, 8,350 bytes) and the whole scene (scene all, 41,856 bytes). We added them only after a JUNO-D answered those requests on 2026-09-27, and the definition records that note. Blocks whose total size the document does not give, such as the drum kit’s instrument envelopes, are left out rather than guessed.

Typing a request by name

In the MIDI Debugger you type the message, then the area, then the block:

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

This produces the same bytes as typing the address and size as numbers, 2 0 50 0 0 0 1 30, and MIDIFabric adds the Roland checksum (2D here) and F7. Other examples: scene sequencer-data:8, scene part:r, tone:1 all, drum-kit partial-eq:108. Names are not case-sensitive.

While you type, completion shows each candidate’s name together with its address and size, for example:

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

At first the completion list showed the long names, but what you type is the short token, so we changed the list to show the token first and the name as detail.

For DT1, only the address is expanded, and you type the data yourself:

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

Input that does not match the map is rejected before anything is sent: an area without a block (tone:1), a part that does not exist (tone:8 common), a block number out of range (tone:1 lfo:5), or a DT1 without data.

Reading a reply by name

When a DT1 arrives, the monitor looks up its start address in the map and shows the area and block:

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)
  • If the address falls inside a block, the offset is shown after the name (+00 11).
  • An address that is not in the map is shown without a name.
  • RQ1 messages you send are named the same way.

Blocks can overlap: “Partial LFO 2” lies inside “Tone All”. MIDIFabric picks the smallest block that contains the address, and when two are the same size, the one that comes first in the definition. So a reply at 02 01 32 00 reads “Temporary Tone Part 2 / Partial LFO 2”, not “Tone All”.

What this does not do yet

  • The map works at the level of blocks. It does not yet name the individual parameters inside a block, expand a dump into values, or show values with their meanings.
  • The match uses only the start address. It does not check whether the DT1 data fits in the block it was matched to.
  • The named input and display are covered by automated tests. On the real JUNO-D we have confirmed the range requests above; sending from the Debugger to the device has not been recorded as a separate check.

Why this matters for MIDIFabric

The same device definition is used by the monitor, the MIDI Debugger and, later, editors. Adding an address map once makes requests easier to type and replies easier to read in every place. The checksum and the layout of RQ1 and DT1 are explained in How do you send Roland SysEx (RQ1 / DT1)?.

← All notes