States rung one as spent rather than derivable, so following the instruction no longer contradicts the stated number — the trap that caused the collision.
ReaSampler
Version 1.4.0 · License: GNU AGPL v3 (see LICENSE)
A per-project audio sample-bank capture tool for REAPER, built as two artifacts: a
native C++ REAPER extension (reaper_reasampler) and a Windows-only VST3 sampler
instrument (reasampler_9000.vst3, ReaSampler 9000). It captures any arbitrary audio
source into a per-project sample bank (cached files + a docked grid), decoupled
from the arrange view, with keyboard/MIDI-bindable capture and placement. It is
designed as a precision tool: deterministic captures, non-destructive by
construction, no auto-inserted clutter.
Status
Under active development, not yet formally released.
The two artifacts
reaper_reasampler — the REAPER extension. Captures audio into a named,
per-project sample bank and provides bindable actions across the workflow: offline
and realtime capture (with cancel), batch capture (per selected item or per razor
area), recapture-from-source, capture-and-assign to a live instrument instance,
insert with an opt-in tempo-conform variant, the resample-bake landing action,
multi-bank management (pool, activate, evacuate, move, copy, delete), prune/reclaim,
provenance and lineage tracking, Design View, and ingest via drag-out, arrange-drop,
and instrument-drop. All of it surfaces in a docked bank panel.
ReaSampler 9000 (reasampler_9000.vst3) — a Windows-only VST3 sampler
instrument that plays bank captures back across a MIDI keyboard. Since
ComponentState v10 it is self-contained: it decodes samples from its own
persisted references and plays with the extension absent, treating the bank as a
browsing source rather than a runtime dependency. The VST3 target
(reasampler_vst) is gated on WIN32 AND EXISTS .../pluginfactory.cpp — omitted
on macOS/Linux even when the vendored vendor/vst3sdk slice is present, and
quietly omitted anywhere the slice itself is absent.
A beta channel build is available via -DREASAMPLER_CHANNEL=beta at configure
time, producing reaper_reasampler_beta and reasampler_9000_beta.vst3. The two
channels coexist in one REAPER installation and do not share state.
The load-bearing principle
Capture and placement are separate acts. Capturing audio writes a file to the bank and adds an index entry. It never puts an item in the arrange view. Placement is a distinct, on-demand action. Any code path that auto-inserts a capture into the timeline violates the purpose of the tool.
Prerequisites
- CMake ≥ 3.19
- A C++17 compiler
- Windows + MSVC to build the VST3 target (
reasampler_vst) — the REAPER extension itself is cross-platform - PHP, to run the SWELL resource-generation step on macOS/Linux (below)
Platform support
The REAPER extension targets Windows, macOS, and Linux; ReaSampler 9000 (the VST3 instrument) is Windows-only.
| Platform | Extension | VST3 instrument |
|---|---|---|
| Windows | Builds with no extra steps | Builds when vendor/vst3sdk is present |
| macOS | Builds, but dialogs need the manual SWELL resgen step below plus hand-uncommenting the APPLE target_sources block in src/app/CMakeLists.txt |
Not built (Windows-only gate) |
| Linux | Same manual resgen + hand-uncomment requirement as macOS, against its own commented block | Not built (Windows-only gate) |
A macOS/Linux build that skips the resgen-and-uncomment step compiles cleanly without dialogs and without a warning — this is expected, not a bug.
One-time setup
A plain git clone --recursive also works, but it pulls every nested submodule of
vendor/vst3sdk (including vstgui4, tutorials, doc, cmake — none of which
this project links against). The steps below pull only the three submodules
actually needed:
git submodule update --init
Vendors three submodules:
-
vendor/reaper-sdk—sdk/reaper_plugin.h,sdk/reaper_plugin_functions.h, SWELL headers -
vendor/WDL— WDL utilities and the SWELL cross-platform Win32 layer -
vendor/vst3sdk— Steinberg VST3 SDK (Windows-only; requires a nested init after the top-level init):git submodule update --init vendor/vst3sdk cd vendor/vst3sdk && git submodule update --init pluginterfaces base public.sdk
Build and test
cmake -B build -S .
cmake --build build
ctest --test-dir build -C Debug
On a multi-config generator (Visual Studio, Xcode), cmake --build build with no
--config builds Debug — nothing in this build sets CMAKE_BUILD_TYPE or an
optimization flag, so that's the default. The -C Debug above is required on a
multi-config generator too: without it, ctest silently reports every test as "Not
Run" instead of running them. Single-config generators (Ninja, Make) need neither
flag.
Pure core/ modules each have a corresponding <module>_tests executable target
that runs without REAPER or a DAW. Targets are declared per-directory — each
src/**/CMakeLists.txt owns its own libraries and test targets, pulled in via
add_subdirectory from the root CMakeLists.txt, which itself declares no targets
directly.
Installing or judging performance requires the Release config explicitly:
cmake --build build --config Release
ctest --test-dir build -C Release
Beta channel
cmake -B build-beta -S . -DREASAMPLER_CHANNEL=beta
cmake --build build-beta
macOS / Linux dialog resources
src/resource.rc must be pre-processed by SWELL's resgen once per platform:
php vendor/WDL/WDL/swell/swell_resgen.php src/resource.rc # macOS; Linux reuses the output
Add the generated file to the appropriate APPLE / Linux target_sources block in
src/app/CMakeLists.txt (both are commented out by default). The SWS extension
build is the canonical reference for this step.
Install
There is no hot reload; REAPER loads extensions at startup only.
Extension — copy the Release build's reaper_reasampler binary
(build/Release/ on a multi-config generator — not the default Debug/ output)
into REAPER's UserPlugins/ folder (Options → Show REAPER resource path), then
restart REAPER.
VST3 instrument — copy the Release build's reasampler_9000.vst3 into the
system VST3 folder (C:\Program Files\Common Files\VST3 on Windows) — a different
destination from the extension, not UserPlugins/. REAPER picks it up on its next
plugin rescan.
Repo layout
The codebase is organized around one discipline: pure, REAPER/VST3-SDK-free testable core, split from the REAPER- and VST3-facing shells that touch those host types.
src/app/— the REAPER extension's entry point (main.cpponly)src/core/— pure modules, no REAPER or VST3 SDK types, each with a<module>_teststarget:audio/,capture/,instrument/(further split intobake/,engine/filter/,engine/loop/,map/,note/,ui/),json/,model/,reclaim/,tracking/,ui/,util/,version/,view/,wire/src/shell/— REAPER/VST3-facing shells:actions/,bank_ops/,capture/,instrument/(the ReaSampler 9000 VST3 shells),panel/,persist/,view/src/resource.rc,src/resource.h,src/ext_keys.h— root-level build inputs not claimed by any one subdirectorytests/— unit test sources for the purecore/modulescmake/— shared CMake target-declaration helpersdocs/— plan-style docs and product-design docs (see Further reading, below)vendor/— git submodules
See CLAUDE.md for the full module inventory, architectural contracts, and the
precise boundary between pure core and REAPER/VST3-facing shells; each src/**/
directory also carries its own CLAUDE.md with that area's own module list and
invariants.
License
GNU AGPL v3, copyright Daniel Harvey. See LICENSE.
Further reading
CLAUDE.md— architecture, module inventory, and build/API contractsdocs/PLAN.md— the active roadmapdocs/COMPLETED.md— landed milestones for the current (1.x) cycledocs/TODO.md— deferred follow-ups, with the reason each was deferreddocs/TODO-1.0.md— the raw 1.x work list this cycle's plan was structured fromdocs/ARCHIVE.md— pre-1.0 historydocs/cmake-cheatsheet.md— a standalone build-system referencedocs/product/— the product-design reasoning behind each phase