c78c7e3ddc
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.
114 lines
5.9 KiB
Markdown
114 lines
5.9 KiB
Markdown
# PLAN.md — ReaSampler milestone roadmap
|
||
|
||
Living milestone roadmap for ReaSampler. Derived from CONTEXT.md's 11-step build
|
||
order; CONTEXT.md remains the authoritative spec — this file is the tickable
|
||
checklist, not a re-statement of the spec. When a point lands, doc-keeper removes
|
||
it here and appends it to `COMPLETED.md`.
|
||
|
||
**Conventions**
|
||
- One checkbox `- [ ]` = one discrete, independently-landable point.
|
||
- Each milestone opens with a **Goal** (one line) and a **Verify** criterion
|
||
(the acceptance gate; precision invariants pulled in where one applies).
|
||
- Verify-in-DAW points require a manual REAPER run; pure points are gated by CTest.
|
||
- "See CONTEXT.md §…" points at the authoritative detail — do not duplicate it here.
|
||
|
||
---
|
||
|
||
## Milestone 8 — RealtimeRecordBackend
|
||
**Goal:** Realtime record behind the same `ICaptureBackend`, producing identical
|
||
bank entries. CONTEXT.md §capture (realtime), §Precision invariants.
|
||
**Verify (in DAW):** Hidden temp track resamples wet output; recorded file moves
|
||
into the bank; **non-destructive** — temp track removed cleanly, source routing
|
||
and user monitoring restored unchanged.
|
||
|
||
**Note (from M3):** The realtime backend captures during playback and does NOT invoke the offline-render path, so it is inherently dialog-free (no render-progress window) — a secondary benefit beyond hardware/performed-FX capture.
|
||
|
||
- [ ] Hidden-track resample recipe (`I_RECMODE`/`I_RECINPUT`/`I_RECARM`,
|
||
`CSurf_OnRecord`/`CSurf_OnStop`); verify record-mode values against SDK.
|
||
- [ ] Resolve wet-master routing that does not alter user monitoring (open
|
||
question).
|
||
- [ ] Move recorded source into bank; populate identical `Sample`; clean teardown.
|
||
|
||
## Milestone 9 — slots (MPC-style)
|
||
**Goal:** "Capture to slot N" / "insert slot N", MIDI-bindable. CONTEXT.md
|
||
Build order 9.
|
||
**Verify (in DAW):** Slot capture and slot insert fire from MIDI bindings; slot
|
||
state persists via the index.
|
||
|
||
- [ ] Slot model + slot↔sample assignment.
|
||
- [ ] "Capture to slot N" / "insert slot N" actions, MIDI-bindable.
|
||
|
||
## Milestone 10 — provenance + null-test verify action
|
||
**Goal:** Provenance (parent sample id + FX-chain snapshot) and "re-capture from
|
||
source"; ship the null-test verification action. CONTEXT.md §Precision invariants,
|
||
Build order 10.
|
||
**Verify (in DAW):** **Null test** — a dry offline capture of a range, re-inserted
|
||
at its source position, nulls to silence against the source. This action is the
|
||
tool's trust anchor and must pass.
|
||
|
||
- [ ] Provenance fields populated on resample-from-sample (parent id + FX-chain
|
||
snapshot string).
|
||
- [ ] "Re-capture from source" action.
|
||
- [ ] 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
|
||
Build order 11, §Non-goals (drag-out deferred to last).
|
||
**Verify (in DAW):** Each polish action works without regressing the precision
|
||
invariants; drag-out places a valid file in the OS target.
|
||
|
||
- [ ] Batch capture: per selected item / per razor area.
|
||
- [ ] Resample-and-mute-source.
|
||
- [ ] Conform-on-insert (explicit).
|
||
- [ ] Native OS drag-out (deferred final; `InsertMedia` path must already work).
|
||
|
||
---
|
||
|
||
## Open questions to resolve during build
|
||
Carried from CONTEXT.md §Open questions — keep visible until each is closed by a
|
||
landed milestone.
|
||
|
||
- **Realtime wet-master routing** that captures master output without altering the
|
||
user's monitoring. (blocks M8)
|
||
- **`parseInt` narrowing hardening:** `src/bank_model.cpp` `parseInt` casts
|
||
`int64_t → int` via `static_cast` without a range check; integers that fit
|
||
in int64 but exceed `INT_MAX` are implementation-defined. Hardening candidate
|
||
— add bounds check before the cast when integer-field validation is in scope.
|
||
|
||
---
|
||
|
||
# Phase D — Design View (parallel to the M0–M11 capture roadmap)
|
||
|
||
> **Separate phase namespace.** The M-numbers belong to the capture pillar
|
||
> (M0–M11, M4 in flight). Design View is an orthogonal feature on its own track,
|
||
> so it uses a **lettered** namespace (D1, D2, …) rather than extending the M-line.
|
||
> This keeps the two roadmaps from colliding on numbering and reads correctly:
|
||
> Phase D is not "the twelfth capture step," it's a different pillar. Authoritative
|
||
> spec: **CONTEXT.md §Design View**. Product framing: `docs/product/design-view.md`.
|
||
> When a point lands, doc-keeper moves it to `COMPLETED.md`.
|
||
|
||
## D5 — in-window toggle affordance (UI)
|
||
**Goal:** The segmented mode switch in the ReaSampler / bank_panel window header.
|
||
CONTEXT.md §Design View (UI). **Verify (in DAW):** Segmented control shows current
|
||
mode (lit segment), one click flips modes via the D4 toggle action, per-mode
|
||
membership count visible, offlined-FX caveat surfaced as a tooltip.
|
||
|
||
- [ ] Segmented mode switch `[ Arrange | Design ]` in the window header; active lit.
|
||
- [ ] Wire the switch to the toggle/activate actions from D4.
|
||
- [ ] Per-mode membership count display.
|
||
- [ ] Offlined-FX re-init caveat as a tooltip on the switch.
|
||
|
||
## Phase D open questions
|
||
- **Snapshot durability across save-while-parked** — persisted here by decision;
|
||
lean alternative is force-restore-to-Arrange on save (product notes item 4).
|
||
(touches D3)
|
||
- **Reconcile on delete/restructure** — tagged leaf deleted or folder restructured
|
||
while parked leaves a stale GUID; ignore-and-prune on next toggle/open.
|
||
(touches D1/D2)
|
||
- **Screenset coexistence** — Design View drives the same flags a screenset recall
|
||
would; confirm last-writer-wins is not surprising. (touches D2)
|