one-synthesizer

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 portListenerTraffic
7770Voice controllerParameter tree. Mostly /x ,b binary records; also plain addresses such as /info/*, /hw/*, and a 1 Hz temperature poll.
7771Voice controllerPerformance. MIDI-in-OSC from the sequencer/arp, plus per-timbre mod wheel and XYZ.
7772FrontendNote echo from the controller.
9100, 9876Voice controllerPanel plane, binary, high rate. Undecoded.
9500, 9501, 9600FrontendPanel 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
AddressMeaning
/r/midi, /r/midi-allDirect MIDI in
/r/midi-force, /r/midi-force-allIgnore local/zone gating
/r/sq/0/midi, /r/sq/0/midi-arpSequencer / arp slot 0. This is what the frontend's arp actually emits.
/g/<t>/midi, /g/<t>/midi-arpPer-timbre variants, t = 0..2
/r/g/<t>/m/w, /r/g/<t>/m/xyzPer-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

ReplyMeaning
Typed valueAddress 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 datagramAnything under /g/. This subtree is a wildcard sink: nonsense addresses echo too, so an echo proves nothing.
There is no read verb. A bare address is a query; any argument is a write, even one intended as a placeholder. Sending /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.

AddressScopeSent by stock controllerMeaning
/vN/nvoiceyesNote on
/vN/nwvoiceyesGate off
/vN/pvoiceyesPitch. Coupled to note state; not safe to re-send mid-note.
/m/pw, /m/a, /m/xyztimbreyesPitch wheel, aftertouch, pad
/vN/m/pw ,fvoicenoPitch wheel, normalised [−1, 1). The card applies the timbre's bend range.
/vN/m/avoicenoAftertouch
/vN/m/padyvoicenoPad Y

The last three are parsed by the stock voice cards and are what per-voice MPE is built on.