docs: spec Phase S stereo (S7), bank-ingest (S8), change-detection (S9)
Settled 2026-07-26: per-instance mono|stereo mode with automatic bus negotiation (S3-core extension); ingest routes through the bank, extension- owned, instrument stays read-only; bank-generation counter for hands-free recapture refresh. ME + drop-target SDK limits verified; spikes flagged.
This commit is contained in:
@@ -609,6 +609,55 @@ in-phase later point on the Phase S roadmap (**S6**), sequenced *after* the main
|
||||
`IPlugView` editor exists (it composes with that LICE path), not a someday-note. It is
|
||||
polish rather than a Tier-0 need, so it sequences last — but it is on the roadmap.
|
||||
|
||||
### Addendum — two directions set post-scoping (Daniel, 2026-07-26)
|
||||
|
||||
After Phase S was scoped (D-A..D-D), Daniel set two further directions. These are
|
||||
**settled directions**, not open forks — specced as new Phase S points (S7–S9), not
|
||||
re-litigated. Recorded here per the doc's settled-decisions convention.
|
||||
|
||||
**D-E — Channel mode: mono | stereo, per-instance, bus-negotiated (→ PLAN.md S7).**
|
||||
Captures are often stereo; the current mono downmix is a Tier-0 simplification. The
|
||||
engine gets a **per-instance channel-mode toggle (1 mono / 2 stereo)** that "works with
|
||||
the REAPER audio bus automatically" — the VST3 declares/negotiates its output bus
|
||||
arrangement (`setBusArrangements`) so mono/stereo just works in REAPER's routing. Honest
|
||||
scope: **this is an S3-core extension, not a shell hack** — the core is mono-per-sample by
|
||||
design today, so stereo mode grows a channel dimension (2-channel sample data, per-voice
|
||||
stereo render, per-channel loop/interp). Mono mode keeps the existing downmix path.
|
||||
Cross-mode policy: mono-source-in-stereo → dual-mono; stereo-source-in-mono → downmix
|
||||
(existing). The toggle is instrument-owned per-instance state (D-B: a performance choice,
|
||||
never a bank fact). Sequenced **first after the editor/embed work** because it touches the
|
||||
engine Daniel smoke-tests.
|
||||
|
||||
**Ingest routes through the bank — "option 1"; the extension owns ingest (→ PLAN.md
|
||||
S8 + S9).** Loading a sample into the sampler is **one gesture**: capture/import-into-bank
|
||||
+ auto-assign to the active instance. The **extension owns ingest** (it has arrange
|
||||
access, Media-Explorer access, and the drop-target surface on its own panels); the
|
||||
**instrument stays a read-only bank consumer** — it never captures or imports. Sub-parts,
|
||||
with the honest SDK reality verified against the vendored headers:
|
||||
|
||||
- *(a) Arrange capture → bank → assign* — a one-click action reusing the existing capture
|
||||
path; **never inserts a timeline item** (capture/placement separation intact).
|
||||
- *(b) Media Explorer import → bank → assign* — the ME surface is **thin**
|
||||
(`OpenMediaExplorer` + `MediaExplorerGetLastPlayedFileInfo` are the whole contract; no
|
||||
enumerate-selected, no ME-drop-handler), so ME import is **single-file, pull-on-action**,
|
||||
not a push/drop from inside the ME. Spike: does the last-played-file read work for a
|
||||
merely-*selected* file?
|
||||
- *(c) Drag-and-drop* — REAPER exposes **no** drag-drop registration API; drop handling is
|
||||
SWELL/Win32 on ReaSampler's *own* panel HWNDs. Drop *onto the VST3 editor window* relayed
|
||||
to the extension as a bank-ingest request is a genuine **cross-artifact spike**, not a
|
||||
promise (drop-onto-panel is the shipped path if it proves gnarly).
|
||||
- *(d) Recapture / ingest auto-refresh (→ S9)* — because instances reference sample **ids**,
|
||||
a recapture landing under the same id (M10) or an ingest touching the active bank should
|
||||
refresh live instances **hands-free**. The missing trigger is a **bank-generation counter**
|
||||
in `"reasampler"` ext-state: the extension bumps it on any bank-content mutation; the
|
||||
instrument polls it **off the audio thread** on a safe cadence and calls its existing
|
||||
`reloadFromBank()` on change (reusing S4's atomic handoff). This seam serves both S8 ingest
|
||||
and M10 recapture.
|
||||
|
||||
*The genuine spikes flagged (not decisions Daniel owes, just build-time unknowns):* the
|
||||
ME merely-selected-file read (b), and the drop-onto-editor cross-artifact relay (c). Both
|
||||
are honestly-flagged as spikes in PLAN.md S8, not promised.
|
||||
|
||||
---
|
||||
|
||||
## Where this landed
|
||||
@@ -626,10 +675,19 @@ into **Phase S** — a native VST3 sampler as a **second build artifact** alongs
|
||||
4. **D-D → embedded TCP/MCP UI scheduled** (**S6**), after the main editor exists — on the
|
||||
roadmap, not deferred.
|
||||
|
||||
**Authoritative from here:** **PLAN.md §Phase S** is the roadmap (S1–S6, sequenced by
|
||||
dependency order: spike → `Sample` fields → pure sampler core → Tier 0 → Tier 1 → embedded
|
||||
UI); **CONTEXT.md §Phase S** is the spec (seam-field semantics, scope contracts, the
|
||||
pure/shell split in the new artifact, the must-verify SDK/bridge surfaces). This doc is the
|
||||
Two further directions set post-scoping (2026-07-26; see the Addendum in §4):
|
||||
|
||||
5. **D-E → channel mode (mono | stereo), per-instance, bus-negotiated** (**S7**) — an
|
||||
S3-core channel-dimension extension, sequenced first after the editor/embed work.
|
||||
6. **Ingest through the bank ("option 1"), extension-owned** (**S8**) + **bank-generation
|
||||
hands-free refresh** (**S9**) — one-gesture capture/import + assign; the instrument stays
|
||||
a read-only consumer.
|
||||
|
||||
**Authoritative from here:** **PLAN.md §Phase S** is the roadmap (S1–S6 the original
|
||||
dependency chain: spike → `Sample` fields → pure sampler core → Tier 0 → Tier 1 → embedded
|
||||
UI; then **S7** stereo, **S8** ingest, **S9** change-detection); **CONTEXT.md §Phase S** is
|
||||
the spec (seam-field semantics, scope contracts, the channel-mode / ingest / bank-generation
|
||||
contracts, the pure/shell split, the must-verify SDK/bridge surfaces). This doc is the
|
||||
framing/decision record they point back to. The "no PLAN.md footprint" era is over.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user