Commit Graph

623 Commits

Author SHA1 Message Date
daniel ce2998c3c7 Merge: D2 W3-A — mint managed lanes to separate cross-mode content per stance 2026-07-23 20:17:27 -04:00
daniel 92827c59be Lock M10 provenance spec to Daniel's fork picks (P1=a, P2=a)
Settle the reshaped Milestone 10: thin capture-recipe fingerprint and
bank-only re-capture; P3/P4 closed as moot. Remove the pending-picks
banner in PLAN.md and stamp the provenance product note as settled.
2026-07-23 20:10:54 -04:00
daniel b182146f9a feat(view): mint managed lanes to separate cross-mode content per stance (D2 W3-A)
Pure planLaneMinting decides which tracks hold >1 mode's content and which managed
lane each item lands on; view.cpp applies it (I_FREEMODE/I_NUMFIXEDLANES/P_LANENAME/
I_FIXEDLANE) under one undo block, driven off the auto-tag detection tick. Manual lanes
and their items are never touched. Load-time reconcile rebuilds ownership from durable
lane names before reapplying active-mode visibility.
2026-07-23 20:08:38 -04:00
daniel 1743df135b Reshape M10 to provenance-only, reconciled with dual-canvas
Cut the null-test verify action and pre-FX-dry mechanism (Daniel's
call); keep provenance + re-capture-from-source. Sample.provenance
already exists/round-trips (M1), so M10 populates and consumes it. Add
docs/product/provenance.md with dual-canvas forks P1-P4 and the leaned
bank-only path; rewrite PLAN.md M10 as a proposal pending fork picks.
2026-07-23 20:04:54 -04:00
daniel 5b19525ec0 Merge B1: pure bank_book registry (pool + named banks, move/copy, JSON round-trip) 2026-07-23 19:37:47 -04:00
daniel fed70c0a80 Merge: fix reload-in-Design mis-tagging Arrange tracks into Design 2026-07-23 19:31:29 -04:00
daniel 02b6350dc9 fix(bank_panel): drive new-content baseline re-arm from persist's load signal
The detector re-armed its GuidBaseline on a pointer compare (proj != lastProject),
a weaker signal than persist's GUID-primary identity. On a load onto a recycled
ReaProject* the baseline never reset, so the just-loaded project's pre-existing
tracks diffed against the previous project and were mass-tagged into the active
mode — opening a Design-saved project mis-tagged its Arrange tracks. Re-arm now
rides persist's authoritative load signal via bankPanelNotifyProjectLoaded().
2026-07-23 19:26:06 -04:00
daniel 54d3ce3958 docs: archive tail follow-ons; add tail_setting key to persist doc
Record the Manual scroll fine-adjust + per-project tail persistence in
COMPLETED.md; name all three reasampler ext-state keys in CLAUDE.md.
2026-07-23 19:23:44 -04:00
daniel 0114559bdb Merge tail follow-ons: Manual fine-adjust (scroll) + per-project persistence 2026-07-23 19:20:28 -04:00
daniel beaec8642a fix: tail toggle/scroll now commits to ext-state immediately
markTailDirty() called MarkProjectDirty() but never called
saveToActiveProject(), so the new tail value was never written
to SetProjExtState. On unsaved projects saveToActiveProject()
no-ops cleanly, resolving the companion Major at the same time.
2026-07-23 19:19:10 -04:00
daniel 37affc6a70 Add tail manual fine-adjust (scroll) + per-project tail persistence
Relocate TailSetting into ReaSamplerSession; persist serializes it to
a new forever-stable "tail_setting" ext-state key (load-per-project,
save-on-save). Footer scroll-wheel adjusts Manual length in 250ms
steps; label now shows "Tail: Manual X.Xs". Pure step/label/JSON
round-trip covered by tests.
2026-07-23 19:12:12 -04:00
daniel 938c85a223 docs: add wav_trim to CLAUDE.md targets/architecture; fix stale M8 note in PLAN
Reflect the T2 wav_trim pure module and its test target. Correct the M10
null-test note: M8 realtime landed as a post-fader track tap, not pre-FX.
2026-07-23 18:33:12 -04:00
daniel d8725210e7 feat(banks): pure bank_book registry — pool + named banks, move/copy, JSON round-trip (B1) 2026-07-23 18:32:57 -04:00
daniel 4241ef4408 docs: reflect D2-W2 landing in PLAN.md / COMPLETED.md
Remove D2-W2 from PLAN.md; append completed entry to COMPLETED.md.
Track-level auto-tag/park live; item-lane DAW verify deferred to
post-D2-W3 (lane minting). D2-W3 left open.
2026-07-23 18:30:43 -04:00
daniel ae0e76bff7 Merge T2: realtime capture tail trimming 2026-07-23 18:27:27 -04:00
daniel f2bfe466ec T2: realtime capture tail trimming
Auto/Manual/Off tail handling for realtime track-tap capture. Auto scans
recorded PCM backward for last frame above -72 dB and truncates the wav
header-aware (8 s cap); Manual pads a fixed tail; Off is byte-identical.
wav_trim rejects WAVE_FORMAT_EXTENSIBLE with non-float SubFormat GUID.
2026-07-23 18:25:45 -04:00
daniel 138c37fc81 Merge: D2 Wave 2 — shell lane application + timer-diff auto-tag detection 2026-07-23 18:25:41 -04:00
daniel 85a03fbd13 Merge dev (tail-toggle panel refactor) into D2 Wave 2
# Conflicts:
#	src/bank_panel.cpp
2026-07-23 18:13:18 -04:00
daniel 81fa37fe94 Archive Milestone 8 and Milestone T1 in docs
Move completed M8 (async realtime backend — landed as selected-track post-fader
tap, not master) and T1 (offline capture tail + panel toggle) from PLAN.md to
COMPLETED.md; resolved open questions removed. T2 realtime tail remains.
2026-07-23 17:52:03 -04:00
daniel ebdb4eae66 fix(D2-W2): correct manual-lane exemption, drop read-only item C_LANEPLAYS write
isOnManualLane predicate now correctly treats unnamed fixed-lane lanes as manual;
item-side C_LANEPLAYS loop removed (SDK read-only); explicit #include <set> in
view_mode_model.cpp; undo-block omission in detectNewContent documented as intentional.
2026-07-23 17:51:55 -04:00
daniel e3d126c177 Merge Milestone T1: offline capture tail (auto/manual) + docked-panel toggle 2026-07-23 17:33:15 -04:00
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