Commit Graph

202 Commits

Author SHA1 Message Date
daniel af34143107 feat(view): D2 Wave 2 — apply managed-lane ops + timer-diff auto-tag new content
Drives fixed-lane C_LANEPLAYS for managed lanes only (name-keyed, ordinal-renumber
safe) in the view shell; diffs live track/item GUIDs on the panel timer to auto-tag
new content to the active mode, first-poll-guarded. Pure guid_diff + lane_keys
modules unit-tested; folds in Wave-1 polish.
2026-07-23 17:32:22 -04:00
daniel 9a9339b90b refactor(capture): expose offline tail as docked-panel toggle
Replace the ...-with-tail variant actions with a pure tail_control module +
a docked-panel footer toggle (Off/Auto/Manual) read by CAPTURE_ITEM/TRACK.
Default None (byte-identical); Manual fixed 2s, in-memory session lifetime.
Tail mechanism unchanged; retired the variant ids.
2026-07-23 17:32:19 -04:00
daniel af5f7ee912 docs(plan): record Phase D2 two-canvas waves; archive landed D2-W1
Add a Phase D2 (two-canvas) section to PLAN.md with the open D2-W2
(shell) and D2-W3 (actions, persist, UI) waves in house style. Archive
the landed D2-W1 pure view_mode_model lane extension in COMPLETED.md.
2026-07-23 17:14:01 -04:00
daniel 2d225258b4 feat(capture): offline auto/manual tail via pure TailMode mapping
Add TailMode{None,Auto,Manual} + derived -72dB TRIMEND + 8s cap in render_settings;
wire into OfflineRenderBackend with snapshot/restore of the tail settings; add
CAPTURE_ITEM_TAIL/CAPTURE_TRACK_TAIL variant actions (plain actions stay exact-bounds).
2026-07-23 17:08:24 -04:00
daniel 7989d187a3 Merge: D2 Wave 1 — pure view_mode_model lane extension 2026-07-23 17:05:06 -04:00
daniel 6e901c198c feat(view_mode_model): add D2 pure lane model (ownership index, lane ops, auto-tag)
Extends the REAPER-free view_mode_model for per-item mode membership via fixed
lanes: lane->mode C_LANEPLAYS mapping, managed-vs-manual lane-ownership index,
managed-only item-lane ops in the toggle planner, "which lanes may this toggle
touch" query, auto-tag decision (manual-lane items exempt), and JSON round-trip
of the lane index. D1 behavior and tests unchanged.
2026-07-23 16:56:36 -04:00
daniel 68d3a3dba0 docs(context): reconcile capture spec to two-scope model
Update CONTEXT.md capture sections to two FX scopes (item/track,
chain-independent, no master, always wet): build-order step 7, offline/realtime
render API surface, the capture module sketch, and mark the realtime
wet-master-routing open question resolved (track-tap).
2026-07-23 16:51:33 -04:00
daniel 92762e2b6c Docs: reconcile to two-scope capture model (master removed)
Update the CLAUDE.md FX-scope invariant to item+track only; note master
removal in COMPLETED.md; drop master references from the tail spec and PLAN
Milestone T; realtime now taps the selected track.
2026-07-23 16:42:42 -04:00
daniel 2ae4c420c5 Merge: drop membership count from mode switch labels 2026-07-23 16:36:58 -04:00
daniel 9a6f30204a Merge: drop master scope; realtime taps selected track (fixes silent capture) 2026-07-23 16:35:44 -04:00
daniel 4ef41cf705 refactor(capture): drop master scope; realtime taps selected track
Capture is now item + track only (master removed as a scope; still bypassed
as out-of-scope chain). Realtime records the selected track's own output via
per-track post-fader sends into a hidden temp track, fixing the silent file.
2026-07-23 16:34:02 -04:00
daniel 1688de553b docs: settle Design View two-canvas sub-phase (fixed-lane per-item modes)
Item-level mode separation via REAPER fixed lanes; new content auto-tags to
the active mode; inactive lanes hidden and silenced; a managed-vs-manual lane
index keeps toggles off user comp lanes; capture placement mode-aware.
Precision invariants unaffected; REAPER 7 floor.
2026-07-23 16:32:58 -04:00
daniel 3791e6c119 docs: spec capture-tail feature (Milestone T)
Add docs/product/capture-tail.md (authoritative spec) and Milestone T in PLAN.md:
offline auto-trim (-72 dB) + manual tail modes, surgical RENDER_NORMALIZE
(trim-end-only), realtime PCM-decay-scan follow-on, invariant interactions,
and DAW-confirm items.
2026-07-23 15:38:16 -04:00
daniel 95d8017656 fix(bank_panel): drop membership count from mode switch labels 2026-07-23 15:36:40 -04:00
daniel ed9b5c6ad7 Merge M8: async realtime-record backend (master scope) 2026-07-23 15:27:14 -04:00
daniel bd187d4f89 feat(capture): M8 async realtime-record backend (master scope)
Timer-driven realtime capture behind ICaptureBackend (begin/tick/abort via
OnTimer, non-blocking). Records master into a hidden temp track, moved to the
bank non-destructively with idempotent restore across every terminal path.
Pure phase machine unit-tested. Track/item deferred; realtime is non-deterministic.
2026-07-23 15:16:36 -04:00
daniel 61e3d08849 docs: add CMake command cheat sheet 2026-07-23 14:58:26 -04:00
daniel f570cf364b Merge fix: prompt Save-As on Design View tag when project unsaved 2026-07-23 14:45:18 -04:00
daniel fad2544256 feat(actions): prompt Save-As on Design View tag when project is unsaved
Mirrors capture: when membership is non-empty and the project has no .rpp,
Main_SaveProject(proj, true) prompts Save-As before persisting; cancel leaves
the in-session tag state intact and warns via console.
2026-07-23 14:35:19 -04:00
daniel 74c91bfb31 Merge fix: persist Design View state after every mutating action 2026-07-23 14:18:07 -04:00
daniel cde8feda57 fix(actions): persist Design View state after every mutating action
Design View actions mutated the model but never pushed it to ext-state, so
tags/active-mode/snapshots were lost on save/reopen. Add persistViewState()
(saveToActiveProject) after each handler's apply/reapply.
2026-07-23 14:10:31 -04:00
daniel e1b2c0ba1b Docs: reflect three-scope FX capture rework; add FX-scope invariant + send-isolation TODO
Note the M7 four-mode -> three-FX-scope rework in COMPLETED.md; add the capture
FX-scope precision invariant to CLAUDE.md; record the send/routing isolation TODO
(coloring sends bleed into item captures) in PLAN.md open questions.
2026-07-23 14:01:28 -04:00
daniel bcd7def7c8 docs(design-view): resolve snapshot-durability + reconcile open questions
Reconcile-on-delete shipped; narrow the remaining deferrals to the FX-GUID
keying hazard and dormant-membership compaction. Drop the resolved
snapshot-durability question.
2026-07-23 13:37:10 -04:00
daniel c18f8aaff0 Merge FX-scope capture: three scope actions + full parent-chain independence 2026-07-23 13:36:13 -04:00
daniel d4ffea6918 feat(capture): neutralize parent/master gain, pan, width, law in FX-scope capture
FxBypassGuard now snapshots/restores D_VOL, D_PAN, D_WIDTH, D_PANLAW, I_PANMODE
alongside I_FXEN for every bypassed track (forcing stereo-pan mode for an
unambiguous render), so Track/Item captures are uncolored by parent/folder/master
fader and routing. All restored on every path.
2026-07-23 13:34:51 -04:00
daniel be0441fc4d Merge Design View hardening: reconcile orphaned snapshots on track delete 2026-07-23 13:34:39 -04:00
daniel f9af111c7a Reconcile orphaned Design View snapshots on track delete
Add ViewModeModel::reconcile(liveGuids) to prune snapshots of deleted
tracks; wire it into applyMode before planning. Keep membership so
undo-delete (same GUID) preserves the Design tag.
2026-07-23 13:27:42 -04:00
daniel 2c468bb40c docs(multi-bank): settle fork 5 — LICE tabs + both move affordances (Phase B closed)
5a: named-banks tab strip is LICE-drawn (matching M5 grid + Design View
segmented switch), with overflow/scroll in scope from B4 start.
5b: move ships as both a bindable "move to bank" menu and drag-between-regions;
copy stays the deliberate secondary act. Drag mis-drop mitigated by drop-target
highlighting and recoverable by design (index-only, reversible).

Phase B now fully settled (all five forks resolved), ready to scope into
implementation waves; only the active-bank indicator placement polish remains.
2026-07-23 13:13:04 -04:00
daniel df03b5e759 Rework capture into three FX-scope actions with inferred range
Replace the four capture modes with item/track/master scope actions. Each infers
its range (razor-else-time) and enforces FX scope via non-destructive
FX-bypass-around-render (RAII I_FXEN snapshot/restore over ancestors + master).
Corrects the defect of items captured through parent FX.
2026-07-23 13:12:36 -04:00
daniel dcbe5d7bdc docs(multi-bank): settle Phase B forks 1-4; draft fork-5 options analysis
Fold Daniel's decisions into CONTEXT.md, PLAN.md, and the product notes:
- Fork 1 (persistence): pool folds into the `banks` blob; legacy
  `bank_index` key retired after a one-way lossless migration.
- Fork 2 (delete): delete drops member index entries; add an `evacuate`
  verb (B1 pure op + B3 action) returning members to the pool. Design the
  orphaned-until-prune window and confirm-on-non-empty-delete guardrail.
- Fork 3 (move): move is the default gesture, copy the deliberate secondary.
- Fork 4 (active bank): active-bank and shown-tab stay distinct; the
  active-bank indicator must be visually unmistakable.

Fork 5 (tab rendering + move affordance) remains open with an options
analysis and pending recommendations. Additive; M0-M11 and Phase D untouched.
2026-07-23 13:06:21 -04:00
daniel d9081090fd docs(multi-bank): frame Phase B — pool + named banks spec
Add the multi-bank pillar as Phase B (lettered, parallel to M-line and
Phase D): CONTEXT.md §Multi-bank spec, PLAN.md Phase B block (B1 bank_book
pure / B2 persist / B3 actions / B4 panel split), and docs/product/multi-bank.md
framing. Additive only — BankIndex, the M0–M11 roadmap, and Phase D untouched.
2026-07-23 12:52:06 -04:00
daniel 43ca5e4069 Docs: reflect Phase D5 landing; close out Phase D
Archive D5 (mode switch) to COMPLETED.md and remove the completed Phase D
section from PLAN.md; add mode_switch to CLAUDE.md architecture + targets.
2026-07-23 12:47:13 -04:00
daniel 4700415fb6 Merge Phase D5: segmented Design View mode switch in bank panel 2026-07-23 12:43:27 -04:00
daniel 314c3331da Add D5 Design-View mode switch to bank panel
New pure mode_switch module (header-rect -> N equal segment rects + point hit-test, unit-tested) plus a segmented switch in the bank_panel header: one lit segment per registered mode, click activates via view::applyMode. Grid offset below the header.
2026-07-23 12:35:46 -04:00
daniel c78c7e3ddc Archive Milestone 7 in docs
Move completed M7 (wet capture action family) from PLAN.md to COMPLETED.md
with a wet-only decision note; add an M10 forward note that true dry needs
FX-bypass or the realtime pre-FX path, not a render bit.
2026-07-23 11:02:56 -04:00
daniel 9ff123e5e1 Merge M7: bindable capture action family (master/tracks/items/razor, wet) 2026-07-23 10:22:24 -04:00
daniel 7b530193b2 feat(capture): bindable capture family — master/tracks/items/razor (M7)
Four wet capture actions route to OfflineRenderBackend (snapshot/restore
RENDER_*, 32-bit float), produce a Sample, add to the bank, persist. Pure
render_settings maps source mode to RENDER_SETTINGS and parses P_RAZOREDITS
(tested). No arrange insertion. True dry deferred to M10.
2026-07-23 10:01:34 -04:00
daniel 56f2e3e308 docs(design-view): parent visibility = descendant-derived OR own membership
Untagged folder carrying its own FX/media shows in Arrange (its default) as
well as any mode derived from its children. Parents still never parked.
2026-07-23 06:33:24 -04:00
daniel fbb9cf5f36 Merge fix: parent visible by own membership or descendant (untagged folders show in both modes) 2026-07-23 06:27:24 -04:00
daniel 2c9b635edf fix(view): update parent-visibility comment to describe OR rule (own membership or descendant visible) 2026-07-23 06:22:16 -04:00
daniel 8d08279bdb Fix parent visibility: parent visible by own membership OR derived from children
visibleTracks pass 1 now evaluates every node (parent or leaf) by its own
membership, so an untagged folder carrying its own FX/media shows in Arrange
(its default) as well as any mode derived from its children. Adds case-matrix
tests; updates the nested-Arrange assertion to the corrected rule.
2026-07-23 06:17:34 -04:00
daniel bd5ca2f861 Archive Milestone 6 in docs
Move completed M6 (insert placement onto selected tracks at edit cursor)
from PLAN.md to COMPLETED.md with a decisions note.
2026-07-23 06:13:22 -04:00
daniel 4f1231ea81 Merge M6 change: insert onto selected track(s) at edit cursor 2026-07-23 05:59:11 -04:00
daniel 2536b4bedb fix: insert onto selected track(s) at edit cursor, not a new track
Wire both insert actions to CurrentTrack (InsertMedia base 0). Per selected
track: SetOnlyTrackSelected, reset cursor to snapshot, InsertMedia; then restore
original selection + cursor. No-op when no track selected. Corrected stale
extraflags / new-track / preservePitch comments.
2026-07-23 05:56:25 -04:00
daniel 1918610fb8 Merge fix: snapshot-once park guard (nested-folder toggle) + per-mode undo label 2026-07-23 05:56:23 -04:00
daniel dfd5d4477f fix(view): snapshot-once park guard + correct per-mode undo label
Only capture a track's pre-park snapshot when none exists, so a re-park while
already parked no longer overwrites it with hidden-state zeros (leaves vanished
after toggling twice). Undo label now names the actual target mode.
2026-07-23 05:50:19 -04:00
daniel 59e3c5907f Merge M6: insert selected bank sample at edit cursor via InsertMedia 2026-07-23 05:25:13 -04:00
daniel 172d5902c8 feat: add M6 insert — place selected bank sample at edit cursor
InsertMedia-driven placement reading the bank panel selection, undo-wrapped.
Native length by default; conform-to-tempo is an explicit second action, never
a silent stretch. Pure mode-bit logic (insert_plan) unit-tested.
2026-07-23 05:23:37 -04:00
daniel c7005807a6 docs(design-view): correct reversed untagged-track invariant to "every leaf is managed"
Untagged = Arrange member, fully parked in non-Arrange modes like a tagged
leaf; show-both opts out. Master/parents/mute-solo caveats preserved.
2026-07-23 05:13:54 -04:00
daniel 9df24f7a77 Merge fix: park untagged leaves in non-Arrange modes + immediate TCP/MCP refresh 2026-07-23 05:03:57 -04:00