docs(phase-s): reconcile PLAN/COMPLETED/CLAUDE for S-VIEW Wave 1
Move S-VIEW-BUG-1 + S-VIEW-SIZE-1 to COMPLETED; annotate S-VIEW-3/4/6/7 as Wave 1 core landed / Wave 2 shell pending; record R10-F1 SETTLED (Option A, flat y=1) into S-VIEW-9.
This commit is contained in:
@@ -2235,3 +2235,39 @@ save/reopen rebinds by the correct UID; nothing plays differently (identity/pair
|
||||
- [x] **DAW-verify contract (the acceptance gate, no unit test — identity is a shell fact).**
|
||||
Both channels installed side-by-side: each browser sees only its channel's banks; a
|
||||
project saved with a beta instance reopens rebinding to the beta VST and restores its state.
|
||||
|
||||
---
|
||||
|
||||
## S-VIEW-BUG-1 — drop-to-FX bug fix (Wave 1)
|
||||
**Goal:** Dropping a capture onto a track's FX chain (TCP FX button or FX-chain window) must
|
||||
instantiate + init ReaSampler 9000, not fall through to arrange-as-audio.
|
||||
**Root cause (diagnosed and fixed in Wave 1):** the FX-hotspot classifier in the pure
|
||||
`instrument_drop` module only matched FX-chain and floating-window hotspot strings (`fx_*`);
|
||||
a drop on the TCP FX button (`tcp.fx`) or MCP FX button (`mcp.fx`) was not matched and fell
|
||||
through to `OsDrag` (arrange-as-audio).
|
||||
**Fix:** widened then narrowed the predicate in `instrument_drop` to match `fx_*` / `tcp.fx` /
|
||||
`mcp.fx`; unit-tested in `instrument_drop_tests` at the boundary. The shell (`instrument_drop_win`)
|
||||
calls the updated pure predicate unchanged.
|
||||
**Verify (in DAW):** DAW-confirmation pending Daniel's post-merge smoke test — drop → a playing
|
||||
instance on the track, one Ctrl-Z removes it.
|
||||
|
||||
- [x] Pure `instrument_drop` predicate widened: `infoNamesFxHotspot` now matches `fx_*` / `tcp.fx` /
|
||||
`mcp.fx`; unit-tested at each matched and unmatched hotspot string.
|
||||
- [x] Shell unchanged — calls the updated pure predicate.
|
||||
|
||||
---
|
||||
|
||||
## S-VIEW-SIZE-1 — 1080p default window size (Wave 1, interim)
|
||||
**Goal:** The editor opens too small (`ViewRect(0,0,560,400)`); set a larger default sized for
|
||||
the three-band Sample face on 1080p.
|
||||
**What landed (interim):** default `ViewRect` bumped to **840×560** and a `checkSizeConstraint`
|
||||
minimum floor added. The mechanism (`getSize`/`setRect`/`checkSizeConstraint`/`onSize`/`canResize`
|
||||
in `vendor/vst3sdk/public.sdk/source/common/pluginview.h`) was verified correct at this point.
|
||||
**NOTE:** Wave 2 (T-SHELL) will re-tune the final numbers to the three concrete Sample-face band
|
||||
heights once the Sample view layout is built; 840×560 is the correct starting point, not the
|
||||
final tuned value.
|
||||
**Verify (in DAW):** opens at 840×560 showing more of the editor surface than before; cannot
|
||||
shrink below the floor. Final tuning deferred to T-SHELL.
|
||||
|
||||
- [x] Default `ViewRect` bumped to 840×560.
|
||||
- [x] `checkSizeConstraint` minimum floor enforced.
|
||||
|
||||
@@ -229,6 +229,10 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance.
|
||||
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).
|
||||
> **Wave 1 (S-VIEW cores) ✓:** `envelope_overlay` + `envelope_edit` pure modules landed
|
||||
> and unit-tested. **Wave 2 shell PENDING:** `reasampler_editor.cpp` must trace the overlay
|
||||
> and wire draggable node handles; a Trigger frames↔fraction converter is owed at the module
|
||||
> seam (documented there).
|
||||
- [ ] **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 PERSISTS**
|
||||
@@ -237,6 +241,9 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance.
|
||||
`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.
|
||||
> **Wave 1 (S-VIEW cores) ✓:** `previewVelocity` field on `ComponentState`, envelope v5→v6
|
||||
> bump, processor `getState`/`setState` round-trip, clamped 1..127 — all landed. **Wave 2
|
||||
> shell PENDING:** the preview button + velocity knob UI in `reasampler_editor.cpp`.
|
||||
- [ ] **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
|
||||
@@ -248,11 +255,18 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance.
|
||||
math lives in the pure sampler core** (unit-tested note/root/keyTrack → ratio), applied in both
|
||||
Varispeed and Preserve repitch. Surfaces as a control on the Zone param panel + Sample control
|
||||
strip.
|
||||
> **Wave 1 (S-VIEW cores) ✓:** per-`PerformanceZone` `keyTrack` field (zones payload v6,
|
||||
> default 100% bit-identical), pure ratio math, applied in both Varispeed and Preserve
|
||||
> engines — landed. **Wave 2 shell PENDING:** the UI control in the Zone param panel +
|
||||
> Sample control strip.
|
||||
- [ ] **S-VIEW-7 — real piano-key pattern on the keyboard strip (new visual).** Overlay the actual
|
||||
alternating white/black (bright/dark per palette) key pattern over the pastel spectral fill so
|
||||
the strip reads as a keyboard. Pure `keyboard_strip` gains a natural/accidental predicate (12-
|
||||
tone, unit-tested); shell draws the two-tone overlay. Shared by the Zone strip + Sample root
|
||||
affordance.
|
||||
> **Wave 1 (S-VIEW cores) ✓:** pure `isNaturalKey` predicate on `keyboard_strip`, unit-tested
|
||||
> — landed. **Wave 2 shell PENDING:** `reasampler_editor.cpp` must draw the two-tone overlay
|
||||
> over the spectral fill.
|
||||
- [ ] **S-VIEW-8 — Zone view retained + wired.** Keep +Add Zone / Delete, the per-zone keyboard
|
||||
strip (now with the piano pattern), the Low/High/Root numeric-entry legend, and the per-zone
|
||||
param panel; add the key-tracking control. Nothing from today's Zones view dropped.
|
||||
@@ -261,7 +275,10 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance.
|
||||
to the 0–127×0–1 box; control-point add/move/delete x-ordered + box-clamped; hit-test + pixel-
|
||||
delta→clamped-point inverse map; mirror of `envelope_edit`; unit-tested at eval + clamp/order
|
||||
boundaries). Additive `velocityCurve` field on `PerformanceZone` (instrument-owned, D-B), on the
|
||||
**zones-payload version axis**, default = the R10-F1 curve; older blobs lift to that default.
|
||||
**zones-payload version axis**, default = **flat y=1** (R10-F1 SETTLED — Option A, Daniel
|
||||
2026-07-27: "any velocity plays at full level"); older blobs lift to that default. **Back-compat
|
||||
caveat: this is a deliberate non-back-compat behavior change** — the current engine does linear
|
||||
`velocity/127`, so existing zones' soft hits will be louder after upgrade. Flagged and accepted.
|
||||
Apply at **`Voice::start()`** — replace `velocityGain_ = velocity / 127.0` (`sampler_core.cpp:261`)
|
||||
with `velocityGain_ = curve.eval(velocity)`, off the per-frame path (no new RT work). **BLOCKED BY
|
||||
Wave 1 T-KEYTRK** (`PerformanceZone` schema + payload bump) — this is a LATER additive payload bump
|
||||
@@ -281,34 +298,15 @@ piano-key pattern work; drop-a-capture-onto-FX instantiates a playing instance.
|
||||
|
||||
> Framed in CONTEXT.md §S-VIEW; both are functional prerequisites with the SDK swept and no
|
||||
> platform ceiling — a diagnosis and a one-line default, not product decisions.
|
||||
|
||||
- [ ] **S-VIEW-BUG-1 — drop-to-FX diagnosis (staff-engineer).** Dropping a capture onto a track's
|
||||
FX chain does not instantiate + init ReaSampler 9000 (drops as audio to arrange instead). The
|
||||
S17 machinery is **SDK-correct and present** (`TrackFX_AddByName` + `vst_chunk` injection, all
|
||||
verified); this is a **runtime bug**. Investigate in order: (1) FX-name match (`"VST3:" +
|
||||
vstPluginName()` vs REAPER's scanned name); (2) gesture routing (`decideGesture` →
|
||||
`InstrumentDrop` vs falling to `OsDrag` — the observed symptom); (3) `vst_chunk` write result +
|
||||
blob-format match with `setState`. **Verify in DAW:** drop → a playing instance on the track,
|
||||
one Ctrl-Z removes it.
|
||||
- [ ] **S-VIEW-SIZE-1 — 1080p default window size (staff-engineer).** The editor opens too small
|
||||
(`ViewRect(0,0,560,400)`). Mechanism **verified** (`getSize`/`setRect`/`checkSizeConstraint`/
|
||||
`onSize`/`canResize` in `vendor/vst3sdk/public.sdk/source/common/pluginview.h`): set a larger
|
||||
default `ViewRect` sized for the new three-band Sample face on 1080p (~840×560+ starting point,
|
||||
tuned to the band heights) + a `checkSizeConstraint` minimum floor. **Verify in DAW:** opens at
|
||||
the new default showing the full Sample face without scroll; cannot shrink below the floor.
|
||||
> **S-VIEW-BUG-1 and S-VIEW-SIZE-1 have both landed (Wave 1) — see `COMPLETED.md`.**
|
||||
|
||||
### Phase S editor redesign — forks (Daniel's to call)
|
||||
*(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.)*
|
||||
`envelope_edit` module. R10-F1 SETTLED 2026-07-27 — Option A flat y=1, folded into S-VIEW-9 above.
|
||||
Only F3 remains open.)*
|
||||
- **S-VIEW-F3 — Browse modal presentation:** full-window overlay (**lean**) vs. a centered sheet
|
||||
over a dimmed Sample. Presentation detail.
|
||||
- **R10-F1 — velocity-curve default (r10):** **Option A flat y=1** (**lean** — Daniel's verbatim
|
||||
"any velocity plays at full level"; NOT back-compat with today's linear `velocity/127`, so
|
||||
existing zones' dynamics change — flagged as a deliberate shipped-behavior change) vs. **Option B
|
||||
linear y = x/127** (bit-identical to the shipped engine; contradicts the verbatim "full level"
|
||||
default). The only non-back-compat surface the velocity-curve feature introduces. **Daniel's
|
||||
call.**
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user