docs(phase-s): settle S-VIEW velocity persistence + draggable nodes, single-pass on L3

F1 -> preview velocity persists via VST3 component state (v5->v6). F2 -> envelope nodes draggable via new pure envelope_edit module. Drop the two-pass L3 restyle framing; build on the merged L3 LnF. F3 remains open.
This commit is contained in:
2026-07-27 12:57:08 -04:00
parent 5ec84ab0eb
commit 3b9b78b82c
3 changed files with 170 additions and 55 deletions
+29 -15
View File
@@ -190,10 +190,14 @@ is **ReaSampler 9000**. Framing + propagation surfaces:
> §Addendum r9. When a point lands, doc-keeper moves it to `COMPLETED.md`.
>
> **Depends on Phase S being on dev** (this redesigns Phase S editor shells —
> `reasampler_editor.cpp` + the pure `src/vst/` geometry modules). The Phase L L3 restyle and
> this S-VIEW redesign both touch the editor; sequence so they do not collide (S-VIEW is a
> layout/param change, L3 is a palette/kit change — best landed as one editor pass or S-VIEW then
> L3-restyle-the-new-layout).
> `reasampler_editor.cpp` + the pure `src/vst/` geometry modules). **Phase L L3 is FINISHED and
> merged** (2026-07-27, commit `c53683e` — `reasampler_editor.cpp` + `reasampler_embed.cpp`
> restyled through the L1 kit). S-VIEW builds the new three-view layout **directly on the current
> L3 look-and-feel as its baseline — one implementation pass, styled correctly from the start.**
> There is **no two-pass "land S-VIEW then restyle through L3"** — L3 already happened; every new
> S-VIEW surface (Sample face, Browse modal, Zone surface, envelope overlay + node handles,
> piano-key strip, preview cluster) is drawn through the L1 kit at build time, inheriting the L3
> palette and component-draw grammar. Restyle-after is not a concern.
**Goal:** A three-view editor that makes "pick a capture, tune it, play it" fast, easy, and fun —
Sample is home, Browse is an easy-to-summon modal picker, Zone is the deliberate keymap surface.
@@ -212,15 +216,26 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance.
Pitch engine / AHDSR|Trigger / AD pitch env — moved from Zone's param panel, single-capture
one-zone storage per S15-F2). Reference grammar: Simpler / Phase Plant (labelled value-strip
under a hero waveform).
- [ ] **S-VIEW-3 — envelope overlay on the hero waveform (new visual).** Draw the amp envelope
(AHDSR for Gate, fade/%-length for Trigger) as a curve over the Sample waveform at accurate
wall-clock time. New pure `envelope_overlay` module (params + frame-length → polyline; unit-
tested); shell traces it in an accent hue. Informative + decorative — sliders stay the edit
surface (node-drag deferred, fork S-VIEW-F2).
- [ ] **S-VIEW-3 — envelope overlay + DRAGGABLE NODES on the hero waveform (new visual + edit
surface).** Draw the amp envelope (AHDSR for Gate, fade/%-length for Trigger) as a curve over the
Sample waveform at accurate wall-clock time. New pure `envelope_overlay` module (params + frame-
length → polyline; unit-tested); shell traces it in an accent hue. **The breakpoints are draggable
handles** (S-VIEW-F2 SETTLED — in scope, not deferred): X → segment time, Y → level on level-
breakpoint nodes (sustain drags both axes), monotonic-in-time + range-clamped so a drag can never
produce a param the slider couldn't. New pure `envelope_edit` module (node hit-test + pixel-delta→
clamped-param inverse map; mirror of `card_drag`; unit-tested at the clamp/monotonic boundaries).
Sliders stay the precise numeric surface; **both surfaces read/write the same `PerformanceZone`
envelope fields** — one source of truth, kept in sync by re-reading params each paint (no listener
chain). Node-drag commits via the same off-audio-thread path a slider edit uses (no new RT
surface).
- [ ] **S-VIEW-4 — preview-trigger + velocity knob (new, Sample view).** A button firing the
sampler at the loaded capture's root note through the live voice engine (off the audio-thread
commit path — no MIDI controller needed) + an adjacent velocity knob. Preview velocity leans
**transient editor state** (fork S-VIEW-F1). RT discipline: no `process`-thread work.
commit path — no MIDI controller needed) + an adjacent velocity knob. **Preview velocity PERSISTS**
(S-VIEW-F1 SETTLED): it lands as a new top-level `previewVelocity` field on `ComponentState` via an
**envelope bump to v6** (`src/vst/sample_map.h`), round-tripped through the processor's existing
`getState`/`setState` over `IBStream`**not** the extension's project-scoped `persist` ext-state
(wrong owner + wrong scope; see CONTEXT.md §S-VIEW). Zones payload untouched (independent version
axes); older blobs lift to a mid default. RT discipline: no `process`-thread work.
- [ ] **S-VIEW-5 — Browse reduced to *choosing* (modal over Sample).** Keep search + bank tabs +
captures grid + scroll + selection; add **confirm/cancel** (double-click loads). **Remove** the
large waveform preview, Mono/Stereo toggle, root keyboard-strip (all moved to Sample), and the
@@ -262,10 +277,9 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance.
the new default showing the full Sample face without scroll; cannot shrink below the floor.
### Phase S editor redesign — forks (Daniel's to call)
- **S-VIEW-F1 — preview velocity persistence:** transient editor state (**lean**) vs. a small
persisted convenience. Lean transient — no compat surface, no version bump.
- **S-VIEW-F2 — envelope-overlay interactivity:** read-only overlay + sliders edit (**lean**, ship
first) vs. draggable envelope nodes (deferred stretch).
*(S-VIEW-F1 and S-VIEW-F2 SETTLED 2026-07-27 — folded into S-VIEW-4 / S-VIEW-3 above. F1: preview
velocity persists via envelope-v6 `ComponentState`. F2: envelope nodes are draggable via the pure
`envelope_edit` module. Only F3 remains open.)*
- **S-VIEW-F3 — Browse modal presentation:** full-window overlay (**lean**) vs. a centered sheet
over a dimmed Sample. Presentation detail.