A Minimoog-inspired 3-oscillator polysynth with a Moog ladder filter, born from a Python synth that couldn't stop clicking.
(The actual Rust + egui app compiled to WASM β same panel, same knobs, same sound. No install.)
It started as VOOG, a synth written in Python + NumPy. It sounded great β until you played a chord. Then it clicked, popped, and dropped out. The culprit wasn't CPU power; it was garbage-collection pauses and GIL contention firing inside the audio callback, blowing the 5.8 ms real-time deadline at random.
You can't fix that with faster Python. So we rewrote the whole thing in Rust:
No garbage collector. No locks in the audio thread. No allocations in the hot path. No glitches.
Same synth architecture, deterministic real-time audio, and a GUI that actually looks like hardware.
- ποΈ 3 oscillators β sine / saw / square / triangle, band-limited wavetables, per-osc octave, semitone, detune & level
- π Moog ladder filter β authentic Huovilainen 24 dB/oct model with resonance, envelope & key-tracking
- π Dual ADSR envelopes β independent amp & filter contours
- π LFO β 4 waveforms, routable to filter / pitch / amp
- πΉ Jupiter-8-style arpeggiator β Up / Down / Up&Down / Random, 1β4 octaves, rate, gate and hold (latch)
- π Master effects β modulated chorus (rate + depth) and feedback delay (time + feedback)
- πΉ 8-voice polyphony Γ 4 multitimbral channels with oldest-note voice stealing
- ποΈ Glide/portamento (off / always / legato) + white & pink noise
- πΌ 37 factory presets β from sub basses to screaming leads, many ported from classic Minimoog patch charts (Parliament, ELP, Wakeman, Taurusβ¦)
- π¨ Minimoog-inspired GUI β custom rotary knobs, VU meter, virtual keyboard (mouse + QWERTY)
- πΉ MIDI input with a full CC map (graceful fallback with no device)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β crate: voog (binary) β
β β
β egui GUI ββparams/notesβββΊ lock-free queue βββΊ audio β
β (main thread) (crossbeam) callback β
β β² (cpal RT) β
β βββββββββββββ VU / voices ββββ atomics ββββββββββ β
β β
β midir ββMIDI eventsβββΊ same lock-free queue β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β depends on
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β crate: voog-dsp (library β no I/O, 100% unit-tested) β
β oscillator Β· moog filter Β· adsr Β· lfo Β· noise Β· glide β
β voice Β· allocator Β· channel Β· synth Β· presets Β· params β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The real-time contract: the audio callback never allocates and never locks. The GUI and MIDI threads push events onto a lock-free ring; the callback drains them, renders one block, and publishes meters via atomics. That single discipline is what killed the dropouts.
Tip
Run the native build for the real experience. The audio thread is allocation- and lock-free, so it's rock-solid β no clicks, no dropouts. The in-browser WASM demo is great for a quick try, but browsers schedule audio on the main thread (no cross-origin isolation on GitHub Pages β no audio worklet thread), so it can crackle or add latency. Native has none of that.
Requires a stable Rust toolchain (edition 2021).
git clone https://github.com/gpasquero/rusted-moog.git
cd rusted-moog
cargo run --releasePlay with your mouse on the on-screen keyboard, your computer keyboard (A W S E D F T G Y H U J K), or a MIDI controller.
The entire DSP + engine core is pure and unit-tested β no audio device required:
cargo test --workspace # 62 tests
cargo clippy --workspace # zero warnings- Patch save/load to disk (JSON, VOOG-compatible)
- Oversampling for the filter at high resonance
- Effects: chorus / delay / drive
- Stereo spread & unison
- Web build via WASM + WebAudio β live
Ladder filter after Antti Huovilainen's model. Pink noise via Paul Kellet's approximation. Inspired by the Moog Minimoog Model D and Subsequent 37. Rebuilt in Rust with cpal, midir and egui.
MIT Β© gpasquero β see LICENSE.