Vista Cues 1.0.0: which Vista 3 cue lists are live, from the network MIDI that fires them #48

Merged
christian merged 1 commits from claude/vista-cues into main 2026-10-11 11:24:15 -04:00
Collaborator

Why

Lighting at NA has no operator: ProPresenter fires the main scene lists and Tracks fires the FX lists in Vista 3, using MIDI notes over macOS network MIDI sessions. Companion on Ingest fires some too. Vista reports nothing back (its OSC only takes commands), so nobody in the booth can see what the lighting computer is doing.

What

A new module, modules/vista-cues/. It needs no shell changes and has no dependencies.

  • Listens rather than asks. A network MIDI session sends every note to every participant. The module joins the senders' sessions as one more participant, so it hears exactly what Vista hears. This is RTP-MIDI / AppleMIDI in plain Node (rtpmidi.js), with no native helper.
    • It invites each configured sender and keeps re-inviting when a sender drops.
    • It accepts invitations from anyone.
    • It advertises itself over Bonjour on macOS (dns-sd, run and stopped by the module) so it appears in Audio MIDI Setup's Directory.
  • Cue sheet in admin (mapping.js). One line per note, e.g. 0 = Pre Service, 61 release Walk-in, 127 release all, or 30 flash Blinder Flash 1. Note names, a channel and program changes are also supported.
    • Sheets with no release notes use [groups]: a Go replaces its group's live list.
    • The first group is the headline (the main scene). When Main group takes over is on (the default), a Go there clears the FX below it, matching how Vista's last-fired list takes precedence.
  • The tile shows the headline list large, with how long ago it fired and which sender fired it.
    • Below it: other live lists as group-labelled tags, the recent notes, and which senders are connected.
    • Four tile toggles; text size and "Clear live lists" are icons in the title bar.
    • The status dot goes red when no session is connected.
  • Admin settings: three senders (name plus endpoint), the cue sheet, middle C naming, the two takeover switches, and a folded This machine group (session name, port, Bonjour).
    • The default port is UDP 5040/5041, which stays clear of the 5009 session already on NA Ingest.
    • A busy port is retried instead of failing. Without this, a config save re-initialized the module before the old sockets had closed, and the port stayed taken.

Also included: tools/vista-midi-mock.js (a stand-in sender session for development), plus README and CLAUDE.md entries.

The tile shows what Vista was told, not what it confirmed. If Vista is closed or the desk is run by hand, the two can differ.

Testing

  • node modules/vista-cues/vista.test.js: 13 pass. Covers the parser (including the NA sheet's 53 notes), RTP-MIDI decoding (running status, Z flag, multi-byte deltas, sysex, journal), and real loopback sessions: invite and clock sync, re-init on the same port, a busy port, and Go/release/flash/group/takeover through the HTTP routes.
  • The module guide's resilience checklist, run against the mock in the browser:
    • kill the sender: the dot goes red and "No MIDI session" shows
    • restart the sender: it rejoins in about 2 s
    • restart ProdDash: it rejoins
    • two tiles with different settings
    • remove the tile: nothing left running
    • live admin save: re-initializes cleanly
    • page reload: settings kept
  • Not yet tested against the real NA sessions (NA-ProP 10.1.14.225:5004, NA-Tracks:5004, NA-Ingest:5009). That waits until after services.

🤖 Generated with Claude Code

## Why Lighting at NA has no operator: ProPresenter fires the main scene lists and Tracks fires the FX lists in Vista 3, using MIDI notes over macOS network MIDI sessions. Companion on Ingest fires some too. Vista reports nothing back (its OSC only takes commands), so nobody in the booth can see what the lighting computer is doing. ## What A new module, `modules/vista-cues/`. It needs no shell changes and has no dependencies. - **Listens rather than asks.** A network MIDI session sends every note to every participant. The module joins the senders' sessions as one more participant, so it hears exactly what Vista hears. This is RTP-MIDI / AppleMIDI in plain Node (`rtpmidi.js`), with no native helper. - It invites each configured sender and keeps re-inviting when a sender drops. - It accepts invitations from anyone. - It advertises itself over Bonjour on macOS (`dns-sd`, run and stopped by the module) so it appears in Audio MIDI Setup's Directory. - **Cue sheet in admin** (`mapping.js`). One line per note, e.g. `0 = Pre Service`, `61 release Walk-in`, `127 release all`, or `30 flash Blinder Flash 1`. Note names, a channel and program changes are also supported. - Sheets with no release notes use `[groups]`: a Go replaces its group's live list. - The first group is the headline (the main scene). When **Main group takes over** is on (the default), a Go there clears the FX below it, matching how Vista's last-fired list takes precedence. - **The tile** shows the headline list large, with how long ago it fired and which sender fired it. - Below it: other live lists as group-labelled tags, the recent notes, and which senders are connected. - Four tile toggles; text size and "Clear live lists" are icons in the title bar. - The status dot goes red when no session is connected. - **Admin settings:** three senders (name plus endpoint), the cue sheet, middle C naming, the two takeover switches, and a folded **This machine** group (session name, port, Bonjour). - The default port is UDP 5040/5041, which stays clear of the 5009 session already on NA Ingest. - A busy port is retried instead of failing. Without this, a config save re-initialized the module before the old sockets had closed, and the port stayed taken. Also included: `tools/vista-midi-mock.js` (a stand-in sender session for development), plus README and CLAUDE.md entries. The tile shows what Vista was **told**, not what it confirmed. If Vista is closed or the desk is run by hand, the two can differ. ## Testing - `node modules/vista-cues/vista.test.js`: 13 pass. Covers the parser (including the NA sheet's 53 notes), RTP-MIDI decoding (running status, Z flag, multi-byte deltas, sysex, journal), and real loopback sessions: invite and clock sync, re-init on the same port, a busy port, and Go/release/flash/group/takeover through the HTTP routes. - The module guide's resilience checklist, run against the mock in the browser: - kill the sender: the dot goes red and "No MIDI session" shows - restart the sender: it rejoins in about 2 s - restart ProdDash: it rejoins - two tiles with different settings - remove the tile: nothing left running - live admin save: re-initializes cleanly - page reload: settings kept - **Not yet tested against the real NA sessions** (NA-ProP 10.1.14.225:5004, NA-Tracks:5004, NA-Ingest:5009). That waits until after services. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
christian added 1 commit 2026-10-11 11:16:03 -04:00
Vista 3 reports nothing about what it is playing — its OSC only takes
commands — so a booth with no lighting operator can't see the lighting
computer. ProPresenter, the tracks rig and Companion fire Vista's cue lists
with notes over macOS network MIDI sessions, and a session sends every note
to every participant, so the module joins those sessions as one more
listener (RTP-MIDI in plain Node, no helper) and hears what Vista hears.

The admin's cue sheet turns notes into Go / release / pause / back / flash
on named lists. Sheets with no release notes use [groups]: a Go replaces its
group's live list, and the first group is the headline — the main scene —
which takes over the look and clears the FX below it. The tile shows the
headline list large with how long ago and who fired it, the other live
lists as tags, recent notes, and which senders are connected.

The module invites each configured sender and keeps re-inviting, accepts
invitations from anyone, and advertises itself over Bonjour on macOS. A
busy port (a config save re-initing before the old sockets close) is
retried rather than failing. Default session port is 5040/5041, clear of
the 5009 session on NA Ingest.

tools/vista-midi-mock.js is a stand-in sender for development;
modules/vista-cues/vista.test.js covers the parser, packet decoding and
real loopback sessions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
christian merged commit e8ad99a4ce into main 2026-10-11 11:24:15 -04:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: michael/ProdDash#48