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