Companion module for the DiGiCo S31 with an iPad relay (v1)
Bitfocus Companion 5 connection module (ESM, @companion-module/base ~2.1.3, runtime node22) for the DiGiCo S21/S31. It occupies the console's single iPad slot, controls per-channel sends/assigns to one buss, aux send level/on/pan, mutes, faders and snapshots, and relays any number of DiGiCo iPad apps through to the console byte-for-byte. The S31's iPad extension was probed live: it speaks the SD/DiGiCo Pad OSC tree (console receives on 8000, replies only to the configured iPad port 9000). tools/mock-s31.js emulates the console and test/selftest.js runs the link + relay end to end against it. docs/design-v2.md is the brief for the generic v2 rewrite. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
# DiGiCo S31 (S-Series) — Studio Mon control + iPad relay
|
||||
|
||||
This connection does two things:
|
||||
|
||||
1. **Controls which channels feed one buss** — by default the *Studio* buss — plus any aux send
|
||||
level/on/pan, channel mute/fader, buss master fader/mute and snapshot recall, with feedbacks,
|
||||
variables and ready-made presets.
|
||||
2. **Relays the DiGiCo iPad app.** An S-Series console talks to exactly one iPad at a time.
|
||||
Companion takes that slot; the iPad apps point at the Companion computer instead of the
|
||||
console. Everything an app sends is forwarded to the console unchanged and every console
|
||||
message is copied to every app seen recently, so several iPads can be used at once.
|
||||
|
||||
## What the console speaks (verified on "S31 AB", 2026-10-15)
|
||||
|
||||
The S31's **iPad** extension speaks the DiGiCo Pad / SD-style OSC tree over UDP:
|
||||
|
||||
| Address | Reply | Notes |
|
||||
| --- | --- | --- |
|
||||
| `/Console/Name/?` | `/Console/Name "S31 AB"` | used as keepalive |
|
||||
| `/Console/Input_Channels/?`, `/Console/Aux_Outputs/?` | int counts (60, 25) | 25 busses, each in aux *or* group mode |
|
||||
| `/Console/Aux_Outputs/modes/?` | 25 ints, 2 = stereo, 1 = mono | |
|
||||
| `/Input_Channels/N/Channel_Input/name/?` | string | |
|
||||
| `/Input_Channels/N/fader/?`, `/mute/?` | float dB (−150 = −∞), float 0/1 | |
|
||||
| `/Input_Channels/N/Aux_Send/M/send_level` | float dB, −150 = off | write a float |
|
||||
| `/Input_Channels/N/Aux_Send/M/send_on` | float 0/1 | write int 0/1 |
|
||||
| `/Input_Channels/N/Aux_Send/M/send_pan` | float 0..1, 0.5 centre | |
|
||||
| `/Input_Channels/N/Group_Send/M/group` | float 0/1 | group assign; write int 0/1 |
|
||||
| `/Aux_Outputs/M/Buss_Trim/name/?`, `/Group_Outputs/M/Buss_Trim/name/?` | string | a buss is named on one side only |
|
||||
| `/Aux_Outputs/M/fader`, `/mute` (and `/Group_Outputs/M/…`) | float | buss masters |
|
||||
| `/Snapshots/Current_Snapshot/?`, `/Snapshots/names/?` | int; `/Snapshots/name [i, cue×100, 0, name]` | |
|
||||
|
||||
A query is the address plus `/?` with no argument; the reply is the same address without `/?`.
|
||||
Every reply goes to the controller IP and **Send Port** configured on the console, never to the
|
||||
asking socket, which is why a fixed local port is bound. The lowercase S-Series *OSC Control*
|
||||
command list (`/channel/N/…`, `/console/resend`) is **not** answered on the iPad leg; it belongs
|
||||
to the separate *OSC Control* extension and is available here as an alternative command set.
|
||||
|
||||
## Console setup (once, at the surface)
|
||||
|
||||
Main Menu → **Extensions → iPad**:
|
||||
|
||||
| Console field | Value |
|
||||
| --- | --- |
|
||||
| iPad IP address | the Companion computer (AB-ProPresenter: `10.3.11.152`) |
|
||||
| Send port *(console → iPad)* | this connection's **Local receive port** (default `9000`) |
|
||||
| Receive port *(iPad → console)* | this connection's **Console receive port** (default `8000`) |
|
||||
| iPad connection enabled | yes |
|
||||
|
||||
## iPad app setup
|
||||
|
||||
In the DiGiCo S app connect page, for every iPad:
|
||||
|
||||
| iPad field | Value |
|
||||
| --- | --- |
|
||||
| Console IP | the Companion computer, **not** the console |
|
||||
| Send port | this connection's **Relay port** (default `8000`) |
|
||||
| Receive port | this connection's **iPad receive port** (default `9000`) |
|
||||
|
||||
An iPad that goes quiet for *Forget an iPad after* seconds is dropped from the fan-out list.
|
||||
`$(S31:relay_clients)` shows how many are live.
|
||||
|
||||
## Studio Mon buss
|
||||
|
||||
Set **Studio Mon buss number** (1-25, the console's buss order). The module reads the buss
|
||||
names and works out whether it is an **aux** (send level + on/off per channel) or a **group**
|
||||
(assign on/off per channel); override with *Studio Mon buss type* if needed. On this console:
|
||||
|
||||
| Buss | Aux name | Group name |
|
||||
| --- | --- | --- |
|
||||
| 1-8 | VOCAL VERB, VOCAL SLAP, TRACKS, CLK-GD-MD, VOCAL DELAY, VOCALS, TB, MC/SpkrBcastOut | |
|
||||
| 9-13 | | BAND, VOCALS, MISC, DRUMS, DRUM CRUSH |
|
||||
| 14-17 | DRUM PLATE, AG VERB, FOH Spkr, Studio TB | |
|
||||
| 18 | | Broadcast mix |
|
||||
| 19-21 | FX, Prop & Spot, Drum Room Verb | |
|
||||
| 23-25 | | CAFE, **Studio**, Master |
|
||||
|
||||
The default is buss **24 "Studio"** (stereo group). Presets under *Studio Mon* give one
|
||||
on/off button per input (green when assigned/on, label = channel name); for an aux buss the
|
||||
+1 dB / −1 dB nudge presets appear as well.
|
||||
|
||||
## Variables
|
||||
|
||||
`$(S31:ch_N_name)`, `$(S31:aux_N_name)`, `$(S31:group_N_name)`, `$(S31:buss_N_mode)`,
|
||||
`$(S31:mon_N_on)`, `$(S31:mon_N_level)`, `$(S31:mon_name)`, `$(S31:mon_mode)`,
|
||||
`$(S31:snapshot_name)`, `$(S31:connected)`, `$(S31:relay_clients)`, `$(S31:last_send_touched)`,
|
||||
`$(S31:last_rx)`.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- **No reply from console**: the console only sends to the iPad IP + Send Port set on the
|
||||
console. Check those, and that nothing else on this computer owns the local receive port
|
||||
(on AB-ProPresenter UDP 8002 belongs to Dante Via; 8000 and 9000 are free).
|
||||
- **Learn mode** logs every new address pattern once (Connections → log). Touch a control on
|
||||
the surface and the matching address appears; `$(S31:last_send_touched)` shows the last
|
||||
send/assign that changed.
|
||||
- Press **Reload from console** after a session change to refresh names and levels.
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"$schema": "../node_modules/@companion-module/base/assets/manifest.schema.json",
|
||||
"type": "connection",
|
||||
"id": "digico-s31",
|
||||
"name": "digico-s31",
|
||||
"shortname": "DiGiCo S31",
|
||||
"description": "DiGiCo S21/S31 aux-send control over OSC with a relay that lets several DiGiCo iPad apps share the console's single remote slot",
|
||||
"version": "0.1.0",
|
||||
"license": "MIT",
|
||||
"repository": "http://chronicles-ab.waterschurch.org:3000/Waters-Church/companion-module-digico-s31",
|
||||
"bugs": "http://chronicles-ab.waterschurch.org:3000/Waters-Church/companion-module-digico-s31/issues",
|
||||
"maintainers": [{ "name": "Waters Church Production" }],
|
||||
"legacyIds": [],
|
||||
"runtime": {
|
||||
"type": "node22",
|
||||
"api": "nodejs-ipc",
|
||||
"apiVersion": "2.1.3",
|
||||
"entrypoint": "../src/main.js"
|
||||
},
|
||||
"manufacturer": "DiGiCo",
|
||||
"products": ["S21", "S31"],
|
||||
"keywords": ["Audio", "Sound", "Mixer", "OSC"]
|
||||
}
|
||||
Reference in New Issue
Block a user