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.
This commit is contained in:
@@ -14,21 +14,6 @@ it here and appends it to `COMPLETED.md`.
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
@@ -72,8 +57,6 @@ invariants; drag-out places a valid file in the OS target.
|
||||
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
|
||||
@@ -94,34 +77,6 @@ landed milestone.
|
||||
> threshold **-72 dB**, max-tail cap **8 s**. When a point lands, doc-keeper moves
|
||||
> it to `COMPLETED.md`.
|
||||
|
||||
## T1 — offline tail: auto (default) + manual override
|
||||
**Goal:** Preserve decay tails on offline captures. **Auto** (default): render an
|
||||
8 s-capped tail, then auto-trim trailing silence to -72 dB via a **surgical**
|
||||
`RENDER_NORMALIZE` (only the trim-end bit set) + `RENDER_TRIMEND`. **Manual**: a
|
||||
fixed tail length (clamped to the 8 s cap), no trim, keeping today's disable-all
|
||||
normalize. Tail is opt-in; **None** stays byte-identical to today. See
|
||||
`docs/product/capture-tail.md` §The offline path.
|
||||
**Verify (in DAW):** A range ending mid-reverb + Auto tail ends at the -72 dB decay
|
||||
point (not a hard 8 s, not the range end); a non-decaying signal caps at range + 8 s;
|
||||
**two identical Auto requests are byte-identical** (deterministic trim); a
|
||||
TailMode::None capture is byte-identical to the pre-tail exact-bounds capture;
|
||||
Manual(N ms) yields range + N ms untrimmed, with N clamped to 8000; `ScopedRenderSettings`
|
||||
restores `RENDER_NORMALIZE` and every touched setting on every path.
|
||||
|
||||
- [ ] Pure layer (`render_settings.{h,cpp}`): named constants `kAutoTrimThresholdDb`
|
||||
(-72) + derived `RENDER_TRIMEND` ratio (≈0.00025119), `kMaxTailSeconds`/`kMaxTailMs`
|
||||
(8 s); a `TailMode { None, Auto, Manual }` → (`RENDER_TAILFLAG`/`RENDER_TAILMS`/
|
||||
`RENDER_NORMALIZE`/`RENDER_TRIMEND`) mapping + the manual-tail clamp; unit-tested.
|
||||
- [ ] Wire the mapping into `OfflineRenderBackend` (`capture.cpp`): drive the tail +
|
||||
surgical-normalize (Auto) / disable-all (Manual/None) values; snapshot/restore
|
||||
`RENDER_TRIMEND` alongside the existing `RENDER_*` set. `RENDER_TAILFLAG = 1`
|
||||
unconditionally (custom bounds — not per range type).
|
||||
- [ ] Replace/extend `CaptureRequest.renderTail`(bool)/`tailMs` with the three-state
|
||||
tail contract (None/Auto/Manual(ms)); default None (exact bounds, null-test-safe).
|
||||
- [ ] DAW-confirm: `RENDER_TRIMEND` amplitude curve (0.00025119 ≈ -72 dB); trim-end-only
|
||||
normalize (32768) does not engage fades/normalize/pad; trim never eats pre-`ENDPOS`
|
||||
body. (See spec §Open questions / DAW-confirm.)
|
||||
|
||||
## T2 — realtime tail (follow-on to T1)
|
||||
**Goal:** The parallel tail path for the M8 realtime backend, which does not drive
|
||||
`RENDER_*`: record an 8 s-capped tail window past the range end, then **trim in a
|
||||
@@ -141,14 +96,6 @@ then trims at the -72 dB decay point (± inherent realtime tolerance); realtime
|
||||
- [ ] Realtime shell: read the recorded wav PCM into a float buffer, find the trim
|
||||
frame, rewrite the file truncated (new I/O the backend does not do today).
|
||||
|
||||
## Milestone T open questions
|
||||
- **Auto as the shipped-action default?** Whether `CAPTURE_ITEM`/`CAPTURE_TRACK`
|
||||
(currently all TailMode::None) flip to Auto, gain a "…with tail" variant, or take
|
||||
a modifier. Product call for Daniel; **leaning** paired variant / toggle over
|
||||
silently changing the exact-bounds default. Not blocking T1 (the request-level
|
||||
three-state contract is independent). (touches `render_settings.cpp` action table +
|
||||
`actions`.)
|
||||
|
||||
---
|
||||
|
||||
# Phase D2 — Two-canvas (item-level mode projection; additive to D1)
|
||||
|
||||
Reference in New Issue
Block a user