Polyphonic simplex physical-modeling synth for Ableton Move, built on the Schwung framework.
Fizzik makes sound the way physical objects do: a short excitation (a strike, a pluck, a breath of noise) is injected into two simulated resonators — strings, beams, plates, membranes — and what you hear is the object ringing. A single Couple knob cross-feeds the two resonators into each other, so complex, emergent timbres arise from the interaction of two simple structures. That's the simplex idea: richness from simplicity.
Distilled from MechanOdd by odoare (FX-Mechanics); all DSP reimplemented independently in C for the Move.
- Install via the Schwung Module Store (or
MOVE_HOST=move.local ./scripts/install.sh), power-cycle the Move, and add Fizzik as a sound generator. - You land on the Patch page: browse Preset (knob 1), or roll the dice — Rnd Patch (k2) for a new instrument, Rnd All (k5) to also randomize FX and mods.
- Play the pads. Press into a held pad — polyphonic aftertouch makes notes bloom, swell, and sing (pick a feel with AT Preset on the Aftertouch page).
- Sculpt live with the global filter (Patch knobs 6–8) — 12 analog voicings.
┌──────────── Couple (cross-feedback) ────────────┐
▼ ▼
MIDI ─► EXCITER ──┬──► RESONATOR A ──┐
noise │ ├─► Balance ─► Amp Env ─► Pan ─┐
mallet └──► RESONATOR B ──┘ │ × 6 voices
crackle ▼
┌───────────────────────┘
▼
FILTER (12 voicings) ─► Drive ─► EQ ─► Chorus ─► Delay ─► Reverb
─► Width ─► Glue Comp ─► Soft-Clip ─► Lookahead Limiter ─► OUT
- 6-voice polyphony. Each voice: one exciter, two independent resonators, coupling, amp envelope, stereo spread. Voice stealing picks the quietest voice.
- Every coupled feedback node is guarded (DC-blocker + soft-limit) so coupling is self-limiting — it saturates like a real object instead of blowing up.
- All continuous knobs are smoothed (~20 ms, analog-style): no zipper, no clicks.
| Model | Physics | Character | Structure knob |
|---|---|---|---|
| String | Dispersive digital waveguide with tension modulation | Plucks, harps, basses, sitars | Dispersion (stiffness → inharmonic shimmer) |
| Beam | 1D modal morph f₀·n·√((1−b)+b·n²) |
Kalimbas, xylophones, music boxes | String→beam morph (harmonic → n² partials) |
| Plate | Kirchhoff plate modes ∝ (m/a)²+(n/b)² |
Bells, gongs, metallic shimmer | Aspect ratio (square → long) |
| Membrane | 2D wave modes ∝ √((m/a)²+(n/b)²) |
Drums, toms, skins | Aspect ratio |
Tension (String & Beam): tension-modulation nonlinearity (Tolonen/Välimäki) — hard hits transiently raise the pitch, which settles as the note decays: the pitch-glide of a hard-plucked string.
Jog wheel navigates pages; knobs 1–8 edit the current page.
| # | Param | What it does |
|---|---|---|
| 1 | Preset | 30 factory presets (click-free switching, even mid-note) |
| 2 | Rnd Patch | New random instrument: exciter + both resonators + couple/balance |
| 3 | Rnd Exciter | Randomize only the strike — audible on the next note |
| 4 | Rnd Reson | Randomize only the two resonators (keeps your exciter) |
| 5 | Rnd All | Randomize everything: patch + FX + filter + LFOs + aftertouch |
| 6 | Cutoff | Global filter cutoff (30 Hz – 18 kHz) |
| 7 | Resonance | Global filter resonance (ladder voicings self-oscillate at max) |
| 8 | Filter Type | LP / HP / BP / Notch |
| menu | Voicing | 12 filter voicings (jog-click to open the menu) |
Randomizers are tuned to stay musical: darker-leaning, never above the played pitch, level-consistent, and applied through a fast fade so they never click. Rnd All never touches the output limiter — your hearing-safety ceiling always survives the dice.
| # | Param | What it does |
|---|---|---|
| 1 | Exc Mix | Noise burst ↔ mallet (a single pitched sine cycle) |
| 2 | Crackle | Random impulse clicks mixed into the strike |
| 3 | Color | Resonant low-pass on the excitation — dark thud ↔ bright snap |
| 4 | Attack | Burst attack, 0.2–40 ms (slow = bowed/breathy onsets) |
| 5 | Decay | Burst length, 2–400 ms (long = scraped/bowed textures) |
| 6 | Exc Reso | Resonance of the Color filter (adds a formant-like peak) |
| 7 | Vel Level | How much velocity drives loudness |
| 8 | Vel Color | How much velocity drives brightness |
The exciter shapes the attack of the next note — it doesn't change ringing notes.
| # | Param | What it does |
|---|---|---|
| 1 | Model | String / Beam / Plate / Membrane |
| 2 | Structure | Model-specific (see table above) |
| 3 | Decay | Ring time, from dead thunk to near-endless |
| 4 | Damp | High-frequency damping — for modal models this is the brightness control |
| 5 | Position | Strike/pickup position — comb-like timbre changes (high = hollow) |
| 6 | Tone | String only: loop brightness filter |
| 7 | Tune | −24…+24 semitones relative to the played note |
| 8 | Tension | String/Beam: nonlinear pitch-glide on hard hits |
Detune A vs B a fifth or octave apart, then use Couple — that's where Fizzik sings.
| # | Param | What it does |
|---|---|---|
| 1 | Couple | Cross-feedback A↔B. 0 = independent, up = interacting, emergent, alive |
| 2 | Balance | A ↔ B output mix |
| 3 | Glide | Portamento, up to 500 ms |
| 4 | Amp Atk | Amplitude attack, 0.5–200 ms |
| 5 | Amp Rel | Release, 20 ms–3 s (the resonators keep ringing inside it) |
| 6 | Spread | Per-note stereo panning width |
| 7 | Drive | Warm saturation (dry/wet blended — silent at 0) |
| 8 | Level | Patch level |
| # | Param | What it does |
|---|---|---|
| 1 | Reverb | Wet mix of the stereo Schroeder reverb |
| 2 | Rev Size | Tail length |
| 3 | Rev Damp | Tail darkness |
| 4 | Delay | Wet mix of the stereo ping-pong delay |
| 5 | Dly Time | 30–700 ms (tape-style pitch warp when turned) |
| 6 | Dly Fbk | Feedback (echoes cross L↔R) |
| 7 | Dly Tone | Echo brightness |
| 8 | Width | Stereo width (M/S), 50% = as-is |
| # | Param | What it does |
|---|---|---|
| 1 | Tone | Tilt EQ — dark ↔ bright around 500 Hz |
| 2 | Body | Low-end weight (~150 Hz shelf) |
| 3 | Chorus | Stereo chorus mix |
| 4 | Cho Rate | 0.05–6 Hz |
| 5 | Cho Depth | Modulation depth |
| 6 | Glue | Bus compressor — cohesion and sustain for chords |
| 7 | Lim Drive | Pushes into the limiter (maximizer loudness) |
| 8 | Lim Ceil | Brickwall ceiling. Defaults low (≈ −3.5 dB) for headphone safety |
The output chain ends in a warm soft-clip followed by a 2 ms lookahead brickwall limiter (design borrowed from MechanOdd's Limiter). Whatever you do with resonance, coupling, or the randomizers, the output cannot exceed the ceiling. Raise Lim Ceil if you want more level; it is intentionally never randomized.
Each LFO: Rate (0.05–20 Hz) · Depth · Shape (Sine/Tri/Saw/Square/S&H) · Target (Off, Cutoff, Pitch, Couple, Balance, Tension, Tone, Reso).
Try: LFO1→Couple (slow sine) for breathing interaction; LFO2→Pitch (S&H, low depth) for broken-machine detune; LFO→Cutoff (square) for rhythmic filter chops.
Move's pads send polyphonic aftertouch: each held note responds to its own finger.
| # | Param | What it does |
|---|---|---|
| 1 | AT Preset | 10 curated feels (sets all seven depths at once) |
| 2 | AT Bright | Pressure opens the pressed note's resonator brightness |
| 3 | AT Bow | Pressure re-excites the note — plucks bloom into bowed sustains |
| 4 | AT Cutoff | Peak pressure opens the global filter |
| 5 | AT Vib | Pressure vibrato (per note) |
| 6 | AT Bend | Pressure bends pitch up (string-tension feel) |
| 7 | AT Vib Rate | Vibrato speed, 3–9 Hz |
| 8 | AT Curve | Pressure response — soft (sensitive) ↔ hard (needs a push) |
AT Presets: Off · Gentle · Brighten · Bow · Swell · Vibrato · Expressive (default) · Cello · Wild · Sforzato.
Channel aftertouch (from external MIDI) is also supported.
AlienChurch · BowedGlass · CaveStrings · CouncilsPiano · DistortedBass · FeedbackHarp · JudgementAwaits · OldResonances · PreparedPiano · RythmicBow · SensitiveSkin · Sharp · ShockingPluck · Slappy · SurroundedByBells · XyloStyle · GlassKalimba · IronLullaby · TidalGong · HollowReed · StarlightPad · BrokenMusicBox · DeepDiveBass · CopperTongue · GhostSitar · MarbleDrum · WhisperHarp · TitaniumBell · FrozenLake · PulseEngine
All presets are level-calibrated (peak and perceived loudness) so browsing never jumps out at you. Presets carry only the instrument — the global performance layer (filter, aftertouch, LFOs, FX 2 mastering) persists across preset changes and randomizes, so your live setup stays put.
Clean SVF · SEM · MS-20 · Steiner · Ladder 4P · Ladder 2P · Ladder 1P · Prophet · Oberheim · Diode · Sallen-Key · Vintage
Two engines under the hood (trapezoidal SVF + zero-delay-feedback transistor ladder, from the published VA-filter math), level-matched, all working in all four filter types. The ladder voicings self-oscillate at full resonance — bounded, never runaway. The filter is the main tool for taming a patch that's too bright.
- Bell into drum: Reson A = Plate (Tune +12), Reson B = Membrane, Balance center, Couple ~30% — struck metal over a resonant skin.
- Bowing without a bow: AT Preset = Bow or Cello, hold a pluck and press.
- Dub station: Delay mix + feedback up, then ride Dly Time — tape-style warble.
- One-knob mayhem, safely: park on Patch, hit Rnd All between phrases. The limiter ceiling guarantees it never gets dangerous.
./scripts/build.sh # Docker ARM64 cross-compile
MOVE_HOST=move.local ./scripts/install.shRequires Docker (aarch64-linux-gnu-gcc). Single C file, no dependencies. Power-cycle
the Move after installing so it reloads the module metadata.
Inspired by MechanOdd by odoare (FX-Mechanics). All algorithms reimplemented from published references: J.O. Smith, Physical Audio Signal Processing (CCRMA); Tolonen/Välimäki/Karjalainen, tension-modulation nonlinearity; RBJ Audio-EQ Cookbook; Cytomic/Zavalishin VA-filter design. Built with Schwung by Charles Vestal.
By Filliformes.
MIT — see LICENSE.