Internal protocol
OSC 1.0 over UDP between the Linux frontend and the voice controller, on an internal link that is not reachable from the LAN.
Ports
| UDP port | Listener | Traffic |
|---|---|---|
| 7770 | Voice controller | Parameter tree. Mostly /x ,b binary records; also plain addresses such as /info/*, /hw/*, and a 1 Hz temperature poll. |
| 7771 | Voice controller | Performance. MIDI-in-OSC from the sequencer/arp, plus per-timbre mod wheel and XYZ. |
| 7772 | Frontend | Note echo from the controller. |
| 9100, 9876 | Voice controller | Panel plane, binary, high rate. Undecoded. |
| 9500, 9501, 9600 | Frontend | Panel state and system clock. 20-byte non-OSC clock packets among them. |
There is no handshake, cookie or session on 7770/7771. The controller accepts a datagram from any source port on the internal link and replies to the sender.
MIDI-in-OSC (7771)
The address selects a router; the arguments are the raw MIDI bytes as three int32s.
/r/midi ,iii <status> <data1> <data2>
/r/midi ,iii 145 60 100 note-on ch 2 note 60 vel 100
/r/midi ,iii 129 60 0 note-off ch 2
/r/midi ,iii 225 0 96 pitch bend ch 2 (LSB, MSB)
/r/midi ,iii 209 80 0 channel pressure ch 2
| Address | Meaning |
|---|---|
/r/midi, /r/midi-all | Direct MIDI in |
/r/midi-force, /r/midi-force-all | Ignore local/zone gating |
/r/sq/0/midi, /r/sq/0/midi-arp | Sequencer / arp slot 0. This is what the frontend's arp actually emits. |
/g/<t>/midi, /g/<t>/midi-arp | Per-timbre variants, t = 0..2 |
/r/g/<t>/m/w, /r/g/<t>/m/xyz | Per-timbre mod wheel and XYZ pad |
Physical MIDI inputs do not use this port; they terminate on the controller. See signal flow.
Note echo (7772)
/ ,iifi <tag=4> <note> <velocity/127> <index>
Velocity is a float (100 → 0.787402). Note-off is reported as velocity -0.0.
index counts up as notes stack and returns to 0 on release.
Binary parameter records: /x ,b (7770)
The readable /p/... and /g/... trees are aliases. What the frontend
actually streams is one blob of packed little-endian records per datagram.
record := type:u8 id:u16le pad:u8 [value:4 bytes]
type 'f' 0x66 float32
'i' 0x69 int32
's' 0x73 string, inline, length-padded
'T' 0x54 true (no value)
'F' 0x46 false (no value)
'[' 0x5b / ']' 0x5d array open / close
66 9c 03 00 00 00 00 3f float id 0x039c = 0.5
54 76 00 00 bool id 0x0076 = true
The id encodes the timbre: id = base + 3840 × timbre, timbre 0..2. A blob holds
as many records as fit; the frontend never exceeds 1444 bytes of blob (1456-byte datagram), which
stays under the link MTU.
A full id table (265 base parameters with types, ranges and panel names) will be published with the editor.
Reply semantics on 7770
| Reply | Meaning |
|---|---|
| Typed value | Address exists and is readable |
,ss "404" "Not found" | No such address |
,ss "503" "Unavailable" | Exists, not available in the current mode. All of /v/* and /vx/<n>/* answer this in normal operation. |
| Echo of the datagram | Anything under /g/. This subtree is a wildcard sink: nonsense addresses echo too, so an echo proves nothing. |
/mode with an unknown string, then restoring
it, hung the controller and with it the network path into the box. Do not write to an address
whose effect you cannot verify.
Controller to voice card
Each card hosts two voices addressed /v1 and /v2; global voice
v lives on card v / 2, slot 1 + v mod 2.
| Address | Scope | Sent by stock controller | Meaning |
|---|---|---|---|
/vN/n | voice | yes | Note on |
/vN/nw | voice | yes | Gate off |
/vN/p | voice | yes | Pitch. Coupled to note state; not safe to re-send mid-note. |
/m/pw, /m/a, /m/xyz | timbre | yes | Pitch wheel, aftertouch, pad |
/vN/m/pw ,f | voice | no | Pitch wheel, normalised [−1, 1). The card applies the timbre's bend range. |
/vN/m/a | voice | no | Aftertouch |
/vN/m/pady | voice | no | Pad Y |
The last three are parsed by the stock voice cards and are what per-voice MPE is built on.