Releases: bitfocus/companion-module-waves-lv1
Release list
v1.1.0 - Custom expressions and variables in every field
New: Companion variables and expressions in every field
Every action and feedback now lets you drive its values from Companion variables and expressions.
Dropdowns (Group, Channel, Input channel, Aux destination, State, Scene)
Each affected dropdown gained a ✎ Custom (expression)… entry as the first option. Selecting it reveals a paired textinput with variable support — type $(mod:my_var) or any expression that resolves to the target value.
- Group / Channel: numeric group ID + 1-based channel index (works across Input, Group bus, Aux, Matrix, DCA, and singleton masters).
- State: accepts
on/off/toggle(or1/0/true/false/mute/unmute/ etc.). - Scene: 0-based scene index.
Numeric fields (now textinput with variables)
Converted from type:number to textinput with useVariables: true so you can pass expressions:
- dB — channel out, send gain, preamp, trim, fade target, EQ band gain
- Pan / Width — channel + send pan values
- Duration (ms) — fade ramp time
- Band / Bank / Slot — EQ band, Spill bank + slot
- Mute Group number (1–8)
- User Key number (1–16)
- Scene index (recall by index)
- Meter threshold + sub-channel (feedback)
- Rename
namefield — variables inside track names
Backwards compatible
Existing buttons keep working. Old configs saved with the numeric channel field are handled by the resolver fallback. Nothing you configured before this release needs to be re-created.
Housekeeping
- Sync
companion/manifest.jsonversion to matchpackage.json(was lagging at 1.0.0).
v1.0.4 - Mute Group feedback fix
Mute Group feedback now driven from real LV1 traffic
Pressing a mute group on the LV1 surface or iPad now correctly updates the Companion muteGroup feedback (red/green) and the mg_N variables across all connected clients.
The bug
The previous handler waited for /Notify/MuteGroup (the apparent twin of the /Set/MuteGroup address). The LV1 NEVER broadcasts on that address. As a result, the Mute Group feedback only ever reflected our own optimistic local writes — not changes made on the surface or from another client.
Root cause
Captured live with mgwatch in lv1-debugger on 2026-06-17: the LV1 multiplexes mute-group state over the regular track-mute address using a pseudo-group g=13:
/Notify/Track/Out/Mute ,iiiT [g=13, mg_idx(0..7), state(0|1), validFlag=T]
Fix
The /Notify/Track/Out/Mute handler now intercepts g=13 and routes the message to muteGroups state + mg_N variables + muteGroup feedback, instead of treating it as a channel mute. The stub for /Notify/MuteGroup stays in case a future firmware adds it natively.
v1.0.3 — Save now works with auto-discovery
Bug fix: Save button stayed disabled when using auto-discovery
v1.0.2 added `Regex.IP` validation on the optional host textinput to satisfy review finding H6. Unfortunately `Regex.IP` rejects the empty string, so the field was always invalid when the user just picked an LV1 from the discovery dropdown (which is the standard flow — the host override is meant to be left blank in that case). With one invalid field, Companion disabled the Save button.
Fix
The host field now accepts either an empty string (= use the dropdown selection / auto-discovery) or a valid dotted-quad IPv4 (= manual override). Both standard flows work:
- ✅ Pick an LV1 from the discovery dropdown, leave host empty → Save enabled.
- ✅ Type a manual IP in the host field → Save enabled.
- ❌ Type something that isn't an IP → field marked invalid, Save disabled.
v1.0.2 — Bitfocus review fixes
Addresses every blocking finding from the v1.0.1 review plus several non-blocking ones.
Critical / High (blocking) — fixed
- C1: add
.husky/pre-commit(runs lint-staged). - C2: align
.gitignorewith the template (/dist,/pkg,/*.tgz,DEBUG-*,/.yarn,/.vscode). - C4: replace the hand-rolled
eslint.config.mjswithgenerateEslintConfigfrom@companion-module/tools. Fixes the lint failure cascading from the missing Node env. - C6:
tsconfig.build.jsonnow extendsnode22/recommended(matches the manifestruntime.type). - C7:
package.jsonrepository.url →bitfocus/companion-module-waves-lv1. - C8-C11: add
postinstall(husky),husky+lint-stageddevDeps, lint-staged config block. - C12: drop
description/author/bugs/homepagefrom package.json. - H1:
yarn lintnow passes (was 211 errors, all auto-fixed via the new eslint config + prettier). - H2:
discover()now returns aDiscoverHandlewithstop()+done.discovery-cachetracks the in-flight handle and exposescancelDiscovery();destroy()and the restart branch ofconfigUpdated()both cancel any in-flight scan so the multicast socket releases immediately (no more lingering port 13337 holds). - H4: remove 5
checkFeedbacks()calls that targeted non-existent ids (channelGain,sendGain,channelName,tempo,currentLayer). Fix'meter'→'meterLevel'. Add'currentSceneByName'to the scene-recall handlers so name-based scene feedbacks update live. - H6: host textinput now uses
Regex.IPvalidation.
Non-blocking — also fixed
- M2:
register()returns after a missing-ACK so it no longer falls through and emitsregistered/Status=Okover a half-open link. - M4: TCP socket gets a 5 s connect deadline (
setTimeout(5000)) that destroys the socket on'timeout'so a dead host falls into reconnect promptly instead of hanging at the OS default. - L3:
configUpdated()restart now clears every state map (channels/sends/muteGroups/meters/scenes/userKeys/spillStates/tbDestEnabled/detected) plusconsecutiveFailuresandcurrent*trackers before reconnecting.
Still open (next round)
- M1 (swallowed discovery socket/bind errors)
- M7 (
refreshDiscovery()/rediscoverPort()not cancellable) - L8 (UserKeyInfo accepts k up to 31)
- NTH2 (no
Connectingstatus between reconnect attempts)
v1.0.1 — TB feedback driven by InternalAssign
Talk Back feedback now reflects panel state
The "Talk Back engaged to output" feedback no longer infers state from send-gain levels. It now reads directly from /Notify/InternalAssign with type=2, which is the LV1's authoritative signal for the TB destination buttons in the TALK BACK panel.
What changed
- New internal state map
tbDestEnabledpopulated from/Notify/InternalAssign [8, 0, 2, sub, state, 1]. - Feedback
talkBackToOutputreads from the new map. True when the output is enabled as a TB destination in the LV1 panel (button lit). - Action
talkBackToOutputdoes an optimistic update so the feedback flips immediately, since the LV1 doesn't echo/Setback to the originator.
Why this matters
Before, the feedback only went green while the TALK mic was actually flowing (gain > -100 dB). It missed the panel-config state — i.e. a destination could be enabled but the feedback would still be off if TALK wasn't pressed. Now it tracks the destination button state in the panel directly, which is what users expect.
v1.0.0 — Initial release
First release of the Waves LV1 Companion module.
What it does
Control a Waves LV1 digital mixer over its native OSC-over-TCP protocol — the same wire-level protocol as the iPad MyFOH app.
Features
- Auto-discovery of LV1s on the LAN (multicast on 225.1.1.1:13337) with manual IP override fallback.
- Mute / Solo for any track (Input / Group / Aux / LR / Center / Mono / Matrix / Cue / TalkBack / DCA).
- Mute Groups 1-8.
- Faders: instant set + smoothly fade to dB target (0-60 s linear in dB).
- Pan / Width for channels and sends.
- Sends on/off/toggle.
- Preamp input gain, digital trim, +48 V, polarity, plugin section enables (EQ / Filter / Comp / De-Esser / Dyn / Gate / Leveler / Limiter).
- EQ band Freq / Gain / Q for bands 1-6.
- Scenes: recall by index, by name, next, previous.
- User Keys 1-16 (momentary or hold).
- Tap Tempo.
- Talk Back: per-aux ON/OFF/Toggle (uses
/Set/Aux/Send/On+/Set/Aux/Send/Gainon group 8). - Flip Sends via a User Key configured on the LV1.
- Spill buttons.
- Clear All Solo.
- Channel rename.
Feedbacks
Mute, Solo, Send On, Mute Group, Channel color, Meter above threshold, Scene match, Any track soloed, Talk Back to output, Spill active, Flip-to-faders (requires "Aux Cue On Flip" on the LV1).
Variables
Per-track name / mute / solo / gain / color. Globals: tempo, scene, mute groups, etc.
Notes
- Built by reverse-engineering the public network traffic of the Waves MyFOH / MyMon apps and static analysis of
MyMonService.dll. Not affiliated with Waves Audio Ltd. - Group / Matrix / Main destinations in the TALK BACK panel are NOT exposed via OSC on the current Waves API; only Aux / FX / Mon destinations are.