← All modules
AvailableMIDI & Modulation

A stage of OSC-1. It works the same on its own page as it does in the chain — same parameters, same paths.

LFO

A slow wave pointed at something.

Audio and MIDI

Browser session

Audio is stopped.

Input · MIDI keyboard

Octave C4

Your keyboard is a keyboard. Middle row plays the white notes, top row the black ones. Z and X change octave. Keys are ignored while you are typing in a field.

LFO

A low-frequency oscillator with a rate, a depth, a shape and a destination. Point it at pitch for vibrato, at the filter for a sweep, at amplitude for tremolo.

Parameters

LFO

4 Hz
0.00
0.00
50%

These knobs move the module's published schema, but the preview engine only renders OSC Mini, FX Mini and the OSC-1 chain — so they won't change what you hear yet.

Output · Audio signal

Waveform appears once sound is running.

The signal leaving LFO, tapped after the output stage. It's a picture of what your speakers are getting.

Preview engine (Web Audio)

About

A low-frequency oscillator with a rate, a depth, a shape and a destination. Point it at pitch for vibrato, at the filter for a sweep, at amplitude for tremolo.

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.

Every knob, and what it actually does.

Generated from the module's parameter schema — the same source as the web UI, the worklet transport and the VST3 parameter table, so it cannot drift.

ParamRangeDefaultUnitsWhat it doesAutomatable
LFO
Ratelfo.frequency0.1 … 204HzCycles per second. Under 1 Hz it is a slow drift; above about 8 Hz it stops being modulation and starts being timbre.Yes
Shapelfo.typesine · square · sawtooth · trianglesineThe modulation waveform. Square gives a two-state jump rather than a sweep, which is a trill rather than a vibrato.Yes (stepped)
Targetlfo.targetpitch · filter · amplitudepitchWhat the LFO moves. One destination at a time here - the full modulation matrix is a later stage of the port.Yes (stepped)
Depthlfo.depth0 … 10.5How far the target moves. Scaled per destination: at full depth pitch swings 100 cents, the filter 2 kHz, amplitude the whole way to silence.Yes

Parameter paths (filter.cutoff) are what you'll see in your DAW's automation list and in the SDK. Same names everywhere.

How it works.

One LFO running free (it does not retrigger per note) into a single destination, scaled by Depth against that destination's own range - cents for pitch, hertz for the filter, linear gain for amplitude. Those ranges are the ones the source schema declares.

One target rather than a routing matrix is a deliberate limit of this port, not a claim about the eventual engine. The source synth has a full routing list with per-route amounts; that arrives with the mod-matrix work, and this stage's param path stays valid when it does.

It's yours to read and to fork.

Research preview

npx codex clone lfo
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
The full synth, taken apart. Every stage is its own module.

Instruments

Composable — 11 stagesRuns onlineVST3
KeyboardMIDIDemo phrase
Available
Volume, going up and down on purpose.

Effects

Runs onlineVST3

Part of OSC-1

KeyboardMIDIDemo phraseGuitar takeMic
Available
One voice, pretending to be several.

Effects

Runs onlineVST3

Part of OSC-1

KeyboardMIDIDemo phraseGuitar takeMic