Skip to content

Releases: bitfocus/companion-module-waves-lv1

v1.1.0 - Custom expressions and variables in every field

Choose a tag to compare

@miglourenco miglourenco released this 16 Jul 20:15

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 (or 1 / 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 name field — 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.json version to match package.json (was lagging at 1.0.0).

v1.0.4 - Mute Group feedback fix

Choose a tag to compare

@miglourenco miglourenco released this 24 Jun 18:09

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

Choose a tag to compare

@miglourenco miglourenco released this 10 Jun 20:49

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

Choose a tag to compare

@miglourenco miglourenco released this 09 Jun 09:02

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 .gitignore with the template (/dist, /pkg, /*.tgz, DEBUG-*, /.yarn, /.vscode).
  • C4: replace the hand-rolled eslint.config.mjs with generateEslintConfig from @companion-module/tools. Fixes the lint failure cascading from the missing Node env.
  • C6: tsconfig.build.json now extends node22/recommended (matches the manifest runtime.type).
  • C7: package.json repository.url → bitfocus/companion-module-waves-lv1.
  • C8-C11: add postinstall (husky), husky + lint-staged devDeps, lint-staged config block.
  • C12: drop description / author / bugs / homepage from package.json.
  • H1: yarn lint now passes (was 211 errors, all auto-fixed via the new eslint config + prettier).
  • H2: discover() now returns a DiscoverHandle with stop() + done. discovery-cache tracks the in-flight handle and exposes cancelDiscovery(); destroy() and the restart branch of configUpdated() 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.IP validation.

Non-blocking — also fixed

  • M2: register() returns after a missing-ACK so it no longer falls through and emits registered/Status=Ok over 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) plus consecutiveFailures and current* 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 Connecting status between reconnect attempts)

v1.0.1 — TB feedback driven by InternalAssign

Choose a tag to compare

@miglourenco miglourenco released this 02 Jun 11:14

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 tbDestEnabled populated from /Notify/InternalAssign [8, 0, 2, sub, state, 1].
  • Feedback talkBackToOutput reads from the new map. True when the output is enabled as a TB destination in the LV1 panel (button lit).
  • Action talkBackToOutput does an optimistic update so the feedback flips immediately, since the LV1 doesn't echo /Set back 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

Choose a tag to compare

@miglourenco miglourenco released this 02 Jun 10:54

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/Gain on 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.

beta

Choose a tag to compare

@miglourenco miglourenco released this 02 Jun 00:00
Start