AbleSet 1.0.0: follow AbleSet's setlist over OSC #17

Merged
michael merged 3 commits from claude/proddash-ableset-module-6c2556 into main 2026-09-27 09:02:27 -04:00
Owner

A new ableset module. AbleSet has no web API, but it has an OSC API over UDP (port 39051). The module's server subscribes (/subscribe auto <port> + /getValues), watches AbleSet's 2-second heartbeat, and resubscribes when it goes quiet, because a restarted AbleSet forgets its subscribers. Tiles get one SSE stream: state on change, pos 5×/s while playing. They extrapolate the playhead from the tempo between packets.

Tiles (one picker entry each)

  • Now Playing: song, BPM, time signature, duration, time left/elapsed, section, three-part progress bar (played sections · this section · playhead), next song, "N songs (mm:ss) left". Time-left badge goes amber/red near the end.
  • Song Sections: sections sliding horizontally with the current one centred and filling; a title-bar icon switches to a vertical lottery-wheel view (saved per tile).
  • Setlist, Transport, Tempo (beat lights), Song Time, Set Time (with end-of-set clock), Section (bars/beats to the change, amber in the last bar or while looping), Next Song (queued in amber), AbleSet Status (AbleSet, Live, loading, recording, audio interfaces).
  • Song and set countdowns are offered to the Timers module (provides: ["timers"]).

Details

  • Zero deps: osc.js is a small OSC 1.0 codec on Buffer.
  • When Live is disconnected, AbleSet stops sending time-left values. The module then works time left out from song length and playhead, and the set total as that plus the rest of the setlist.
  • Admin config is one endpoint (blank host; AB is AB-Tracks.local). Gear settings follow rules 5–11.
  • tools/ableset-mock.js plays a setlist over the same API (--stopped, --no-live, --speed); listed in CLAUDE.md and the module guide.

Tested

  • Against the real AbleSet on AB-Tracks: it followed setlist edits live, and showed Live disconnected and project loading as they happened.
  • Against the mock: section changes, the loop, the queued song, and song changes.
  • Resilience: killed the mock → red plus "AbleSet offline"; it recovered by itself on restart. Two sections tiles in different views ran independently. No console errors. The Timers module picks up the Song and Set timers.

🤖 Generated with Claude Code

A new `ableset` module. AbleSet has no web API, but it has an OSC API over UDP (port 39051). The module's server subscribes (`/subscribe auto <port>` + `/getValues`), watches AbleSet's 2-second heartbeat, and resubscribes when it goes quiet, because a restarted AbleSet forgets its subscribers. Tiles get one SSE stream: `state` on change, `pos` 5×/s while playing. They extrapolate the playhead from the tempo between packets. **Tiles** (one picker entry each) - **Now Playing**: song, BPM, time signature, duration, time left/elapsed, section, three-part progress bar (played sections · this section · playhead), next song, "N songs (mm:ss) left". Time-left badge goes amber/red near the end. - **Song Sections**: sections sliding horizontally with the current one centred and filling; a title-bar icon switches to a vertical lottery-wheel view (saved per tile). - **Setlist**, **Transport**, **Tempo** (beat lights), **Song Time**, **Set Time** (with end-of-set clock), **Section** (bars/beats to the change, amber in the last bar or while looping), **Next Song** (queued in amber), **AbleSet Status** (AbleSet, Live, loading, recording, audio interfaces). - Song and set countdowns are offered to the Timers module (`provides: ["timers"]`). **Details** - Zero deps: `osc.js` is a small OSC 1.0 codec on Buffer. - When Live is disconnected, AbleSet stops sending time-left values. The module then works time left out from song length and playhead, and the set total as that plus the rest of the setlist. - Admin config is one `endpoint` (blank host; AB is `AB-Tracks.local`). Gear settings follow rules 5–11. - `tools/ableset-mock.js` plays a setlist over the same API (`--stopped`, `--no-live`, `--speed`); listed in CLAUDE.md and the module guide. **Tested** - Against the real AbleSet on AB-Tracks: it followed setlist edits live, and showed Live disconnected and project loading as they happened. - Against the mock: section changes, the loop, the queued song, and song changes. - Resilience: killed the mock → red plus "AbleSet offline"; it recovered by itself on restart. Two sections tiles in different views ran independently. No console errors. The Timers module picks up the Song and Set timers. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
michael added 1 commit 2026-09-23 14:24:42 -04:00
A new module that subscribes to AbleSet's OSC API (UDP 39051) and streams
what it is playing to ten tiles: Now Playing (song, tempo, meter, duration,
time left, section, progress bar, next song, songs left), Song Sections
(a sliding strip, or a lottery wheel from the title bar), Setlist,
Transport, Tempo, Song Time, Set Time, Section, Next Song and Status, each
coloured by its state. The song and set countdowns are offered to the
Timers module.

A heartbeat watchdog resubscribes when AbleSet goes quiet (a restarted
AbleSet forgets its subscribers). Time left falls back to the song length
and playhead when AbleSet stops sending it (Live disconnected).

tools/ableset-mock.js plays a setlist over the same API for testing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
michael added 1 commit 2026-09-23 16:07:24 -04:00
Every gear change remounts the tile, and the remounted tile joins the
page's shared stream mid-flow, so it heard nothing until AbleSet next
changed — with the transport stopped, never. Tiles went blank until a
reload. The tile now fetches /state when it starts and whenever the
stream (re)opens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
michael added 1 commit 2026-09-27 09:01:46 -04:00
michael merged commit de32046553 into main 2026-09-27 09:02:27 -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#17