Skip to content

Phase L3 role-lane UX preview (Look / Energy / Accent) - #86

Merged
robmorgan merged 6 commits into
mainfrom
chore/deck-ui-cleanup
Jul 29, 2026
Merged

Phase L3 role-lane UX preview (Look / Energy / Accent)#86
robmorgan merged 6 commits into
mainfrom
chore/deck-ui-cleanup

Conversation

@robmorgan

Copy link
Copy Markdown
Owner

Summary

Replaces the fixture-taxonomy trigger lanes (Lighting / Pixels / FX) under the waveforms with the Phase L3 role-based lanes, as an interactive, session-only UX preview — the shape ROADMAP's Phase L3 describes, built to be felt before the real landing:

  • Look lane — sparse beat-snapped events, each holding until the next; blocks tinted by an 8-look mock palette so the strip reads as the track's color script. Active look highlighted and tinting the gutter label.
  • Energy lane — a piecewise-linear breakpoint envelope (DAW-automation style): the narrative arc, directly visible and editable.
  • Accent lane — bar-precise one-shots keeping the legacy cue editor's draw/move/resize gestures.

Tracks auto-seed a deterministic demo show on load (simulate_show_l3: look changes at phrase boundaries, intro→build→drop→breakdown→outro energy arc, drop-focused accents). Prepare gets full direct manipulation: create-then-slide look events with the armed palette look, two-axis breakpoint drags (right-click deletes), swatch click arms + reassigns, INT slider for accents, Clear ▾ and Reset demo show. Edits mirror live across decks and the audition player.

Deliberately not in scope: persistence (no DB/schema changes, no CueFile bump) and DMX (the legacy CueSet layer still drives the rig and STORE-from-live — live output is unchanged). Rubber-band select and cue copy/paste are dropped from the preview; both return with the full L3 landing. This also supersedes Phase L2 step 1 for the look lane (hold-until-next makes same-lane overlap inexpressible).

Changes

  • show_preview.rs (new): LookLane / EnergyLane / ShowPreview model, mock palette, typed ShowSel selection — 10 unit tests including the carry-in visible() query
  • show.rs: simulate_show_l3 + 5 tests; legacy simulate_show kept
  • waveform/show_strip.rs + show_editor.rs (new): Perform painter and Prepare editor; lanes.rs / lanes_editor.rs deleted
  • app.rs: seed-on-load, sync_show cross-player mirroring with adopt-on-load, rebuilt inspector row, typed selection keys
  • ROADMAP: lighting status paragraph updated

Testing

  • cargo test --workspace: 117 passed (legacy cues.rs / show.rs suites untouched and green — the persisted layer is intact)
  • Visually verified live (screenshots in session scratchpad): seeded Prepare editor; mid-drop Perform strip showing the Strobe White → Red Drop boundary, pinned carried-in labels, energy riding high at the drop, accent hit; programmer latch rendering the look row hollow while energy/accents stay live
  • Five app runs with zero underruns/panics in logs
  • Editor drag gestures are unit-tested + ported from the proven legacy editor but were not exercised live (machine was locked during verification) — trying them is the point of this preview

🤖 Generated with Claude Code

robmorgan and others added 6 commits July 26, 2026 19:21
Engaging a scrub with the playhead parked at end-of-track seeded the
voice at total_frames — one past the last valid frame — and the first
write_frame read indexed exactly source.len(), panicking on the audio
callback thread. The panic can't unwind through coreaudio's extern "C"
render callback, so the whole app aborted (SIGABRT).

Guard write_frame's base index against the last frame and re-clamp the
seeded position into the current source's range at the top of render /
render_settle, so an EOF engage (or a snapshot swapped mid-gesture)
holds the final sample instead of indexing out. Regression test seeds
at exactly total_frames through both the render and settle paths.

Also carries the in-progress elastic lead-in scrub changes that were
already in the working copy of scrub.rs, which the clamps build on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deck UI: per-deck right sidebar (BPM, keylock, master/sync, pitch fader
restyled with a chunky cap and dense tick ladder), captioned control
groups (transport/nudge/loop/hot-cues/gate/quantize), a key badge in the
header, single elapsed/remaining readout with a toggle, bar numbers and
red cue markers on the zoomed view, bar numbers on the overview, and a
left label gutter for the LGT/PXL/FX lanes.

Also bundles the in-progress auto-cue feature (park the deck at the first
downbeat on load, persisted per deck) and the related state.rs/audio.rs
changes that were pending in the working tree.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Uniform 30px height across play, cue, nudge, and all loop buttons; play
button gets a constant green border to match the amber cue outline. Loop
row is now IN/OUT/÷2/4 BEATS/×2/EXIT with the beats chip centered, and
every loop button except the chip is a fixed 45px wide.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Section captions (TRANSPORT, NUDGE, LOOP, HOT CUES, GATE, QUANTIZE, AUTO
CUE) render in a lighter grey when the enclosing scope is enabled, falling
back to the dim weak color when no track is loaded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
BPM now sits in the header to the right of the elapsed/remaining time
(with the toggle between them) instead of atop the sidebar. It renders
amber when the deck is the master tempo reference and white otherwise;
the sidebar starts at KEYLOCK and the pitch fader fills the freed space.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the fixture-taxonomy trigger lanes (Lighting/Pixels/FX) with the
Phase L3 role lanes in both views, as an interactive session-only
preview:

- show_preview.rs: LookLane (beat-snapped events, hold-until-next),
  EnergyLane (piecewise-linear breakpoint envelope), accents on CueSet,
  mock 8-look palette, typed ShowSel selection
- simulate_show_l3: deterministic seed per track — look events at phrase
  boundaries, intro→drop→outro energy arc, drop-focused accents
- show_strip.rs (Perform, read-only color script with active-look
  highlight and hollow-on-programmer-override) and show_editor.rs
  (Prepare: create-then-slide looks, two-axis breakpoint drags, legacy
  accent gestures); classic lanes.rs/lanes_editor.rs deleted
- app wiring: seed on load, sync_show mirroring across players, palette
  swatch toolbar with arm+reassign, Reset demo show

Nothing persists and the DMX path is untouched — the legacy CueSet layer
still drives the rig and STORE-from-live, so live output is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@robmorgan
robmorgan merged commit 3d15085 into main Jul 29, 2026
2 checks passed
@robmorgan
robmorgan deleted the chore/deck-ui-cleanup branch July 29, 2026 23:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant