Measured on the booth relay with debug logging on: while dragging a
fader, the DiGiCo iPad app sends /Input_Channels/N/fader at most every
45 ms (about 22 per second; 16/s on average while moving). Fades now
step every 45 ms to match (was 50 ms). Verified on the S31 with a
switched-off matrix send: 23 steps in 1 s, landing exactly on target.
New debug aid: with "Debug logging" on, the module logs every 5 s, per
iPad, the busiest address patterns with their message rate and the
shortest gap between two messages to the same address.
The fade tests now derive their step counts from the exported
FADE_STEP_MS. npm test: 542 checks pass on Node 25 and on Companion's
Node 22.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Groups were only reachable through the generic "Buss:" actions, whose
dropdown mixes all 25 busses, so users could not find group fader
control.
- New "Group:" and "Aux master:" mute, solo, set fader (with fade time)
and adjust fader actions; their dropdowns list only busses of that
type. Matching muted, solo, fader text/position, meter, signal and
peak feedbacks.
- The old buss_* actions and feedbacks keep working for existing
buttons and are now labelled "Any buss (aux or group)".
- Presets: "Busses" is split into "Groups" and "Aux masters", and the
bus meters into "Group meters" and "Aux meters". A bus that changes
type on the console moves section on the next rebuild.
npm test: 542 checks pass on Node 25 and on Companion's Node 22.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Every set-level action (input, bus, matrix and control group faders,
aux and matrix sends) has a fade time and a curve: fader travel
(natural), fader travel with ease in/out, or linear in dB. Fades step
at 20 Hz, land exactly on the target, never overshoot, and are
cancelled by any new move on the same fader; new "Stop all fades"
action, fades_running variable and fade_running feedback. Verified on
the S31 with a switched-off matrix send: 20 writes in 1 s, ending
exactly on target, then restored.
- Matrix sends now look like mutes in the presets: red when the send is
off, black when it is on (new matrix_send_off feedback, true only when
the send is known to be off).
- Matrix send knobs carry a meter column on the right. The S31 has no
meter for matrix inputs, so it shows the destination output's meter.
Meter gauges use a faint track so an empty meter reads as empty.
- Test fixes: the meter-resubscribe check no longer depends on a silent
channel changing value, plus back-to-back /Meters/clear coverage.
npm test: 504 checks pass on Node 25 and on Companion's Node 22.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found on the live S31 (read-only, plus meter subscriptions):
- Matrix inputs are named at /Matrix_Inputs/N/Channel_Input/name (an
address missing from DiGiCo's 2014 list). Their names now appear in
every matrix-send dropdown, preset and the new matrix_in_N_name
variables, falling back to "Matrix In N" when empty. Matrix inputs also
get trim and phase.
- Console names are space-padded where the surface wraps them; every name
is now trimmed and its whitespace runs collapsed ("LEAD V RESI").
- Meter values are inverted: 127 is silence and lower is louder, about
1 dB per step below full scale (silent channels read 127, the room mic
36-48). The module treated 127 as peak. Level meters now read dBFS
(approximate), gauges span -60..0 dBFS, signal and peak thresholds are
in dBFS; gain reduction reads dB of reduction, 127 meaning none.
- Bus and matrix outputs have meters (/Aux_Outputs, /Group_Outputs and
/Matrix_Outputs/N/Output/meter): new signal, peak, value and gauge
feedbacks and "Buss meters" / "Matrix meters" presets.
3002 presets, 2.7 MB. npm test: 425 checks pass on Node 25 and on
Companion's Node 22. Deployed and checked on the booth Companion 5.1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Companion 5.1 marks image-buffer feedbacks as deprecated, and its layered
buttons have a Gauge element that follows a number directly. So:
- New numeric value feedbacks for gauges: fader/level position 0-100 for
inputs, busses, matrix outputs, control groups, aux sends and matrix
sends (one shared fader taper: 0 dB at 75 %, -inf at 0), raw pan 0..1
for a symmetric gauge, GEQ band dB, and input meter position.
- Every knob and meter preset is now a layered preset: background box,
channel name, live dB text and a Gauge bound to $(local:pos); on/off and
mute tint the background. Meters use a vertical green/amber/red gauge.
Text uses size 100 with shrink-to-fit (14 rendered tiny on 5.1) and the
level gauge is white so it stays visible on a green background.
- The old image-bar feedbacks keep working and are labelled "(legacy
image)"; HELP.md explains how to add a gauge to your own button.
- A sleeping iPad no longer logs a relay send error every few seconds:
one warning per iPad per 10 minutes.
Checked on the booth Companion 5.1: the layered knob previews show live
names, levels and gauge fills. npm test: 392 checks pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A matrix-send knob looked dead on the booth Companion although the console
followed it (verified through Companion's rotate API: -90 -> -60 -> -59):
the module had matrix send actions but no matrix send feedbacks.
- Every action with a readable state now has a matching feedback: matrix
send on/level text/level bar, matrix and control group solo and fader
bars, graphic EQ in and band gain text/bar, aux send pan text, and value
text for trim, gain and filter frequencies. A test checks the parity.
- New action: matrix output solo.
- Matrix sends use the console's -90 dB floor: adjusting down from -inf no
longer writes -150 there.
- Presets: "Matrix sends to <output>" (on/off and knob per matrix input)
and graphic EQ in/out. 2970 presets, 1.8 MB.
npm test: 368 checks pass on Node 25 and on Companion's Node 22.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Verified on a live S31 against an unused, silent input (restored after):
a float fader write is accepted and echoed, but a mute written as int 0/1
or as an OSC True/False is silently ignored, while a float 1.0/0.0 works.
DiGiCo's 2014 SD command list says int, which is wrong for the S31.
Every switch (mute, solo, send on, group assign, EQ/dynamics/filter/
insert/delay switches, phantom, phase, pad, GEQ in) now goes out as a
float. The mock console now ignores int and T/F switch writes the same
way the console does, so a regression to int fails 38 checks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rewrite of the module around what the console itself reports:
- Settings cut to console address/ports, the iPad relay and debug logging;
nothing site-specific remains. An upgrade script carries v1 configs and
remaps v1 actions/feedbacks whose ids were reused.
- On connect the module reads every name, buss type (aux/group), stereo
mode, fader/mute/solo/pan and the snapshot list; entities that never
answer are hidden. Definitions rebuild (debounced, skipped when
identical) when names, buss types or snapshots change.
- Every entity option is a searchable dropdown of live names. 70 actions
cover inputs, aux sends, group assigns, busses, matrix outputs and sends,
control groups, graphic EQs, channel-strip switches, trim/gain/filters and
snapshots, each level with set and encoder-friendly adjust variants.
- Boolean, value and bar feedbacks for every state, input level and
gain-reduction meters via the console's meter subscription protocol, and
about 2800 presets including rotary knob presets with live level text.
- A write guard keeps fast encoder turns from being undone by delayed
echoes; feedbacks are re-checked per instance.
- Relay: the client table survives config changes, idle iPads are kept for
an hour by default (0 = forever), bind failures retry and show in status.
npm test: 326 checks pass on Node 25 and on Companion's Node 22.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first copy came from an intermediate run (951 of 1363 addresses). The
final run (995 of 1380) adds a verification pass that re-queries addresses
also seen in other controllers' traffic, and shows that the /Console count
queries never answer: the counts only arrive as a burst on first contact.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>