docs: record GA DAW-fix pass (Preserve SOLA, voice declick, stereo bus-pin+v9, .vstpreset drop-fx, drag-out, panel toggle); correct stale vst_chunk mechanism

This commit is contained in:
2026-07-28 07:12:07 -04:00
parent 3e3b79d78a
commit e99bdcf264
3 changed files with 101 additions and 43 deletions
+15 -28
View File
@@ -1813,32 +1813,19 @@ below.
**Symptom (Daniel):** dropping a capture onto a track's FX chain does not instantiate + init
ReaSampler 9000 — the audio-to-arrange drop works, but the "instrument init never fires."
**SDK sweep (done this pass — no false ceiling asserted):** the S17 drop-to-FX machinery is
**present and SDK-correct**. `src/instrument_drop_win.cpp` calls `TrackFX_AddByName(track,
"VST3:" + vstPluginName(), /*recFX*/false, /*instantiate*/-1)` then injects component state via
`TrackFX_SetNamedConfigParm(track, fx, "vst_chunk", <base64>)`; both signatures + semantics are
**verified present** in `reaper_plugin_functions.h` (the `VST3:` prefix, negative-instantiate =
always-new, and the `vst_chunk` base64 write-parm are all documented). The gesture is wired
(`src/bank_panel.cpp`: `decideGesture``InstrumentDrop` → on release `buildInstrumentDropChunk`
`performInstrumentDrop`), FX-hotspot detection uses `GetThingFromPoint` (`fx_*` prefix), and the
factory registers `kInstrumentSynthSampler` correctly. **So the platform CAN do this — the
capability is not in question; the wiring is present.** This is therefore a **runtime diagnosis
task, not a design decision or a platform-ceiling problem.** The likely fault domains for
staff-engineer to investigate (in order):
1. **FX-name resolution:** whether REAPER's scanned name for the plugin exactly matches `"VST3:" +
vstPluginName()` (a display-name/scan-name mismatch would make `TrackFX_AddByName` return 1).
2. **The gesture reaching `performInstrumentDrop`:** whether `decideGesture` actually resolves
`InstrumentDrop` over an FX button (vs. falling through to `OsDrag`, which produces exactly the
observed "drops as audio into arrange" symptom) — check the `overFxHotspot`/`GetThingFromPoint`
path and the single-capture arming guard.
3. **The `vst_chunk` write / blob format:** whether `TrackFX_SetNamedConfigParm` returns true and
the injected blob matches what `setState` accepts (a format drift would create-then-play-nothing
rather than fail to instantiate).
**Routing:** flagged for **staff-engineer** as a bug diagnosis. No product fork; no redesign
gates on it, but it is a **functional prerequisite** for the drop-to-FX gesture to feel finished.
**RESOLVED (GA post-launch DAW-fix pass, 2026-07-28).** The root cause was the injection
mechanism, not the gesture wiring: `TrackFX_SetNamedConfigParm(..., "vst_chunk", <base64>)`
is silently unappliable for VST3 — REAPER's VST3 wrapper cannot apply unframed raw component-state
bytes there (the write parm returns true but the instance stays at defaults). The fix:
`instrument_drop` builds a Steinberg-format `.vstpreset` file image (header + 'Comp' chunk =
serialized component state, class ID from `reasampler_uid.h`); `instrument_drop_win` writes a
transient temp file and applies it via `TrackFX_SetPreset(track, fx, path)`, which the SDK
documents as accepting full `.vstpreset` paths for VST3 plug-ins. FX hotspot prefix-set extended
to `tcp.fx*`/`mcp.fx*`/`fx_*` (embed strip tokens excluded). `reasampler_uid.h` split out of
`reasampler_vst.h` as an SDK-free header so `instrument_drop` (pure module) can derive the
class-ID hex string without the VST3 SDK.
**Verify in DAW:** drag a capture onto a track's FX button → a ReaSampler 9000 instance appears on
that track already playing that capture (one Ctrl-Z removes it).
that track already playing that capture (one Ctrl-Z removes it). **VERIFIED.**
### Engineering prerequisite 2 — default window size for 1080p (routed to implementation)
@@ -1919,9 +1906,9 @@ preview velocity **persists** via envelope-v6 `ComponentState`; the envelope ove
- **Editor size mechanism** — `getSize`/`setRect`/`checkSizeConstraint`/`onSize`/`canResize`
**verified present** in `vendor/vst3sdk/public.sdk/source/common/pluginview.h`; confirm the exact
min-size enforcement point (`checkSizeConstraint`) behaves under REAPER's host at build.
- **Drop-to-FX** — `TrackFX_AddByName` / `TrackFX_SetNamedConfigParm` / `GetThingFromPoint` all
**verified present** in `reaper_plugin_functions.h`; the remaining work is **runtime diagnosis**
(name match, gesture routing, blob format), not an SDK question.
- **Drop-to-FX** — `TrackFX_AddByName` / `TrackFX_SetPreset` / `GetThingFromPoint` all
**verified present** in `reaper_plugin_functions.h`; injection via `TrackFX_SetPreset` +
`.vstpreset` image (not `vst_chunk`) — **RESOLVED, GA DAW-fix pass 2026-07-28.**
- **Preview note through the voice engine off-thread** — confirm the existing `commitAndReload`
/ off-thread reload idiom is the right seam to fire a one-shot preview note without touching
`process` on the UI thread; no torn state on the atomic voice-engine pointer.