From 104a25f390b9346cc533380266f17a7c8ca7feb4 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Tue, 28 Jul 2026 00:14:16 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20FB2=20Zone-panel=20parity=20landed=20?= =?UTF-8?q?=E2=80=94=20S-VIEW-13=20to=20COMPLETED,=20r11=20editor=20recomp?= =?UTF-8?q?ose=20complete=20(Wave=20B=20closed)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 2 +- COMPLETED.md | 35 +++++++++++++++++++++++++++++++++++ PLAN.md | 21 ++++++++++----------- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 4cfa156..dd8c86d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Repo identity and current state -**ReaSampler** is a per-project audio sample-bank capture tool that builds two artifacts: the REAPER extension (`reaper_reasampler`) and **ReaSampler 9000**, a Windows-only VST3 sampler instrument (`reasampler_9000.vst3`, `src/vst/`, second CMake target `reasampler_vst`, gated on the vendored `vendor/vst3sdk` submodule slice). The pure-testable-core / REAPER-facing-shell discipline is preserved throughout. CONTEXT.md is the authoritative spec — settled decisions, invariants, guardrails, and not-yet-built specs; it is large, so locate the relevant phase section by grepping its headings and read only that section with an offset rather than reading it whole. Build detail for landed phases lives in CONTEXT-ARCHIVE.md. Every REAPER API name cited there is correct-by-intent; verify argument order, types, and flag values against `vendor/reaper-sdk/sdk/reaper_plugin_functions.h` before use. A post-S-VIEW DAW-fix pass has landed (all 52 suite tests green): envelope nodes fully editable in both modes (every Gate stage A/H/D/S/R + Trigger zero-fade-out node, param-domain schematic scaling, 8 px min node separation, all nodes clamped in-canvas); gap-free per-column waveform render (`columnMinMax` homed in `peaks`, `waveformColumnCount` in `component_geometry`, shared via `drawWaveform`); `param_slider` `Knob` primitive (7→5 o'clock arc, needle, vertical-drag); zone-bleed fix 3a (`reconcileSingleCaptureZones` in `sample_map`). The voice-system redesign is also landed: `sampler_core` gains user-parameterized voice count (1–32, default 16), `VoiceMode` Poly/Mono (last-note held-note stack, `MonoTrigger` retrigger/legato toggle), an isolated `PreviewCard` (dedicated preview voice outside the MIDI pool — never steals from/into it; unity-Preserve zero-latency bypass scoped to it), and two-tier panic (CC 123 = release, CC 120 = immediate hard-stop incl. Trigger one-shots); processor sums the preview card alongside the engine + drain, `retireIdleDrain()` retires fully-idle drain snapshots, and voice-param edits rebuild from the already-decoded PCM (no bank re-read/WAV re-decode) via the drain-slot swap; `ComponentState` envelope bumped v6→v7 (voiceCount/voiceMode/monoTrigger bytes; pre-v7 blobs lift to 16/Poly/Retrigger). **FB1 Sample-view recomposition (r11) has also landed** (suite 55/55 green): all linear sliders replaced by radial **knobs** in a fenced **knob deck** (groups: AMP ENVELOPE / PITCH / PITCH ENV / VOICE / MASTER); mode toggles are compact in the caption row, not full-width; the **hero waveform runs full-width** (elastic band, 840×620 default preserved); the inline velocity-curve box is replaced by a **28×28 curve preview button → centered popup** with right-click node delete; voice-band controls (count / Poly-Mono / Retrig-Legato) are placed in the VOICE deck group; a **post-mixer per-sample-ramped master gain** (−∞…+24 dB, no zipper) is placed in the MASTER deck group, persisted as `masterGainLinear` — `ComponentState` envelope bumped v7→v8 (pre-v8 blobs lift to unity gain). Three new pure `src/vst/` modules landed: `knob_deck` (group-box + caption-row + knob-cell geometry, deterministic wrap, hit-test), `curve_popup` (sheet/close/box geometry + outside-sheet dismissal test), `master_gain` (dB↔linear taper math, −∞…+24 dB). +**ReaSampler** is a per-project audio sample-bank capture tool that builds two artifacts: the REAPER extension (`reaper_reasampler`) and **ReaSampler 9000**, a Windows-only VST3 sampler instrument (`reasampler_9000.vst3`, `src/vst/`, second CMake target `reasampler_vst`, gated on the vendored `vendor/vst3sdk` submodule slice). The pure-testable-core / REAPER-facing-shell discipline is preserved throughout. CONTEXT.md is the authoritative spec — settled decisions, invariants, guardrails, and not-yet-built specs; it is large, so locate the relevant phase section by grepping its headings and read only that section with an offset rather than reading it whole. Build detail for landed phases lives in CONTEXT-ARCHIVE.md. Every REAPER API name cited there is correct-by-intent; verify argument order, types, and flag values against `vendor/reaper-sdk/sdk/reaper_plugin_functions.h` before use. A post-S-VIEW DAW-fix pass has landed (all 52 suite tests green): envelope nodes fully editable in both modes (every Gate stage A/H/D/S/R + Trigger zero-fade-out node, param-domain schematic scaling, 8 px min node separation, all nodes clamped in-canvas); gap-free per-column waveform render (`columnMinMax` homed in `peaks`, `waveformColumnCount` in `component_geometry`, shared via `drawWaveform`); `param_slider` `Knob` primitive (7→5 o'clock arc, needle, vertical-drag); zone-bleed fix 3a (`reconcileSingleCaptureZones` in `sample_map`). The voice-system redesign is also landed: `sampler_core` gains user-parameterized voice count (1–32, default 16), `VoiceMode` Poly/Mono (last-note held-note stack, `MonoTrigger` retrigger/legato toggle), an isolated `PreviewCard` (dedicated preview voice outside the MIDI pool — never steals from/into it; unity-Preserve zero-latency bypass scoped to it), and two-tier panic (CC 123 = release, CC 120 = immediate hard-stop incl. Trigger one-shots); processor sums the preview card alongside the engine + drain, `retireIdleDrain()` retires fully-idle drain snapshots, and voice-param edits rebuild from the already-decoded PCM (no bank re-read/WAV re-decode) via the drain-slot swap; `ComponentState` envelope bumped v6→v7 (voiceCount/voiceMode/monoTrigger bytes; pre-v7 blobs lift to 16/Poly/Retrigger). **FB1 Sample-view recomposition (r11) has also landed** (suite 55/55 green): all linear sliders replaced by radial **knobs** in a fenced **knob deck** (groups: AMP ENVELOPE / PITCH / PITCH ENV / VOICE / MASTER); mode toggles are compact in the caption row, not full-width; the **hero waveform runs full-width** (elastic band, 840×620 default preserved); the inline velocity-curve box is replaced by a **28×28 curve preview button → centered popup** with right-click node delete; voice-band controls (count / Poly-Mono / Retrig-Legato) are placed in the VOICE deck group; a **post-mixer per-sample-ramped master gain** (−∞…+24 dB, no zipper) is placed in the MASTER deck group, persisted as `masterGainLinear` — `ComponentState` envelope bumped v7→v8 (pre-v8 blobs lift to unity gain). Three new pure `src/vst/` modules landed: `knob_deck` (group-box + caption-row + knob-cell geometry, deterministic wrap, hit-test), `curve_popup` (sheet/close/box geometry + outside-sheet dismissal test), `master_gain` (dB↔linear taper math, −∞…+24 dB). **FB2 Zone-panel parity (r11, 2026-07-28) has also landed** (suite 55/55 green): the Zone param panel now uses the same knob deck + curve-preview-button/popup grammar as the Sample face — one control grammar across both surfaces of the one per-zone storage site; Zone-authoring affordances (+Add Zone / Delete, the piano-key strip, Low/High/Root legend) are preserved; VOICE and MASTER groups remain Sample-only (per-instance). `param_slider`'s linear slider rows are retired on the Zone panel (the FA4 `Knob` primitive is now the only live consumer of that half of `param_slider`). **This completes the r11 editor recomposition (Wave B / Phase S editor redesign).** ## One-time submodule setup diff --git a/COMPLETED.md b/COMPLETED.md index b04595f..e6b4b80 100644 --- a/COMPLETED.md +++ b/COMPLETED.md @@ -2738,3 +2738,38 @@ and persists across project save/reopen; pre-v8 blobs lift to unity gain. 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`. + +--- + +## FB2 — Zone-panel parity (r11; 2026-07-28) + +> **Merged to dev 2026-07-28. Integrated suite 55/55 green.** S-VIEW-13 from the Wave B +> plan. Closes R11-F2. **Completes the r11 editor recomposition (Phase S Wave B).** + +**Goal:** Bring the Zone param panel to the same knob deck + curve-preview-button/popup +grammar as the Sample face (FB1), retiring `param_slider`'s linear slider rows on the Zone +panel so one control grammar renders on both surfaces of the one per-zone storage site. +Zone-authoring affordances (+Add Zone / Delete, the per-zone piano-key strip, Low/High/Root +numeric-entry legend) are preserved. VOICE and MASTER groups stay Sample-only (per-instance). +**Verify:** Integrated suite 55/55 green. Zone panel renders the knob deck with correct group +geometry; curve preview button opens the popup (right-click deletes a node, endpoint-guarded); +Zone-authoring affordances intact; no regression on the Sample face. + +- [x] **S-VIEW-13 — Zone-panel parity.** Zone param panel rebuilt using the `knob_deck` + geometry module and the `curve_popup` module — same group-box / caption-row / knob-cell + layout as the Sample face. `param_slider` linear slider rows retired on the Zone panel. + The per-zone storage site is shared; the control grammar is now uniform across both surfaces. +- [x] **Zone-authoring affordances preserved.** +Add Zone / Delete buttons, the per-zone piano- + key strip (with the real piano black-key pattern), and the Low/High/Root numeric-entry legend + are unchanged by the recomposition. +- [x] **VOICE and MASTER groups remain Sample-only.** Per-instance controls are not placed on + the Zone panel, which is per-zone. + +**Notes/decisions:** +- **R11-F2 SETTLED:** Zone panel adopts knob deck + curve popup. `param_slider`'s slider/toggle + half is now dormant — the FA4 `Knob` primitive (`ControlKind::Knob`) is the only live consumer + of that side of `param_slider`. No new pure modules required: `knob_deck` and `curve_popup` + (landed in FB1) are consumed directly. +- **Phase S editor Wave B complete.** S-VIEW-11 (knob deck + curve popup, FB1), S-VIEW-12 + (full-width hero + master gain, FB1), and S-VIEW-13 (Zone-panel parity, FB2) are all landed. + No open r11 or S-VIEW Wave B items remain in PLAN.md. diff --git a/PLAN.md b/PLAN.md index 4860d2a..7d52c69 100644 --- a/PLAN.md +++ b/PLAN.md @@ -149,24 +149,23 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance. > `docs/product/midi-playback.md` §Addendum r11. All drawing through the L1 kit; all > layout/hit-test in pure geometry modules. > -> **S-VIEW-11 and S-VIEW-12 have landed (FB1, merged 2026-07-27, suite 55/55 green)** — -> knob deck + master gain + curve popup + full-width hero all on dev; see `COMPLETED.md`. -> **S-VIEW-13 (Zone-panel parity) is NOT done** — in-flight FB2 track; remains open below. +> **S-VIEW-11, S-VIEW-12, and S-VIEW-13 have all landed** — FB1 (merged 2026-07-27, suite +> 55/55) brought the knob deck + master gain + curve popup + full-width hero; FB2 (merged +> 2026-07-28, suite 55/55) brought Zone-panel parity. **Phase S editor Wave B (r11) is +> complete.** See `COMPLETED.md` for both FB entries. -- [ ] **S-VIEW-13 — Zone-panel parity (gated on fork R11-F2).** The Zone param panel adopts - the same knob deck + curve-preview-button/popup; retires `param_slider`'s slider rows - outright (one control grammar on both surfaces of the one storage site). - -**Open forks** — **R11-F1** (hero height vs. default window) settled at FB1 build: elastic -hero, 840×620 default kept. **R11-F2** (Zone-panel parity) is the gate for S-VIEW-13. +**Open forks** — **R11-F1** (hero height vs. default window) SETTLED at FB1 build: elastic +hero, 840×620 default kept. **R11-F2** (Zone-panel parity) SETTLED at FB2 build: knob deck ++ curve popup adopted on the Zone panel; `param_slider` slider rows retired on that surface. ### Phase S editor redesign — forks (Daniel's to call) *(r9/r10 forks all settled: S-VIEW-F1 and S-VIEW-F2 SETTLED 2026-07-27 — folded into S-VIEW-4 / S-VIEW-3. F1: preview velocity persists via envelope-v6 `ComponentState`. F2: envelope nodes are draggable via the pure `envelope_edit` module. R10-F1 SETTLED 2026-07-27 — Option A flat y=1, folded into S-VIEW-9. S-VIEW-F3 SETTLED — full-window overlay, implemented as Browse renders as a -full-window modal over Sample (landed in S-VIEW-1/S-VIEW-5). **r11 opens two new forks — R11-F1 -(hero height vs. default window) and R11-F2 (Zone-panel parity) — see the Wave B block above.**)* +full-window modal over Sample (landed in S-VIEW-1/S-VIEW-5). **r11 forks all settled: R11-F1 +SETTLED at FB1 build (elastic hero, 840×620 default kept); R11-F2 SETTLED at FB2 build (Zone +panel adopts knob deck + curve popup, `param_slider` slider rows retired on that surface).**)* ---