Phase L3 role-lane UX preview (Look / Energy / Accent) - #86
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
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
CueFilebump) and DMX (the legacyCueSetlayer 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/ShowPreviewmodel, mock palette, typedShowSelselection — 10 unit tests including the carry-invisible()queryshow.rs:simulate_show_l3+ 5 tests; legacysimulate_showkeptwaveform/show_strip.rs+show_editor.rs(new): Perform painter and Prepare editor;lanes.rs/lanes_editor.rsdeletedapp.rs: seed-on-load,sync_showcross-player mirroring with adopt-on-load, rebuilt inspector row, typed selection keysTesting
cargo test --workspace: 117 passed (legacycues.rs/show.rssuites untouched and green — the persisted layer is intact)🤖 Generated with Claude Code