docs: record FB1 r11 Sample-view recompose + master gain (v8); move S-VIEW-11/12 to COMPLETED; correct stale r11 zero-state-change line

This commit is contained in:
2026-07-27 23:58:05 -04:00
parent a66acb7473
commit d272aab0df
4 changed files with 86 additions and 32 deletions
+66
View File
@@ -2672,3 +2672,69 @@ stale full-range zone shadowing so the engine plays the zone the editor draws. C
voice-param rebuild via drain-slot swap (no disk I/O).
- [x] `ComponentState` envelope v6→v7; `voiceCount`/`voiceMode`/`monoTrigger` on `ComponentState`;
back-compat lift in `deserializeComponentState`.
---
## FB1 — Sample-view recomposition + master gain (r11; 2026-07-27)
> **Merged to dev 2026-07-27. Integrated suite 55/55 green.** S-VIEW-11 + S-VIEW-12 from the
> Wave B plan. No corresponding PLAN.md points remain for these two; S-VIEW-13 (Zone-panel
> parity) stays open in PLAN.md.
**Goal:** Recompose the S-VIEW Sample face after Daniel's post-landing DAW pass — radial knobs
in fenced groups, compact mode toggles, full-width elastic hero, curve preview button → popup.
Also adds a post-mixer master gain control (MASTER group, −∞…+24 dB) as a new persisted field.
**Verify:** Integrated suite 55/55 green. Sample face renders knob deck with correct group
geometry; hero runs full-width (elastic, 840×620 preserved); curve popup opens/dismisses; right-
click on a node in the popup deletes it (endpoint-guarded); master gain knob adjusts output level
and persists across project save/reopen; pre-v8 blobs lift to unity gain.
- [x] **`knob_deck` pure module** (`src/vst/knob_deck.{h,cpp}`): group-box / caption-row /
compact-toggle / knob-cell geometry; deterministic whole-group wrap (a group that doesn't fit
the remaining row width starts a new deck row); `DeckLayout` / `DeckHit` structs; blank
reserved cells (id 1 for AMP ENVELOPE's 5-cell stability). Mirror of `action_bar`/
`param_slider`; no LICE or REAPER types. New CTest target `knob_deck_tests`.
- [x] **`curve_popup` pure module** (`src/vst/curve_popup.{h,cpp}`): centered sheet geometry —
width `clamp(60% window, 360..520)`, height `clamp(55% window, 260..380)`; title row + 18×18
Close button rect; curve-box rect (border rect; shell applies `curveBoxFromRect` inset);
outside-sheet dismissal test. Mirror of `overflow_menu`; no LICE or REAPER types. New CTest
target `curve_popup_tests`.
- [x] **`master_gain` pure module** (`src/vst/master_gain.{h,cpp}`): dB↔linear taper math for
the −∞…+24 dB master gain knob — `masterGainLinearFromNorm`, `masterGainNormFromLinear`,
`masterGainDbFromNorm`, `masterGainNormFromDb`, `formatMasterGainLabel`; norm 0 = true silence
(exact 0.0); unity ≈ 0.714 normalized. Shared by the editor knob and the processor multiply
so needle, persisted value, and audio multiply cannot drift. No LICE or REAPER types. New
CTest target `master_gain_tests`.
- [x] **Knob deck shell** (`reasampler_editor.cpp`): Sample control strip rebuilt as five fenced
groups — **AMP ENVELOPE** (Gate|Trigger caption toggle; 5-cell width reserved; Gate: Attack ·
Hold · Decay · Sustain · Release; Trigger: Fade In · Length % · Fade Out), **PITCH**
(Varisp|Preserve caption toggle; Key Track knob), **PITCH ENV** (Off|On caption toggle;
P.Attack · P.Decay · P.Depth; Disabled-not-hidden when Off), **VOICE** (Voices knob +
Poly|Mono caption toggle + Retrig|Legato row toggle), **MASTER** (Gain knob). Slider rows +
full-width toggles retired from the Sample face. Hero band recomputed as elastic (absorbs
window height minus fixed bands; floor 150px); deck band bottom-anchored at fixed height via
`deckHeight()`.
- [x] **Full-width hero** (S-VIEW-12): velocity-curve carve-out removed from hero rect; hero
now runs edge-to-edge between the kPad margins. S-VIEW markers (start/loop) + envelope overlay
unchanged.
- [x] **Curve preview button + popup** (S-VIEW-12): 28×28 miniature curve preview button placed
immediately right of the Vel knob in the cluster band; left-click opens the `curve_popup`-
geometry centered sheet; **right-click on a node in the popup deletes it** (endpoint-guarded,
commits via the same path as Alt-click — `deletePoint` guard makes endpoint right-clicks a safe
no-op). Dismiss: Close ×, outside-click (no drag in flight), Esc. All landed curve-editor
interactions preserved (drag, click-add, Alt-click delete, drag-off delete).
- [x] **Post-mixer master gain** (new): `masterGainLinear` field added to `ComponentState`;
`kComponentStateVersion` bumped **v7→v8**; pre-v8 blobs lift to `masterGainLinear = 1.0`
(unity). Processor applies the gain as a per-sample ramp over the summed output — no zipper
noise. `master_gain` pure module is the shared math seam between the editor knob and the
processor multiply.
**Notes/decisions:**
- **Persistence is NOT zero-change.** The CONTEXT.md r11 spec described r11 as a pure view
recomposition; master gain added `ComponentState` v8. CONTEXT.md §S-VIEW r11 intro updated to
record this correctly (the "zero component-state change, no new persisted fields" clause
replaced with a factual note on the v7→v8 bump and the master gain field).
- **R11-F1 (hero height) settled at build:** elastic hero, 840×620 default preserved — the
hero grows with the window, floor 150px. No window-size change required.
- **R11-F2 (Zone-panel parity) deferred to FB2:** S-VIEW-13 remains open in PLAN.md.
- New CTest targets: `knob_deck_tests`, `curve_popup_tests`, `master_gain_tests`.