Version T · BroadwayOSC v1.0.2

Download PDF Download Markdown

BroadwayOSC

Version 1.0.2 Universal audio console control over UDP


Abstract

BroadwayOSC is an open protocol for bidirectional control of professional audio consoles over UDP. It extends Open Sound Control (OSC 1.0/1.1) with a richer type system, wildcard index-range addressing, and a human-readable namespace that maps directly to the Broadway universal audio model.

All float values are in engineering units — dB, Hz, ms, µs — as produced by the console’s value converters. The server translates to and from console wire format internally. Clients never deal with raw wire values.

Fully backward compatible with OSC 1.0 for scalar float/int/string messages.

Related standards:


1. Connecting

Protocol: UDP Default port: 8765

No handshake required. Send any BroadwayOSC message and you are registered as a client. Send /Unsubscribe/* to cleanly disconnect.

Multiple clients are supported simultaneously. Each client is identified by "ip:port" and maintains its own independent subscription set.


2. Message Intent

Every BroadwayOSC message is a SET, GET, SUBSCRIBE, or UNSUBSCRIBE. Intent is determined by the path prefix and the presence or absence of a value argument.

SET — Send a value

Include a value argument. The console parameter is updated immediately.

/Input/1/Level      ,f  0.0       ← unity (0 dB)
/Input/3/Mute       ,T            ← mute on
/Dca/2/Level        ,f  0.0       ← DCA at unity
/Bus/4/Mute         ,F            ← mute off

Use the explicit prefix if your client requires it:

/Set/Input/1/Level  ,f  -10.0     ← set to -10 dB

GET — Request the current value

Send the path with no arguments. The current value is returned and you are auto-subscribed to all future changes for that address.

/Input/1/Level
/Input/3/Mute

Explicit prefix form:

/Get/Input/1/Level

If the value is not yet known, the server subscribes to it from the console and pushes it as soon as it arrives. No re-request needed.

SUBSCRIBE — Register for ongoing updates

/Subscribe/Input/1/Level
/Subscribe/Input/1/Mute
/Subscribe/Dca/1/Level

UNSUBSCRIBE — Stop receiving updates

/Unsubscribe/Input/1/Level      ← stop this address
/Unsubscribe/*                  ← remove client entirely

3. Address Format

/ChannelType/index/Parameter
/ChannelType/index/ProcessingBlock/Parameter
/ChannelType/index/ProcessingBlock/SubBlock/Parameter
/ChannelType/index/ChannelType/index/Parameter

Processing blocks (Comp, Gate, Hpf, Lpf, Preamp, Eq) take no index in the OSC path. Sub-blocks (Filter, Parallel) extend a processing block without adding an index. Crosspoints (sends from one channel to a bus) require both channel indices.

Tokens are case-insensitive/input/1/level and /Input/1/Level are equivalent.

Examples:

/Input/1/Level                  Input 1 fader
/Input/1/Mute                   Input 1 mute
/Aux/3/Level                    Aux bus 3 fader
/Input/1/Aux/3/Level            Input 1 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/Comp/Filter/Freq       Input 1 comp sidechain filter freq
/Input/1/Hpf/Freq               Input 1 HPF frequency
/Input/1/Gate/Enable            Input 1 gate on/off
/Input/1/Gate/Filter/Source     Input 1 gate sidechain source
/Input/1/Preamp/Trim            Input 1 preamp trim
/Input/1/Eq/Enable              Input 1 EQ in/out
/Input/1/Eq/2/Gain              Input 1 EQ band 2 gain

Index Ranges and Sets

NotationExampleMeaning
Single3Channel 3 only
Range1-32Channels 1 through 32 inclusive
Set1,4,5-8Channels 1, 4, 5, 6, 7, 8
Wildcard*All channels of that type (inventory-resolved)

Multiple expanded positions produce the Cartesian product:

/Input/1-32/Level       ,f  0.0     ← set all 32 inputs to unity
/Input/1-8/Mute         ,T          ← mute inputs 1–8
/Input/1,4,7/Mute       ,T          ← mute inputs 1, 4, and 7
/Input/1-32/Aux/1-16/Level          ← 512 crosspoints in one message
/Dca/1-8/Level          ,           ← get all DCA faders
/Input/*/Name           ,           ← get all input names

On SET: the same value is applied to every expanded address. On GET/SUBSCRIBE: each expanded address is handled individually.


4. Channel Types

Tokens are case-insensitive. Indices start at 1.

Input Channels

TokenDescriptionAHNet (dLive)X32/M32
InputMono input channelUp to 12832
InputStereoStereo input channel✓ linked pairs✓ linked pairs
AuxInputAux input (mono)8
AuxInputStereoAux input (stereo)✓ linked pairs✓ linked pairs
FxReturnFX return (mono)8
FxReturnStereoFX return (stereo)

Mix Buses

TokenDescriptionAHNet (dLive)X32/M32
AuxAux bus (mono)
AuxStereoAux bus (stereo)
GroupGroup/subgroup (mono)
GroupStereoGroup/subgroup (stereo)
BusBus (mono)16
BusStereoBus (stereo)✓ linked pairs
MatrixMatrix output (mono)6
MatrixStereoMatrix output (stereo)
FxSendFX send (mono)
FxSendStereoFX send (stereo)
OutputOutput (mono)
OutputStereoOutput (stereo)
MainStereoMain LR stereo bus
MainCentreMain mono/centre✓ (/main/m)
MainSubMain sub/LFE
MainSumMain Msum
MainSurroundMain surround
MonMonitor/PAFL bus

Groups

TokenDescriptionAHNetX32/M32
DcaDCA group248
MuteGroupMute group

5. Parameters

All float values are engineering units. The server converts to/from console wire format internally.

Fader and Level

TokenTypeRangeDescription
Levelf-90.0 to +10.0 dBFader level. Unity = 0.0 dB. -90.0 = fully off (−∞).
Panf-100.0 to +100.0Pan position. -100 = full left, 0.0 = centre, +100 = full right.
LevelDCAf-90.0 to +10.0 dBDCA-adjusted effective level — read only

Fader calibration anchors (AHNet/dLive):

dBWire value
+10.035328
0.0 (unity)32780
-10.030204
-20.027648
-30.025089
-40.022540
-90.0 (off)0

Fader calibration anchors (X32/M32, 0.0–1.0 wire float):

dBWire float
+10.01.0
0.0 (unity)0.75
-10.00.5
-30.00.25
-60.00.0625
-∞ (off)0.0

Mute and Solo

TokenTypeDescription
MuteT/FMute on (T) / off (F). Note: X32/M32 wire convention is inverted (1=unmuted) — this is handled internally.
SoloT/FSolo/PFL state — read only

Identity

TokenTypeDescription
NamesChannel name string (up to 8 characters on most consoles) — read only
ColorRChannel colour packed 0x00RRGGBB — read only. See colour palette below.

Colour palette (X32/M32, 16 colours):

IndexLabelRGB
0Off0x000000
1Red0x990000
2Green0x009900
3Yellow0x999900
4Blue0x000099
5Magenta0x990099
6Cyan0x009999
7White0x999999
8–15Inverted variantsFull-saturation equivalents

Preamp

Addressed as /Input/n/Preamp/Parameter

TokenTypeRangeDescription
Trimf±24.0 dBInput trim/attenuator. 0.0 = no gain. Linear 256 counts/dB internally (0x8000 = 0 dB).
PhaseT/FPhase invert. T = inverted.
PhantomT/F48V phantom power. T = on.

High-Pass Filter

Addressed as /Input/n/Hpf/Parameter

TokenTypeRangeDescription
Freqf20.0–20000.0 HzHPF cutoff frequency. Log scale: Hz = 10^((raw+9216.7)/15307.67)
EnableT/FHPF in circuit (T) / bypassed (F)
Slopeiconsole-dependentFilter slope in dB/oct

Low-Pass Filter

Addressed as /Input/n/Lpf/Parameter

TokenTypeRangeDescription
Freqf20.0–20000.0 HzLPF cutoff frequency. Same log scale as HPF.
EnableT/FLPF in circuit (T) / bypassed (F)

Gate

Addressed as /Input/n/Gate/Parameter

TokenTypeRangeDescription
Thresholdf-80.0 to 0.0 dBGate open threshold
EnableT/FGate in circuit (T) / bypassed (F)
Attackf0.0–120.0 msGate open time
Releasef4.0–4000.0 msGate close time. Log scale: ms = 10^((raw−17874.3)/5957.7)
Holdf1.0–200.0 msMinimum hold time before release begins
Rangef3.0–60.0 dBAttenuation depth when gate is closed

Gate Sidechain Filter

Addressed as /Input/n/Gate/Filter/Parameter

TokenTypeRangeDescription
Types"Flat" "Lowpass" "Highpass" "Bandpass"SC filter shape
Freqf20.0–20000.0 HzSC filter frequency
Qf0.44–10.0SC filter Q factor
Sources"SELF" or "CH.n"Sidechain source. "SELF" = own signal. "CH.3" = from input channel 3.

Compressor

Addressed as /Input/n/Comp/Parameter

TokenTypeRangeDescription
Thresholdf±24.0 dBCompression onset threshold. Linear 256 counts/dB (0x8000 = 0 dB).
EnableT/FCompressor in circuit (T) / bypassed (F)
Ratiofe.g. 1.5, 2.0, 4.0Compression ratio where 4.0 = 4:1
AttackfµsCompressor attack time in microseconds. Log scale: µs = 10^((raw−0.6)/5957.9). Note: µs not ms.
Releasef4.0–4000.0 msCompressor release time in ms. Same log scale as gate release.
KneefdBSoft knee width
Makeupf±24.0 dBMakeup gain. Linear 256 counts/dB.
Modelse.g. "Opto" "VCA" "FET" "Tube"Compressor character/model

Compressor Sidechain Filter

Addressed as /Input/n/Comp/Filter/Parameter

TokenTypeRangeDescription
EnableT/FSC filter in circuit (T) / bypassed (F)
Types"Flat" "Lowpass" "Highpass" "Bandpass"SC filter shape
Freqf20.0–20000.0 HzSC filter frequency
Sources"SELF" or "CH.n"Sidechain source

Compressor Parallel

Addressed as /Input/n/Comp/Parallel/Parameter

TokenTypeRangeDescription
EnableT/FParallel compression path enabled
Wetf±24.0 dBCompressed signal level in parallel mix
Dryf±24.0 dBDry signal level in parallel mix

EQ

Addressed as /Input/n/Eq/Enable and /Input/n/Eq/{band}/Parameter

Bands are numbered from 1. AHNet/dLive provides 4 parametric bands per channel.

TokenTypeRangeDescription
EnableT/FEQ in circuit (T) / bypassed (F)
Freqf20.0–20000.0 HzBand centre/corner frequency. Log scale: same formula as HPF.
Gainf±24.0 dBBand boost/cut. 0.0 = flat. Linear 256 counts/dB.
QfoctavesBandwidth in octaves. 2-segment piecewise-linear on wire. Range ~0.1–1.5 oct.
Types"Bell" "Highshelf" "Lowshelf" "Hpf" "Lpf" "Bandpass" "Notch"Band filter shape
/Input/1/Eq/Enable          ,T
/Input/1/Eq/2/Freq          ,f  1000.0    ← 1 kHz
/Input/1/Eq/2/Gain          ,f  3.0       ← +3 dB boost
/Input/1/Eq/2/Q             ,f  1.0       ← 1 octave bandwidth
/Input/1/Eq/2/Type          ,s  "Bell"

GEQ (mix buses only)

Addressed as /Group/n/Geq/Enable, /Group/n/Geq/Type, /Group/n/Geq/{band}/Gain

Available on Group, Aux, Matrix buses. Not available on input channels.

TokenTypeRangeDescription
EnableT/FGEQ in circuit (T) / bypassed (F)
Types"constant-Q" "proportional-Q" "hybrid" "NEQ12"GEQ algorithm type
Gainf±15.0 dBBand gain. Linear 256 counts/dB.

Delay

Addressed as /Input/n/Delay/Parameter

TokenTypeRangeDescription
EnableT/FDelay in circuit (T) / bypassed (F)
TimefmsDelay time in milliseconds. Log scale.

Insert

Addressed as /Input/n/Insert/{slot}/Enable

Slots: 1 = Insert A, 2 = Insert B.

/Input/1/Insert/1/Enable    ,T      ← insert slot A on
/Input/1/Insert/2/Enable    ,F      ← insert slot B off

DCA Assignment

Addressed as /Input/n/Dca/{dca}/Enable

/Input/1/Dca/3/Enable       ,T      ← assign input 1 to DCA 3
/Input/1/Dca/3/Enable       ,F      ← remove input 1 from DCA 3

Crosspoint Sends

Addressed as /Input/n/BusType/m/Parameter

Supported bus types for AHNet/dLive: Aux, Group, FxSend, Matrix Supported bus types for X32/M32: Bus (flat numbered)

TokenTypeRangeDescription
Levelf-90.0 to +10.0 dBSend level. Unity = 0.0 dB.
EnableT/FSend active (T) / off (F)
PreT/FPre-fader = T, post-fader = F
/Input/1/Aux/3/Level    ,f  0.0       ← send at unity (0 dB)
/Input/1/Aux/3/Level    ,f  -6.0      ← send at -6 dB
/Input/1/Aux/3/Level    ,f  -90.0     ← send off
/Input/1/Aux/3/Enable   ,T
/Input/1/Aux/3/Pre      ,F            ← post-fader

DCA

AddressTypeRangeDescription
/Dca/n/Levelf-90.0 to +10.0 dBDCA fader. Unity = 0.0.
/Dca/n/MuteT/FDCA mute
/Dca/n/NamesDCA name (up to 8 chars) — read only
/Dca/n/ColorR0x00RRGGBBDCA colour — read only

Scenes and Cues

AddressTypeDescription
/Cues/1/GoIFire the standby scene
/Cues/1/StandbyCueiSet standby scene index (0-based)
/Cues/1/ActiveCueIDiActive scene index — read only
/Cues/1/ShowsActive show name — read only
/Cues/1/CueListGET: full scene list

6. Processing Block Availability by Channel Type

Not all processing blocks are available on all channel types. This table shows what is supported.

BlockInputGroup/Aux/BusMatrixFxSendFxReturnDCA
Preamp
Hpf
Lpf
Gate
Gate/Filter
Comp
Comp/Filter
Comp/Parallel
Eq (PEQ)
Geq
Delay
Insert
Dca (assign)

Source: AHNetOSCTemplate.capabilities matrix — hardware maximums. X32/M32 supports a subset.


7. Value Types

TagSourceTypeRange / Notes
iOSC 1.0int324 bytes, big-endian signed
fOSC 1.0float324 bytes, IEEE 754 big-endian. Always engineering units.
sOSC 1.0stringUTF-8, null-terminated, 4-byte padded
bOSC 1.0blobint32 size + bytes, 4-byte padded
TOSC 1.1trueno data bytes
FOSC 1.1falseno data bytes
NOSC 1.1nullno data bytes — GET intent
IOSC 1.1impulse/triggerno data bytes — use for actions like Go
dOSC 1.1float648 bytes, IEEE 754 big-endian
hOSC 1.1int648 bytes, big-endian signed
[ ]OSC 1.1arrayno data bytes
uBroadwayOSCuint164 bytes, big-endian unsigned (zero-padded)
RBroadwayOSCRGB colour4 bytes, 0x00RRGGBB big-endian
PBroadwayOSCpair4 bytes: int16 token + int16 index, big-endian

Engineering Unit Summary

Parameter typeUnitTypical rangeInternal wire scale
Fader / send leveldB-90.0 to +10.0Piecewise-linear lookup (see calibration tables above)
Trim / EQ gain / makeupdB±24.0Linear: 256 counts/dB, wire 0x8000 = 0 dB
ThresholddB±24.0 (comp) / -80 to 0 (gate)Linear: 256 counts/dB
FrequencyHz20.0–20000.0Log: Hz = 10^((raw+9216.7)/15307.67)
Release / hold / delayms4.0–4000.0Log: ms = 10^((raw−17874.3)/5957.7)
Attack (compressor/gate)µs~50–120000 µsLog: µs = 10^((raw−0.6)/5957.9)
EQ bandwidthoctaves0.1–1.52-segment piecewise-linear
Pan-100 to +100-100 L, 0 C, +100 RAHNet: raw uint16. X32: (wire−0.5)×200
Ration:11.5, 2.0, 4.0Linear
GEQ band gaindB±15.0Linear: 256 counts/dB

Collection Encoding

Broadway collection values use OSC 1.1 arrays [...]:

ValueType TagUse
bools,[TTF]routing enables
floats,[fff]routing levels (dB)
ints,[iii]pre/post flags
pairs,[PP]channel pair list

8. Client Model

Registration

Clients are registered automatically on first inbound packet, identified by "ip:port". No handshake needed.

Subscriptions

Each client maintains its own subscription set. Pushes are only sent for addresses in the set. Build your set via:

Lazy Wire Subscription

When a client GETs an address not yet known to the server:

  1. Address added to client subscription set
  2. Server fires a wire GET to the connected console
  3. Console responds → value stored in bridge state → pushed to all subscribed clients
  4. Address remains active — all future console changes are pushed automatically

No re-subscription needed across console reconnections within a session.

Unsolicited Console Pushes

When an operator moves a control on the desk, the push flows through the bridge and is forwarded to all clients subscribed to that address. Clients receive live console state without polling.


9. Quick Reference

SET to unity:           /Input/1/Level              ,f  0.0
SET to -10 dB:          /Input/1/Level              ,f  -10.0
SET off:                /Input/1/Level              ,f  -90.0
GET fader:              /Input/1/Level
Mute on:                /Input/1/Mute               ,T
Mute off:               /Input/1/Mute               ,F
Pan centre:             /Input/1/Pan                ,f  0.0
Pan hard left:          /Input/1/Pan                ,f  -100.0
Get name:               /Input/1/Name
Subscribe mute:         /Subscribe/Input/1/Mute
Unsubscribe all:        /Unsubscribe/*
Fire scene:             /Cues/1/Go                  ,I
DCA unity:              /Dca/1/Level                ,f  0.0
Input→aux unity:        /Input/1/Aux/3/Level        ,f  0.0
Input→aux -6 dB:        /Input/1/Aux/3/Level        ,f  -6.0
Input→aux off:          /Input/1/Aux/3/Level        ,f  -90.0
Comp threshold:         /Input/1/Comp/Threshold     ,f  -18.0
Comp attack:            /Input/1/Comp/Attack        ,f  500.0   ← 500 µs
Comp release:           /Input/1/Comp/Release       ,f  100.0   ← 100 ms
HPF at 80 Hz:           /Input/1/Hpf/Freq           ,f  80.0
HPF on:                 /Input/1/Hpf/Enable         ,T
EQ boost +3 dB:         /Input/1/Eq/2/Gain          ,f  3.0
EQ band freq:           /Input/1/Eq/2/Freq          ,f  1000.0
Comp SC filter on:      /Input/1/Comp/Filter/Enable ,T
Comp SC freq:           /Input/1/Comp/Filter/Freq   ,f  200.0
Assign to DCA 3:        /Input/1/Dca/3/Enable       ,T
Range mute:             /Input/1-8/Mute             ,T
Range GET:              /Input/1-32/Level
Set notation:           /Input/1,4,5-8/Mute         ,T
All inputs:             /Input/*/Mute
All crosspoints:        /Input/*/Aux/*/Level        ,f  0.0

10. Packet Format

Standard OSC framing:

[address string]    null-terminated, 4-byte padded
[type tag string]   starts with ',', null-terminated, 4-byte padded
[arguments]         per type tag, each 4-byte padded

All multi-byte values big-endian. OSC 1.1 bundles (#bundle) accepted and processed sequentially.


11. Relationship to ADM-OSC

ADM-OSC (/adm/obj/n/...) and BroadwayOSC (/ChannelType/n/...) occupy non-overlapping namespaces and may coexist on the same UDP port. A server implementing both routes by path prefix.


Appendix A — Token Reference

All tokens are case-insensitive. Canonical form is PascalCase.

Channel Types

Input           InputStereo     Group           GroupStereo
Aux             AuxStereo       Matrix          MatrixStereo
Bus             BusStereo       Mix             MixStereo
Output          OutputStereo    FxSend          FxSendStereo
FxReturn        FxReturnStereo  AuxInput        AuxInputStereo
MainStereo      MainCentre      MainSub         MainSum
MainSurround    Mon             Dca             DcaGroup
MuteGroup       UfxSend         UfxReturn

Parameters

Level           LevelDCA        Mute            Pan
Trim            Delay           Color           Eq
Comp            Gate            Send            Solo
Phase           Preamp          Phantom         Hpf
Lpf             Invert          Insert          Source
Automix         Name            Select          RoutingSet
RoutingPool     AltSource       Panner          Geq

Processing Sub-blocks

Filter          Parallel

Actions

Recall          Store           Copy            Paste
Reset           Clear           Fire            Stop
Play            Pause           Record          Go
Previous        Next            Toggle          Undo

Sub-parameters

Freq            Gain            Q               Attack
Release         Threshold       Ratio           Bypass
Enable          Knee            Range           Hold
Keyfilter       Makeup          Auto            Peak
Rms             Pre             Post            Type
Slope           Width           Balance         Time
Depth           Rate            Feedback        Size
Model           Wet             Dry

Filter / EQ Shape Values (used with Type parameter)

Bell            Highshelf       Lowshelf        Hpf
Lpf             Bandpass        Notch           Peq

Compressor Model Values (used with Model parameter)

Opto            Vca             Fet             Tube
Bus             Ducker          PeakLimiter

GEQ Type Values (used with Type parameter on Geq)

constant-Q      proportional-Q  hybrid          NEQ12

Cues / Scenes

Cues            CueList         Scene           Snapshot
Show            ActiveCueID     StandbyCue      Go

System

System          Config

Appendix B — BroadwayOSC vs OSC 1.0 vs ADM-OSC

FeatureOSC 1.0OSC 1.1ADM-OSCBroadwayOSC
Basic types (i,f,s,b)
Boolean T/F tags
Null/Impulse tags
Arrays [ ]
uint16 tag
RGB tag
Pair tag
Index range syntax
Index set syntax
Wildcard *path globpath globinventory-resolved
Bundles
Multi-client
Lazy wire subscription
Engineering unit values
Console abstraction layer
Spatial/object namespace
Console control namespace

Appendix C — Implementation Notes (Version T)

BroadwayOSC is implemented at the bridge layer. Three files handle all protocol work:

FilePurpose
BridgeOSCManager.swiftUDP socket, client registry, wildcard expansion, dispatch, push
BridgeOSCParser.swiftOSC packet → parsed command; path → Broadway semantics + indices
BridgeOSCEncoder.swiftBroadwayADDRESS + BroadwayVALUE → OSC packet Data

BridgeOSCManager is owned by BridgeManager and started after full console inventory is available. All bridge results pass through oscManager.pushToClients() — OSC clients receive the same live state as the Version T UI. Values are BroadwayVALUE instances in engineering units, passed through unchanged at the OSC boundary.

Supported adaptors:

AdaptorConsole familyNotes
AHNetAllen & Heath dLive, Avantis, SQFull processing block support
WINGBehringer WINGNative float dB on wire
OSC32Behringer X32 / Midas M32Fixed channel counts (see Section 4)