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.

  1. Always on
  2. Always on
  3. 05LFO

Parameters · by stage

Oscillator

open module
sawtooth
70%
0
0 ct
square
30%
0
7 ct
white
10%
0.00
lowpass
2.00 kHz
1.00
10 ms
200 ms
50%
500 ms
200 Hz
+4
10 ms
100 ms
50%
500 ms
4 Hz
sine
pitch
50%
40%
50%
4
50%
2 Hz
70%
3.5 ms
50%
10 Hz
50%
180°
100%
250 ms
30%
30%
70%
3.00 kHz
30%

Master

80%
16

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

← All modules
AvailableInstrumentComposable — 11 stages

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.

  1. 01OscillatorAlways on

    Two tone generators and the interval between them.

    8 params · oscillator.*

  2. 02NoiseBypassable

    The layer that gives an attack its edge.

    3 params · noise.*

  3. 03FilterBypassable

    The knob everybody reaches for first.

    9 params · filter.*

  4. 04Amp EnvAlways on

    Four numbers that decide whether it is a pluck or a pad.

    4 params · envelope.*

  5. 05LFOBypassable

    A slow wave pointed at something.

    4 params · lfo.*

  6. 06DriveBypassable

    Harmonics that were not there before.

    2 params · drive.*

  7. 07CrushBypassable

    Bit depth, sample rate, and bad decisions.

    2 params · crush.*

  8. 08ChorusBypassable

    One voice, pretending to be several.

    4 params · chorus.*

  9. 09TremoloBypassable

    Volume, going up and down on purpose.

    4 params · tremolo.*

  10. 10DelayBypassable

    The same thing again, slightly later, slightly quieter.

    3 params · delay-stage.*

  11. 11ReverbBypassable

    A room, approximated cheaply.

    3 params · reverb-stage.*

Take it into your DAW.

macOS (arm64 · x64)Windows (x64)Linux (x64)
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 dev

The 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.

Goes well with.

Available
A small subtractive synth with nothing to hide.

Instruments

Runs onlineVST3
KeyboardMIDIDemo phrase
Available
The knob everybody reaches for first.

Effects

Runs onlineVST3

Part of OSC-1

KeyboardMIDIDemo phraseGuitar take
Available
Harmonics that were not there before.

Effects

Runs onlineVST3

Part of OSC-1

KeyboardMIDIDemo phraseGuitar takeMic
Coming soon
A string, modelled rather than sampled.

Instruments

VST3
KeyboardMIDIDemo phrase