BroadwayOSC
Version T's open control protocol — read and drive console parameters live from any external program over the network.
Download the full spec (PDF) Download MarkdownBroadwayOSC is Version T’s open control protocol. Any external program — a show-control system, a QLab-style cue engine, a custom script — can reach the connected console over the network and read or drive its parameters live, using the same model Version T uses internally. Whatever an operator does on the console flows back out to every listening client without polling.
It’s a superset of standard Open Sound Control (OSC 1.0 / 1.1): plain float, integer and string messages work exactly as they do in any OSC tool, and BroadwayOSC adds a richer type system, index-range addressing and a readable console namespace on top. This page is a working summary; the full specification is the BroadwayOSC document in the project.
Connecting
BroadwayOSC runs over UDP, default port 8765. There’s no handshake — send any BroadwayOSC message and you’re registered as a client from that moment. Send /Unsubscribe/* to remove yourself cleanly when you disconnect.
What a message means
Every message is one of four intents, decided by the path prefix and whether a value is attached:
- SET — a path with a value. The parameter updates immediately.
/Input/1/Level ,f 0.75 - GET — a path with no value. The current value comes back, and you’re auto-subscribed to future changes for that address.
/Input/1/Level - SUBSCRIBE —
/Subscribe/Input/1/Levelregisters for ongoing updates without changing anything. - UNSUBSCRIBE —
/Unsubscribe/Input/1/Levelstops one address;/Unsubscribe/*removes the client entirely.
An explicit /Set/… or /Get/… prefix is accepted if your client prefers it, but isn’t required.
Address format
/ChannelType/index/Parameter
/ChannelType/index/ProcessingBlock/Parameter
/ChannelType/index/ChannelType/index/Parameter
Tokens are case-insensitive — /input/1/level equals /Input/1/Level. Processing blocks (Comp, Gate, Hpf, Lpf, Preamp, Eq) take no index of their own. A crosspoint — a send from a channel to a bus — carries both indices, e.g. /Input/1/Aux/3/Level.
| Address | Reaches |
|---|---|
/Input/1/Level | Input 1 fader |
/Input/1/Mute | Input 1 mute |
/Aux/3/Level | Aux 3 fader |
/Input/1/Aux/3/Level | Input 1’s send to aux 3 |
/Dca/1/Level | DCA 1 fader |
/MainStereo/1/Level | Main LR fader |
/Input/1/Comp/Threshold | Input 1 compressor threshold |
/Input/1/Hpf/Freq | Input 1 high-pass frequency |
/Input/1/Preamp/Trim | Input 1 preamp trim |
Addressing many channels at once
The index field isn’t limited to a single number:
| Form | Example | Means |
|---|---|---|
| Single | 3 | Channel 3 |
| Range | 1-32 | Channels 1 through 32 |
| Set | 1,4,5-8 | Channels 1, 4, 5, 6, 7, 8 |
| Wildcard | * | Every channel of that type |
Two ranges in one address produce every combination — /Input/1-32/Aux/1-16/Level is 512 crosspoints. On SET the same value is written to every expanded address; on GET/SUBSCRIBE each one is handled individually.
Channel types
Inputs: Input, InputStereo, AuxInput, AuxInputStereo, FxReturn, FxReturnStereo.
Buses: Aux, AuxStereo, Group, GroupStereo, Bus, BusStereo, Matrix, MatrixStereo, FxSend, FxSendStereo, Output, OutputStereo, MainStereo, MainCentre, MainSub, MainSum, MainSurround, Mon.
Groups: Dca, MuteGroup.
Parameters
Float values are in engineering units — Hz, ms, dB — and Version T converts to and from each console’s wire format for you.
| Parameter | Type | Notes |
|---|---|---|
Level | float | Fader (dB), −∞ to +10.0 |
Pan | float | −100.0 L … 0.0 centre … +100.0 R |
LevelDCA | float | DCA-adjusted level — read-only |
Mute | T/F | |
Solo | T/F | Read-only |
Name | string | Read-only |
Color | RGB | 0xRRGGBB — read-only |
Processing blocks each carry their own controls, addressed under the block: Preamp (Trim, Phase, Phantom), Hpf / Lpf (Freq, Enable, Slope), Gate, Comp (with sidechain and parallel sub-blocks), Eq (per-band Freq/Gain/Q/Type), Geq (mix buses), Delay, Insert, and DCA assignment (/Input/n/Dca/m/Enable). See the full spec for every field.
Scenes and cues
| Address | Type | Does |
|---|---|---|
/Cues/1/Go | impulse | Fire the standby scene |
/Cues/1/StandbyCue | int | Set the standby scene index |
/Cues/1/ActiveCueID | int | Active scene — read-only |
/Cues/1/Show | string | Active show name — read-only |
/Cues/1/CueList | GET | The full scene list |
Value types
BroadwayOSC carries the standard OSC tags — i int32, f float32, s string, b blob, T/F boolean, N null, I impulse (used for actions like Go), d float64, h int64, and arrays […] — and adds three of its own: u (uint16), R (RGB colour, 0x00RRGGBB), and P (a pair — int16 token plus int16 index). Collections use OSC 1.1 arrays: [TTF] for routing enables, [fff] for levels, [iii] for pre/post flags, [PP] for a channel pair list.
How clients stay in sync
Each client keeps its own subscription set; pushes only go to addresses in that set. Build the set by GETting an address (auto-subscribe) or with /Subscribe/. If you GET an address the server doesn’t yet hold, it fetches the value from the console, stores it, and pushes it to you as soon as it arrives — no re-request. From then on, every console move on that address is forwarded to you live. Clients are identified by ip:port.
Coexisting with ADM-OSC
BroadwayOSC (/ChannelType/n/…) and ADM-OSC (/adm/obj/n/…) use non-overlapping namespaces and can share the same UDP port, so spatial-object control and console control can run side by side.