Syntho Sampler
A free instrument for playing layered sample libraries.
The compiled sampler: one kernel, every target.
Browse the sampler banks — every zone map, preset and sample in the format.
Price
Free
You are in the live demo. Included formats, release status, and downloads live on the product page.
Two samplers existed in this repository: a Web Audio prototype that could read a sample library's map, and a compiled reader that could ship as a plug-in. The repository's invariant settles which one is the product — Web Audio DSP is reference-only and never a production fallback — so the reader is the sampler, and the prototype's selection semantics were ported into it rather than the other way round.
What a sampler mostly does is choose. Which recording answers this key, which layer answers this strike, which take comes up next so a repeated note does not sound mechanical, what happens when the key is released. Those choices are the engine. Putting them in a compiled kernel means the choice a plug-in makes and the choice the browser makes are the same choice, provably, rather than two implementations that agree until they do not.
That proof is the point of the gate: twelve scenarios, five lanes — the Node oracle, the ScriptC LLVM archive, the ScriptC C-emission archive, a repeat run, and the wasm32-wasi reactor — compared byte for byte, with behavioural assertions alongside, because byte parity alone would also be satisfied by a kernel that ignored every feature it claims.
Round robin is deterministic here, which is a deliberate departure from the sampler engines it takes after. A clock- or Math.random-seeded selector cannot pass a byte-parity gate at all, so takes advance from a pure integer generator seeded per group. The randomness is real to a player and reproducible to a test.
Some things are refused rather than approximated. Legato is rejected when a bank declares it, with its own return code, because there is no legato axis in the program model; an out-of-range round-robin take is refused rather than wrapped, because a bank whose 33rd take quietly became take 1 would be a plug-in playing the wrong sample. A missing algorithm keeps its content unsupported; it never authorizes a different implementation.
The downloadable Codex Sampler release supports the hosts and systems listed below.
Works in Ableton Live, Reaper, Cubase, Studio One, Bitwig and FL Studio.
Every row below is a recorded build row or the recorded absence of one. Nothing here is inferred from what this module is meant to support.
| Format | Result | Download |
|---|---|---|
| Browser package (JS) | Builtweb bundle sha256 fdd09a001d73… · 803 KB | Built, but no downloadable archive was recorded. |
| Browser package (WASM) | Builtweb bundle sha256 34b5adeeeb06… · 2.0 MB | Built, but no downloadable archive was recorded. |
| VST3 | Builtdarwin-arm64Steinberg validator + VST3 host render: passed bundle sha256 453acae9fe42… · 3.5 MB | CodexSampler-vst3-darwin-arm64.zip archive sha256 e886bb2bce8c… · 3.5 MB · darwin-arm64 |
| Audio Unit | Not built no recorded artifact row for au; native-lane-report.json is absent or records no au row for this module | Not built for macOS |
| CLAP | Not built no recorded artifact row for clap; native-lane-report.json is absent or records no clap row for this module | Not built for macOS, Windows or Linux |
| Standalone app | Not built no recorded artifact row for standalone; native-lane-report.json is absent or records no standalone row for this module | Not built for macOS, Windows or Linux |
Parity
browser-js = browser-wasm = vst3 qualified against their own recorded digests. Not recorded: au, clap, standalone.
Start from a named sound, then adjust the instrument to make it yours.
Migration fallback: approximated from parameter groups, not a runtime wiring diagram.
A bank is a `codex-sound-pack/v1` manifest plus its instrument document and its PCM. The build interns the samples into one contiguous arena and emits a flat zone table; nothing about the map is re-derived from the audio at runtime.
Loading a bank is a non-realtime operation. The host writes the arena, then declares each zone with one `set_zone` call carrying the row's fields verbatim, then plays. The render callback that follows allocates nothing, takes no lock, performs no I/O and calls back into no JavaScript.
Every new zone field is validated with a distinct return code rather than clamped, so a build or ABI mismatch says which fact was wrong instead of quietly playing something else. Loop points are rebased onto the trimmed zone, and a loop that does not survive the rebase is forwarded as no loop — the bank plays as a one-shot rather than being refused outright.
The loop wrap is one integer division rather than a subtract-until-in-range loop. The natural `while` form was correctly rejected by ScriptC's realtime prover, which could not bound its iterations from the types — nothing stopped a tiny loop length and a huge index — so the construct was rewritten rather than the compiler patched.
The same profile builds the native archive and the wasm32-wasi reactor. `verify/browser-wasm-lane.mjs` loads that exact `.lib.wasm` in headless Chromium, drives the `scsrd_` ABI and byte-compares against Node: it proves the artifact executes correctly in a browser engine, and deliberately does not claim AudioWorklet scheduling, which needs a reader-ABI bank-install path in the persistent worklet host.
A free instrument for playing layered sample libraries.
A sixteen-pad drum machine whose whole kit morphs across three faces at once.
A recording split into a playable grain cloud.
A physical string model, rendered per note.