A real DSP synthesizer in the browser — genuine sample-rate synthesis, not preset OscillatorNode toys.
| Stage | Technique |
|---|---|
| Oscillators | PolyBLEP band-limited saw/square/tri + wavetable mode |
| Wavetable Lab | draw your own wave on a canvas, or load 5 harmonic recipes |
| Filter | ZDF State-Variable Filter (zero-delay feedback), per voice |
| Envelopes | analog-style one-pole exponential ADSR |
| FM | instantaneous-frequency modulation (DX7-style) |
| Morph | continuous interpolation between any two presets |
| MIDI/MPE | Web MIDI input: notes + velocity, CC automation, per-note pitch bend |
| 3D Spectrum | perspective-projected log-spaced frequency bars with depth sorting |
| Arpeggiator | UP/DOWN/UP-DOWN/RANDOM, multi-octave, hold/latch, sample-accurate lookahead scheduling |
| Step Sequencer | 16-step gates with per-step accents, 3-state step buttons, playing-step highlight |
| Performance Macros | 4 oversized live knobs: Cutoff / Resonance / Space / FM Drive (Serum-style) |
| WAV Export | live capture from master bus -> real 16-bit stereo WAV download |
| MIDI Export | capture manual/arp/seq notes -> Standard MIDI File (.mid) for your DAW |
| PWA | installable, offline-first (service worker caches all assets) |
| Space FX | convolution reverb + feedback delay on master bus |
| Output | tanh soft-clip stage |
| Voices | 16-voice pool, oldest-note stealing |
Open index.html (or enable GitHub Pages) -> POWER -> play with mouse or keys A W S E D F T G Y H U J K.
Wavetable Lab: pick a recipe (COSMIC/NEURO/GLASS/VOID/VOCAL) or draw your own wave and hit USE DRAWING, then set WAVE to USER. Morph: choose presets A + B and sweep the MORPH knob.
| Path | Role |
|---|---|
| index.html | panel layout |
| css/synth.css | boutique hardware design system |
| src/synth-engine.js | AudioWorklet DSP engine + master FX |
| src/wavetable.js | wavetable rendering, editor, morph engine |
| src/knob.js | SVG rotary knobs with tick marks |
| src/presets.js | preset bank |
| src/ui.js | panel builder, keyboard, OLED scope |
| docs/ | architecture + design research |
Press REC, play, press STOP — a 16-bit stereo WAV downloads automatically.
Connect a MIDI keyboard, press POWER, and play. CC1=mod/LFO depth, CC74=cutoff, CC71=resonance, CC7=master. Pitch bend is per-note (MPE-style).
No tokens/keys in this repository. .gitignore blocks .env and key files.
- PSY BASS 141 — the rolling psy bass, built for the step sequencer
- TRANCE GATE — square-wave amp LFO at 4.7Hz (141 BPM 1/8 gate) — the classic gated trance lead
- ACID 303 / GOA BLEEP / PSY STAB / DARK PAD / ROLLING ARP — psy staples
- Sequencer defaults to 141 BPM
index.html is a self-contained bundle (all CSS+JS inlined, ~93KB): one request, full instrument, zero module-load failure modes. Modular sources stay in src/ for development; the bundle is the built artifact.
The page self-diagnoses: if the panel fails to build (e.g. stale cache after a deploy), a red diagnostic box appears with the captured errors and a one-click REPAIR button (unregisters service workers, clears caches, reloads). The service worker is network-first, so online visits always get the latest build.
Press the MIDI button, play (or let SEQ/ARP play), press STOP — a .mid file downloads. Tempo metadata is taken from the active sequencer/arpeggiator.
Toggle steps: click cycles OFF -> ON -> ACCENT. Hold a chord (or enable HOLD), press SEQ ON. Sequencer and arpeggiator are mutually exclusive — enabling one disarms the other.
MIT (see LICENSE)