Ξ-W2-T1: the resample bake chain — instrument renders, extension banks, one click re-points and resets
This commit is contained in:
@@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||
|
||||
**ReaSampler** is a per-project audio sample-bank capture tool that builds two artifacts: the REAPER extension (`reaper_reasampler`) and **ReaSampler 9000**, a Windows-only VST3 sampler instrument (`reasampler_9000.vst3`, `core/instrument/` + `shell/instrument/`, second CMake target `reasampler_vst`, gated on the vendored `vendor/vst3sdk` submodule slice). The pure-testable-core / REAPER-facing-shell discipline is preserved throughout: `core/` never includes REAPER or VST3 SDK types, `shell/` is where those hosts are actually touched, `app/` is the extension entry point. Every REAPER API name cited in project docs is correct-by-intent; verify argument order, types, and flag values against `vendor/reaper-sdk/sdk/reaper_plugin_functions.h` before use.
|
||||
|
||||
Per-module detail — what each file owns, its invariants — lives in the twenty-two per-directory `src/**/CLAUDE.md` files; see the compact map in "Architecture: the load-bearing split" below to find the right one. Landed-phase history lives in `docs/ARCHIVE.md`; current work lives in `docs/COMPLETED.md`, `docs/TODO.md`, and `docs/TODO-1.0.md` — see "Project docs" below.
|
||||
Per-module detail — what each file owns, its invariants — lives in the twenty-three per-directory `src/**/CLAUDE.md` files; see the compact map in "Architecture: the load-bearing split" below to find the right one. Landed-phase history lives in `docs/ARCHIVE.md`; current work lives in `docs/COMPLETED.md`, `docs/TODO.md`, and `docs/TODO-1.0.md` — see "Project docs" below.
|
||||
|
||||
## Settled decisions
|
||||
|
||||
@@ -83,14 +83,15 @@ There is no hot-reload. Copy the **Release** build's binary (`build/Release/` on
|
||||
|
||||
## Architecture: the load-bearing split
|
||||
|
||||
`core/` holds pure, unit-testable logic — no REAPER or VST3 SDK types, each with a corresponding `<module>_tests` target that runs without a DAW. `shell/` holds the REAPER/host-facing shells — where those SDK types are actually touched. `app/` is the extension entry point. Each of the twenty-two directories below carries its own `CLAUDE.md` with the full module list and that area's invariants — open the relevant one for detail; this file states only repo-wide truth.
|
||||
`core/` holds pure, unit-testable logic — no REAPER or VST3 SDK types, each with a corresponding `<module>_tests` target that runs without a DAW. `shell/` holds the REAPER/host-facing shells — where those SDK types are actually touched. `app/` is the extension entry point. Each of the twenty-three directories below carries its own `CLAUDE.md` with the full module list and that area's invariants — open the relevant one for detail; this file states only repo-wide truth.
|
||||
|
||||
| Directory | Scope |
|
||||
|---|---|
|
||||
| `src/app/` | REAPER extension entry point |
|
||||
| `src/core/audio/` | pure audio-data math |
|
||||
| `src/core/capture/` | pure logic behind the capture pillar |
|
||||
| `src/core/instrument/` | pure VST3-instrument core (engine / map / note / ui) |
|
||||
| `src/core/instrument/` | pure VST3-instrument core (bake / engine / map / note / ui) |
|
||||
| `src/core/instrument/bake/` | the resample bake's pure half — the programmed note resolved to a frame window, the offline render over a bake-only voice engine, and the post-bake reset |
|
||||
| `src/core/instrument/engine/filter/` | pure per-voice resonant TPT/SVF filter (HP→BP→LP / HP→notch→LP morph, drive stage), run by each `Voice` between the pitch and amp stages |
|
||||
| `src/core/instrument/note/` | the programmed capture-signal model — musical divisions, tempo resolution, anchored offsets |
|
||||
| `src/core/json/` | the hand-rolled JSON lexical layer |
|
||||
@@ -208,6 +209,26 @@ Plan-style docs live under `docs/`:
|
||||
- **Relative paths only** in the persisted `BankIndex`.
|
||||
- **Capture FX scope:** two scopes only — item = item/take FX only; track = item FX + the selected track's own track FX. There is no master scope (to capture the master, render a track instead). For both scopes, the out-of-scope chain (ancestors + master track, plus the item's own track for item scope) has its FX, gain, and pan/width/pan-law/mode neutralized to unity — the master track is bypassed as out-of-scope chain, not captured as a scope. Range (time selection or razor) is orthogonal.
|
||||
|
||||
## The resample bake — the one crossing from instrument into bank
|
||||
|
||||
A click inside the ReaSampler 9000 editor bakes the dialed sound into a bank capture. The
|
||||
split is: **the instrument renders, the extension banks.** The instrument produces the audio
|
||||
on its own voice path in its own process (so the bake is the object code that made the sound
|
||||
the user approved, immune to engine-version skew between the two artifacts), stages it
|
||||
outside the bank folder, and invokes ONE extension action over the VST3 host bridge; the
|
||||
extension lands it and answers over the same per-instance key, synchronously, inside that
|
||||
call. Consequences that bind:
|
||||
|
||||
- **The extension's link graph does not gain the voice engine.** `sampler_core` /
|
||||
`pitch_shift` / the filter are NOT linked into `reaper_reasampler` — a link edge to any of
|
||||
them means the design drifted back to an extension-side render.
|
||||
- **No arrange mutation and no deletion.** The bake writes a file plus an index entry, like
|
||||
every other capture. "Replace" means the bank entry now denotes the recapture; the
|
||||
superseded file survives on disk until a prune reclaims it — the iterate loop's recovery
|
||||
floor.
|
||||
- **The bake adds nothing to `process()`.** It renders on the UI thread over a separate
|
||||
`VoiceEngine`, with the live-parameter block detached.
|
||||
|
||||
## Non-goals / guardrails
|
||||
|
||||
- No auto-insertion of captures into the arrange (see the load-bearing principle).
|
||||
|
||||
Reference in New Issue
Block a user