diff --git a/COMPLETED.md b/COMPLETED.md index 1456d37..db0f4c4 100644 --- a/COMPLETED.md +++ b/COMPLETED.md @@ -236,3 +236,23 @@ toggle + mode-jumps MIDI-bindable; tag/untag acts on the current track selection raises it; `main.cpp`'s timer drains it) — `persist` stays model-only. - A pure `nextModeId` free function added to `view_mode_model` (the N-mode cycle decision behind "toggle"), unit-tested in the existing `view_mode_model_tests`. + +--- + +## Milestone 7 — capture action family +**Goal:** Bindable capture actions for master / selected tracks / selected items / +razor area, each with wet-dry + tail options. CONTEXT.md §actions, Build order 7. +**Verify (in DAW):** Each action registered (bindable in Actions list), routes to +the offline backend, and honors wet/dry + tail. **Load-bearing principle:** none +auto-inserts into the arrange. + +- [x] Source resolvers: master mix, selected tracks, selected items, razor area + (`GetSet_LoopTimeRange`, `P_RAZOREDITS`, `CountSelectedMediaItems`, etc.). +- [x] Register each as a bindable action (`command_id`/`gaccel`/`hookcommand`). +- [x] Wet-dry + tail options per action. +- [x] Review gate: confirm no capture path touches the timeline. + +**Notes/decisions:** +- Four **wet** bindable capture actions — master mix, selected tracks, selected items, razor area — registered under the `CEREBELLUM_REASAMPLER_CAPTURE_*` command-id prefix. Each routes to `OfflineRenderBackend` (RENDER_* snapshot/restore, dither/normalize off, 32-bit float), produces a `Sample`, adds it to the bank, persists, and calls `MarkProjectDirty`. The M3 spike action was retired. +- **Wet-only decision (Daniel):** REAPER offline render has no true pre-FX "dry" bit — the only wet/dry-adjacent lever (`&8192` pre-fader stems) is post-FX. Approximate-dry action variants were removed rather than ship a "dry" that isn't. `CaptureRequest.wetDry` is retained as the seam for true dry (M10). +- Pure `render_settings` module maps source mode → RENDER_SETTINGS bits and parses `P_RAZOREDITS` (union of track-audio areas), unit-tested. No capture path inserts into the arrange (load-bearing gate); non-destructive (selection/razor read-only). diff --git a/PLAN.md b/PLAN.md index a50d009..b9b49e3 100644 --- a/PLAN.md +++ b/PLAN.md @@ -14,19 +14,6 @@ it here and appends it to `COMPLETED.md`. --- -## Milestone 7 — capture action family -**Goal:** Bindable capture actions for master / selected tracks / selected items / -razor area, each with wet-dry + tail options. CONTEXT.md §actions, Build order 7. -**Verify (in DAW):** Each action registered (bindable in Actions list), routes to -the offline backend, and honors wet/dry + tail. **Load-bearing principle:** none -auto-inserts into the arrange. - -- [ ] Source resolvers: master mix, selected tracks, selected items, razor area - (`GetSet_LoopTimeRange`, `P_RAZOREDITS`, `CountSelectedMediaItems`, etc.). -- [ ] Register each as a bindable action (`command_id`/`gaccel`/`hookcommand`). -- [ ] Wet-dry + tail options per action. -- [ ] Review gate: confirm no capture path touches the timeline. - ## Milestone 8 — RealtimeRecordBackend **Goal:** Realtime record behind the same `ICaptureBackend`, producing identical bank entries. CONTEXT.md §capture (realtime), §Precision invariants. @@ -65,6 +52,8 @@ tool's trust anchor and must pass. - [ ] Null-test verification action (capture → re-insert at source pos → assert silence sum). +**Note (from M7):** The null test requires a TRUE pre-FX dry capture, which REAPER offline render cannot produce via RENDER_SETTINGS (there is no pre-FX bit). True dry must be obtained by bypassing the source FX around an offline render (snapshot→bypass→render→restore) OR via the M8 realtime pre-FX path — so the dry-capture mechanism should be designed as part of the M10 null-test work. + ## Milestone 11 — polish **Goal:** Batch capture (per selected item / per razor area), resample-and-mute-source, conform-on-insert, native OS drag-out. CONTEXT.md