Signal chain · 11 stages
Every stage is its own module. Bypass one and the signal routes around it — no gap, no click, even mid-note.
Parameters · by stage
Oscillator
open moduleNoise
open moduleFilter
open moduleAmp Env
open moduleLFO
open moduleDrive
open moduleCrush
open moduleChorus
open moduleTremolo
open moduleDelay
open moduleReverb
open moduleMaster
Every knob here belongs to one stage, and its path is namespaced by that stage's slug — the Filter's cutoff is filter.frequency, the Delay's feedback is delay-stage.feedback. Those are the same paths each stage publishes on its own page. Bypassed stages keep their values and grey out.
Keyboard
OSC-1
Play the module directly — nothing to cue.
OSC-1
The full synth, taken apart. Every stage is its own module.
About
OSC-1 is the flagship, and the flagship is a chain. Two oscillators and a noise layer feed a resonant filter, an amplitude envelope shapes the result, and then the effects rack runs in a fixed, musically-sensible order: drive, crush, chorus, tremolo, delay, reverb. That order is not a preference, it is the order the source synth has always used, and keeping it fixed is what makes a patch mean the same thing every time you load it.
What is different here is that none of those stages is welded shut. Each one is a real module with its own page, its own parameter table, and its own preview - the Filter stage in this chain is the same Filter module you can open on its own and play through a guitar take. When you learn a stage in isolation, you have learned it everywhere it appears.
Every effect stage starts bypassed, which is the same thing the source synth's Init patch does: the stage is built and sitting in the graph doing nothing, rather than absent and needing to be created. That is why toggling one mid-note does not click or drop the note - nothing is being rebuilt, the signal is simply being routed around a stage that was already there.
The preview here is the site's stand-in Web Audio engine, not the compiled kernel. The parameter names, ranges and defaults are ported from the real schemas so the vocabulary matches, but the sound is an approximation and none of the engine parity measurements apply to it.
11 stages, in signal order.
None of these is a sub-panel. Each one is a module with its own page, its own parameter table and its own preview — open any of them and it plays on its own. Inside OSC-1 they run in this order, and the ones marked bypassable can drop out of circuit without a gap.
Take it into your DAW.
Same DSP as this page. The plugin isn't a rebuild — it's the identical kernel from the identical TypeScript source, compiled native instead of to WASM.
Free forever, no account, and playing it in the browser will never ask you for one. VST3 and standalone today; AU and CLAP are on the roadmap.
How it works.
The chain is a fixed list of stages in signal order, and each stage declares whether it can be bypassed. Sources and the amplitude envelope are not bypassable - a synth with no oscillator and no envelope is not a quieter synth, it is a broken one. Everything after the envelope is.
Bypass is a routing decision, not a construction decision. Every stage exists in the graph from the moment the chain is built, with a dry path and a wet path into the same summing point. Disabling a stage ramps its wet path to zero and its dry path to one over a few milliseconds; enabling it does the reverse. Nothing is connected or disconnected while audio is flowing, which is why a held note survives the toggle intact.
Parameters are namespaced by stage. The filter's cutoff is filter.cutoff, the delay's feedback is delay-stage.feedback, and the chain routes each dotted path to the stage that owns it. Those are the same paths the stage's own page publishes, so a value you learn in one place is addressable from the other.
It's yours to read and to fork.
Research preview - licensing TBC, see /about
npx codex clone osc-1
npm run devThe codex CLI name is proposed, not shipped. That command gives you this module's DSP, schema, presets and UI as a local project — change a number, hear it immediately.