diff --git a/PLAN.md b/PLAN.md index 3afc89e..44243d1 100644 --- a/PLAN.md +++ b/PLAN.md @@ -110,22 +110,21 @@ working hit-test; the VST-host bridge resolves `GetProjExtState` by name and rea known `"reasampler"` value. Nothing plays yet — this is the loading/drawing/bridge proof. -- [ ] CMake second target: a separate VST3 module artifact built alongside +- [x] CMake second target: a separate VST3 module artifact built alongside `reaper_reasampler` (Windows VST3 export/bundle wiring; `GetPluginFactory` + `InitDll`/`ExitDll` — **verify exact export names against the vendored SDK**). -- [ ] `SingleComponentEffect` skeleton: factory + class registration, `initialize` +- [x] `SingleComponentEffect` skeleton: factory + class registration, `initialize` declaring an event-input bus + an audio-output bus (no audio input), `setupProcessing`, `setActive`, empty `process`. Loads silently in REAPER. -- [ ] `IPlugView`↔LICE bridge spike: open a plugin editor window hosting a LICE-drawn +- [x] `IPlugView`↔LICE bridge spike: open a plugin editor window hosting a LICE-drawn surface (window creation/sizing, host→draw/hit-test event routing), reusing the `bank_panel` LICE/SWELL competence. **The decision's one real unknown — prove it here.** (VSTGUI is the noted fallback only if this proves gnarlier than the panel work suggests.) -- [ ] Bridge read spike: resolve `GetProjExtState`/`EnumProjExtState` by name over the - host callback (`hostcb` opcode `0xdeadf00d`), fetch host project context - (`0xdeadf00e`), and read a known `"reasampler"` ext-state value. **Verify opcodes + - marshalling against `reaper_plugin.h` / `video_processor.h` / - `reaper_plugin_functions.h`.** +- [x] Bridge read spike: resolve `GetProjExtState`/`EnumProjExtState` by name via + `IReaperHostApplication::getReaperApi` (host project context via `getReaperParent(3)`) + from `reaper_vst3_interfaces.h`, and read a known `"reasampler"` ext-state value. + (The `0xdeadf00d`/`0xdeadf00e` opcodes are the VST2 path — verified not applicable here.) ## S2 — `Sample` intrinsic fields (root note + loop points; in the *extension*) **Goal:** Add the two bank-intrinsic seam fields to `Sample` — **root note** (MIDI @@ -143,13 +142,13 @@ additive). **Depends on:** nothing in Phase S (extension-only; can land before or in parallel with S1). -- [ ] Add `rootNote` (optional MIDI note) + `loopStart`/`loopEnd` (optional +- [x] Add `rootNote` (optional MIDI note) + `loopStart`/`loopEnd` (optional sample-accurate loop points) to `Sample`; JSON serialize/deserialize with clean defaults for samples lacking them (additive, backward-compatible — mirror of how `provenance` was added). -- [ ] Populate the fields on capture where derivable (root note) / settable (loop +- [x] Populate the fields on capture where derivable (root note) / settable (loop points); leave them cleanly empty otherwise. No existing `Sample` field changes. -- [ ] Tests: full round-trip lossless including the new fields; a legacy `Sample` +- [x] Tests: full round-trip lossless including the new fields; a legacy `Sample` JSON (no new fields) parses with defaults and re-serializes without loss; additive invariant (no change to existing fields, dedup, tier, or `BankIndex` behavior).