# 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:**
- OSC 1.0 / 1.1 — base transport, framing, array types, boolean tags
- ADM-OSC — complementary spatial audio standard; namespaces do not conflict (`/adm/` vs `/ChannelType/`)

---

## 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

| Notation | Example | Meaning |
|----------|---------|---------|
| Single | `3` | Channel 3 only |
| Range | `1-32` | Channels 1 through 32 inclusive |
| Set | `1,4,5-8` | Channels 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

| Token | Description | AHNet (dLive) | X32/M32 |
|-------|-------------|---------------|---------|
| `Input` | Mono input channel | Up to 128 | 32 |
| `InputStereo` | Stereo input channel | ✓ linked pairs | ✓ linked pairs |
| `AuxInput` | Aux input (mono) | ✓ | 8 |
| `AuxInputStereo` | Aux input (stereo) | ✓ linked pairs | ✓ linked pairs |
| `FxReturn` | FX return (mono) | ✓ | 8 |
| `FxReturnStereo` | FX return (stereo) | ✓ | — |

### Mix Buses

| Token | Description | AHNet (dLive) | X32/M32 |
|-------|-------------|---------------|---------|
| `Aux` | Aux bus (mono) | ✓ | — |
| `AuxStereo` | Aux bus (stereo) | ✓ | — |
| `Group` | Group/subgroup (mono) | ✓ | — |
| `GroupStereo` | Group/subgroup (stereo) | ✓ | — |
| `Bus` | Bus (mono) | ✓ | 16 |
| `BusStereo` | Bus (stereo) | ✓ | ✓ linked pairs |
| `Matrix` | Matrix output (mono) | ✓ | 6 |
| `MatrixStereo` | Matrix output (stereo) | ✓ | — |
| `FxSend` | FX send (mono) | ✓ | — |
| `FxSendStereo` | FX send (stereo) | ✓ | — |
| `Output` | Output (mono) | ✓ | — |
| `OutputStereo` | Output (stereo) | ✓ | — |
| `MainStereo` | Main LR stereo bus | ✓ | ✓ |
| `MainCentre` | Main mono/centre | ✓ | ✓ (`/main/m`) |
| `MainSub` | Main sub/LFE | ✓ | — |
| `MainSum` | Main Msum | ✓ | — |
| `MainSurround` | Main surround | ✓ | — |
| `Mon` | Monitor/PAFL bus | ✓ | — |

### Groups

| Token | Description | AHNet | X32/M32 |
|-------|-------------|-------|---------|
| `Dca` | DCA group | 24 | 8 |
| `MuteGroup` | Mute group | ✓ | ✓ |

---

## 5. Parameters

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

### Fader and Level

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Level` | `f` | -90.0 to +10.0 dB | Fader level. Unity = 0.0 dB. -90.0 = fully off (−∞). |
| `Pan` | `f` | -100.0 to +100.0 | Pan position. -100 = full left, 0.0 = centre, +100 = full right. |
| `LevelDCA` | `f` | -90.0 to +10.0 dB | DCA-adjusted effective level — read only |

**Fader calibration anchors (AHNet/dLive):**

| dB | Wire value |
|----|-----------|
| +10.0 | 35328 |
| 0.0 (unity) | 32780 |
| -10.0 | 30204 |
| -20.0 | 27648 |
| -30.0 | 25089 |
| -40.0 | 22540 |
| -90.0 (off) | 0 |

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

| dB | Wire float |
|----|-----------|
| +10.0 | 1.0 |
| 0.0 (unity) | 0.75 |
| -10.0 | 0.5 |
| -30.0 | 0.25 |
| -60.0 | 0.0625 |
| -∞ (off) | 0.0 |

### Mute and Solo

| Token | Type | Description |
|-------|------|-------------|
| `Mute` | `T`/`F` | Mute on (`T`) / off (`F`). Note: X32/M32 wire convention is inverted (1=unmuted) — this is handled internally. |
| `Solo` | `T`/`F` | Solo/PFL state — read only |

### Identity

| Token | Type | Description |
|-------|------|-------------|
| `Name` | `s` | Channel name string (up to 8 characters on most consoles) — read only |
| `Color` | `R` | Channel colour packed 0x00RRGGBB — read only. See colour palette below. |

**Colour palette (X32/M32, 16 colours):**

| Index | Label | RGB |
|-------|-------|-----|
| 0 | Off | 0x000000 |
| 1 | Red | 0x990000 |
| 2 | Green | 0x009900 |
| 3 | Yellow | 0x999900 |
| 4 | Blue | 0x000099 |
| 5 | Magenta | 0x990099 |
| 6 | Cyan | 0x009999 |
| 7 | White | 0x999999 |
| 8–15 | Inverted variants | Full-saturation equivalents |

### Preamp

Addressed as `/Input/n/Preamp/Parameter`

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Trim` | `f` | ±24.0 dB | Input trim/attenuator. 0.0 = no gain. Linear 256 counts/dB internally (0x8000 = 0 dB). |
| `Phase` | `T`/`F` | — | Phase invert. `T` = inverted. |
| `Phantom` | `T`/`F` | — | 48V phantom power. `T` = on. |

### High-Pass Filter

Addressed as `/Input/n/Hpf/Parameter`

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Freq` | `f` | 20.0–20000.0 Hz | HPF cutoff frequency. Log scale: Hz = 10^((raw+9216.7)/15307.67) |
| `Enable` | `T`/`F` | — | HPF in circuit (`T`) / bypassed (`F`) |
| `Slope` | `i` | console-dependent | Filter slope in dB/oct |

### Low-Pass Filter

Addressed as `/Input/n/Lpf/Parameter`

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Freq` | `f` | 20.0–20000.0 Hz | LPF cutoff frequency. Same log scale as HPF. |
| `Enable` | `T`/`F` | — | LPF in circuit (`T`) / bypassed (`F`) |

### Gate

Addressed as `/Input/n/Gate/Parameter`

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Threshold` | `f` | -80.0 to 0.0 dB | Gate open threshold |
| `Enable` | `T`/`F` | — | Gate in circuit (`T`) / bypassed (`F`) |
| `Attack` | `f` | 0.0–120.0 ms | Gate open time |
| `Release` | `f` | 4.0–4000.0 ms | Gate close time. Log scale: ms = 10^((raw−17874.3)/5957.7) |
| `Hold` | `f` | 1.0–200.0 ms | Minimum hold time before release begins |
| `Range` | `f` | 3.0–60.0 dB | Attenuation depth when gate is closed |

### Gate Sidechain Filter

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

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Type` | `s` | `"Flat"` `"Lowpass"` `"Highpass"` `"Bandpass"` | SC filter shape |
| `Freq` | `f` | 20.0–20000.0 Hz | SC filter frequency |
| `Q` | `f` | 0.44–10.0 | SC filter Q factor |
| `Source` | `s` | `"SELF"` or `"CH.n"` | Sidechain source. `"SELF"` = own signal. `"CH.3"` = from input channel 3. |

### Compressor

Addressed as `/Input/n/Comp/Parameter`

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Threshold` | `f` | ±24.0 dB | Compression onset threshold. Linear 256 counts/dB (0x8000 = 0 dB). |
| `Enable` | `T`/`F` | — | Compressor in circuit (`T`) / bypassed (`F`) |
| `Ratio` | `f` | e.g. 1.5, 2.0, 4.0 | Compression ratio where 4.0 = 4:1 |
| `Attack` | `f` | µs | Compressor attack time in **microseconds**. Log scale: µs = 10^((raw−0.6)/5957.9). Note: µs not ms. |
| `Release` | `f` | 4.0–4000.0 ms | Compressor release time in ms. Same log scale as gate release. |
| `Knee` | `f` | dB | Soft knee width |
| `Makeup` | `f` | ±24.0 dB | Makeup gain. Linear 256 counts/dB. |
| `Model` | `s` | e.g. `"Opto"` `"VCA"` `"FET"` `"Tube"` | Compressor character/model |

### Compressor Sidechain Filter

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

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Enable` | `T`/`F` | — | SC filter in circuit (`T`) / bypassed (`F`) |
| `Type` | `s` | `"Flat"` `"Lowpass"` `"Highpass"` `"Bandpass"` | SC filter shape |
| `Freq` | `f` | 20.0–20000.0 Hz | SC filter frequency |
| `Source` | `s` | `"SELF"` or `"CH.n"` | Sidechain source |

### Compressor Parallel

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

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Enable` | `T`/`F` | — | Parallel compression path enabled |
| `Wet` | `f` | ±24.0 dB | Compressed signal level in parallel mix |
| `Dry` | `f` | ±24.0 dB | Dry 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.

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Enable` | `T`/`F` | — | EQ in circuit (`T`) / bypassed (`F`) |
| `Freq` | `f` | 20.0–20000.0 Hz | Band centre/corner frequency. Log scale: same formula as HPF. |
| `Gain` | `f` | ±24.0 dB | Band boost/cut. 0.0 = flat. Linear 256 counts/dB. |
| `Q` | `f` | octaves | Bandwidth in octaves. 2-segment piecewise-linear on wire. Range ~0.1–1.5 oct. |
| `Type` | `s` | `"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.

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Enable` | `T`/`F` | — | GEQ in circuit (`T`) / bypassed (`F`) |
| `Type` | `s` | `"constant-Q"` `"proportional-Q"` `"hybrid"` `"NEQ12"` | GEQ algorithm type |
| `Gain` | `f` | ±15.0 dB | Band gain. Linear 256 counts/dB. |

### Delay

Addressed as `/Input/n/Delay/Parameter`

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Enable` | `T`/`F` | — | Delay in circuit (`T`) / bypassed (`F`) |
| `Time` | `f` | ms | Delay 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)

| Token | Type | Range | Description |
|-------|------|-------|-------------|
| `Level` | `f` | -90.0 to +10.0 dB | Send level. Unity = 0.0 dB. |
| `Enable` | `T`/`F` | — | Send active (`T`) / off (`F`) |
| `Pre` | `T`/`F` | — | Pre-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

| Address | Type | Range | Description |
|---------|------|-------|-------------|
| `/Dca/n/Level` | `f` | -90.0 to +10.0 dB | DCA fader. Unity = 0.0. |
| `/Dca/n/Mute` | `T`/`F` | — | DCA mute |
| `/Dca/n/Name` | `s` | — | DCA name (up to 8 chars) — read only |
| `/Dca/n/Color` | `R` | 0x00RRGGBB | DCA colour — read only |

### Scenes and Cues

| Address | Type | Description |
|---------|------|-------------|
| `/Cues/1/Go` | `I` | Fire the standby scene |
| `/Cues/1/StandbyCue` | `i` | Set standby scene index (0-based) |
| `/Cues/1/ActiveCueID` | `i` | Active scene index — read only |
| `/Cues/1/Show` | `s` | Active show name — read only |
| `/Cues/1/CueList` | — | GET: 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.

| Block | Input | Group/Aux/Bus | Matrix | FxSend | FxReturn | DCA |
|-------|-------|---------------|--------|--------|----------|-----|
| 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

| Tag | Source | Type | Range / Notes |
|-----|--------|------|---------------|
| `i` | OSC 1.0 | int32 | 4 bytes, big-endian signed |
| `f` | OSC 1.0 | float32 | 4 bytes, IEEE 754 big-endian. Always engineering units. |
| `s` | OSC 1.0 | string | UTF-8, null-terminated, 4-byte padded |
| `b` | OSC 1.0 | blob | int32 size + bytes, 4-byte padded |
| `T` | OSC 1.1 | true | no data bytes |
| `F` | OSC 1.1 | false | no data bytes |
| `N` | OSC 1.1 | null | no data bytes — GET intent |
| `I` | OSC 1.1 | impulse/trigger | no data bytes — use for actions like `Go` |
| `d` | OSC 1.1 | float64 | 8 bytes, IEEE 754 big-endian |
| `h` | OSC 1.1 | int64 | 8 bytes, big-endian signed |
| `[` `]` | OSC 1.1 | array | no data bytes |
| `u` | BroadwayOSC | uint16 | 4 bytes, big-endian unsigned (zero-padded) |
| `R` | BroadwayOSC | RGB colour | 4 bytes, `0x00RRGGBB` big-endian |
| `P` | BroadwayOSC | pair | 4 bytes: int16 token + int16 index, big-endian |

### Engineering Unit Summary

| Parameter type | Unit | Typical range | Internal wire scale |
|----------------|------|---------------|---------------------|
| Fader / send level | dB | -90.0 to +10.0 | Piecewise-linear lookup (see calibration tables above) |
| Trim / EQ gain / makeup | dB | ±24.0 | Linear: 256 counts/dB, wire 0x8000 = 0 dB |
| Threshold | dB | ±24.0 (comp) / -80 to 0 (gate) | Linear: 256 counts/dB |
| Frequency | Hz | 20.0–20000.0 | Log: Hz = 10^((raw+9216.7)/15307.67) |
| Release / hold / delay | ms | 4.0–4000.0 | Log: ms = 10^((raw−17874.3)/5957.7) |
| Attack (compressor/gate) | **µs** | ~50–120000 µs | Log: µs = 10^((raw−0.6)/5957.9) |
| EQ bandwidth | octaves | 0.1–1.5 | 2-segment piecewise-linear |
| Pan | -100 to +100 | -100 L, 0 C, +100 R | AHNet: raw uint16. X32: (wire−0.5)×200 |
| Ratio | n:1 | 1.5, 2.0, 4.0 | Linear |
| GEQ band gain | dB | ±15.0 | Linear: 256 counts/dB |

### Collection Encoding

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

| Value | Type Tag | Use |
|-------|----------|-----|
| 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:

- **GET** (no value) — auto-subscribes the address
- **`/Subscribe/`** — explicit subscription

### 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

| Feature | OSC 1.0 | OSC 1.1 | ADM-OSC | BroadwayOSC |
|---------|---------|---------|---------|-------------|
| 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 glob | path glob | — | inventory-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:

| File | Purpose |
|------|---------|
| `BridgeOSCManager.swift` | UDP socket, client registry, wildcard expansion, dispatch, push |
| `BridgeOSCParser.swift` | OSC packet → parsed command; path → Broadway semantics + indices |
| `BridgeOSCEncoder.swift` | BroadwayADDRESS + 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:**

| Adaptor | Console family | Notes |
|---------|---------------|-------|
| AHNet | Allen & Heath dLive, Avantis, SQ | Full processing block support |
| WING | Behringer WING | Native float dB on wire |
| OSC32 | Behringer X32 / Midas M32 | Fixed channel counts (see Section 4) |
