How Aether HD Makes Strudel Run With Zero-Allocation Speed
Stock browser live-coding creates, connects, and garbage-collects hundreds of JavaScript AudioNode objects every bar. Aether HD is LILA's hybrid Rust + WebAssembly DSP engine running inside a dedicated AudioWorklet—delivering 128 preallocated voices, click-free legato stream matching, and 30 procedural physical-modeling & rave instruments while keeping 100% compatibility with Strudel 1.3.0.
128 preallocated Rust voices, 8 zombie steal-fade tails, and 4 FDN reverb buses. Zero GC pauses inside process().
Compact little-endian AetherEvent records drained from an 8,192-slot min-heap with dedicated kick/bass priority reserves.
Branchless 9th-order minimax sine kernel (< 2e-9 error) + phase-continuous legato stream matching across .seg().
30 canonical lila_* voices synthesized via modal banks, waveguides, and ZDF ladders—zero network sample-pack stalls.
Real-World Strudel Bottlenecks Solved
Stock Web Audio Graph vs. Aether HD Rust/Wasm
Select a musical workload below to see how Aether HD eliminates main-thread node churn, phase clicks, and filter aliasing.
Phase-Continuous Legato Stream Matching
Modulating filter cutoffs, panning, or pitch over time without voice explosion or segment-boundary clicks.
setcps(120/60/4)
note("<c2 eb2 g2 f2>")
.s("lila_saw")
.seg(16)
.lpf(sine.range(240, 2800).slow(4))
.lpq(6)
.pan(sine.range(0.2, 0.8).slow(2))
.gain(0.42)Standard Web Audio creates a brand-new OscillatorNode, BiquadFilterNode, and GainNode for every single .seg(16) slice.
- 16 discrete note evaluations per cycle spawn 16 overlapping synth sub-graphs per bar.
- Oscillator phase and filter state reset at each segment boundary, producing audible zipper clicks.
- Garbage collection of short-lived AudioNodes competes with main-thread UI and CodeMirror updates.
VoicePool::trigger_voice_with_hints detects segmented haps on the same (sound_id, stem_id, orbit) stream and reuses one continuous 64-bit voice.
- Zero new voices allocated across all 16 segments—the active f64 oscillator keeps running uninterrupted.
- Frequency, pan, gain, and zero-delay TPT filter cutoffs (lpf, hpf, bpf) slew smoothly over 5 ms ramps.
- Filter integrators and oscillator phase remain 100% continuous with zero segment clicks.
Under the Hood · Zero-Copy Audio Pipeline
From Strudel Pattern to Stereo Wasm Buffer in 24 Bytes
Aether HD does not replace Strudel—it extends Strudel's pattern scheduler with an event-selective native bridge. Ordinary Strudel sample banks (bd, sd, hh, gm_*) stay on SuperDough, while lila_* voices (and standard waveforms when Aether HD: On is active) take a dedicated binary fast path.
Event-Selective Bridge
Wraps s() / sound() and attaches dominantTrigger=true only to resolved Aether haps, skipping duplicate SuperDough node creation.
Generation Fencing
Stamps every transport start/update with a monotonic generation ID and batches same-turn haps into one MessagePort transfer.
8,192-Slot Priority Heap
Preallocated min-heap converts AudioContext time to exact sample frames with 512 kick/bass and 512 note-off priority reserves.
24-Byte Binary ABI v2
Drains up to 512 due events per 128-frame quantum directly into preallocated Wasm linear memory without sorting or JS object creation.
Rust DSP + FDN Master
Renders 128 voices, SoA modal banks, per-voice TPT filters, 4 modulated 8x8 Householder FDN reverb orbits, and -0.1 dBFS limiting.
The 24-Byte AetherEvent Memory Layout
Exact sample-frame offset within the AudioWorklet render block
0 = Note On, 1 = Note Off, 2 = Smoothed Parameter Change
Canonical Aether engine ID (1..=28 procedural synth voices)
Stable voice identity so overlapping same-pitch notes release cleanly
Stem routing (1=Drums, 2=Bass, 3=Chords, 4=Leads, 5=Spatial)
Note flags or ABI v2 parameter ID (1..=38: LPF, HPF, BPF, Acid, Kick, etc.)
Resolved pitch in Hz (1–24,000 Hz) retaining fractional microtonal precision
Combined numeric gain × velocity factor clamped for speaker safety
Target parameter value for ABI v2 automation events (reserved for notes)
1. Use Any Canonical lila_* Instrument
Whenever your Strudel pattern calls s("lila_acid"), s("lila_rhodes"), s("lila_kalimba"), or any of the 30 canonical lila_* voices, LILA automatically routes those notes to the Rust/Wasm Aether HD engine while leaving your standard drum samples (bd, sd, hh) on SuperDough.
stack(
s("bd*4, [~ sd]*2, hh*8"), // Standard SuperDough samples
note("c2 eb2 g1 bb1").s("lila_acid").lpf(540).lpq(28), // Rust ZDF Acid
note("[c4,eb4,g4,bb4]").s("lila_rhodes").room(0.4) // Rust FM Rhodes
)2. Toggle Aether HD: On for Standard Synths
Want existing vanilla Strudel code (sine, saw, supersaw, triangle, square, pink, white, brown) to run on the 64-bit Wasm engine without renaming a single sound? Enable the Aether HD: On button in the Sandbox or Listen transport bar—or toggle it off anytime for stock strudel.cc SuperDough parity.
Groove-First Real-Time Budgeting
Adaptive Quality Tiers & Sub-Millisecond Hard STOP
All 128 voices are preallocated up front so memory never grows mid-song, while active DSP work is bounded by quality tier. Auto mode monitors quantum deadline utilization (sampling 1 quantum in 8 with zero allocations) and only shifts tiers at stopped transport boundaries—never under a sounding note.
Core
Mobile & Battery Saver- Active Polyphony
- 32 Voices
- Modal Resonator Bank
- 6 Modes / Voice
- 8x8 FDN Reverb Orbits
- 1 FDN Orbit Bus
- Acid Ladder Oversampling
- 1x Native
- Supersaw Unison Cap
- 3 Unison Lanes
- Rave Stab / Hoover
- 1 Layer · 2 Lanes
Balanced
Default Auto Startup- Active Polyphony
- 64 Voices
- Modal Resonator Bank
- 8 Modes / Voice (SIMD)
- 8x8 FDN Reverb Orbits
- 2 FDN Orbit Buses
- Acid Ladder Oversampling
- 2x Oversampled
- Supersaw Unison Cap
- 5 Unison Lanes
- Rave Stab / Hoover
- 2 Layers · 4 Lanes
HD
Maximum Studio Headroom- Active Polyphony
- 128 Voices
- Modal Resonator Bank
- 16 Modes / Voice (SIMD)
- 8x8 FDN Reverb Orbits
- 4 FDN Orbit Buses
- Acid Ladder Oversampling
- 4x Oversampled
- Supersaw Unison Cap
- 7 Unison Lanes
- Rave Stab / Hoover
- 3 Layers · 6 Lanes
Click-Free Hot-Swapping While Music Plays
When you update a running pattern or drag a live control slider, LILA calls beginTransport({ continuous: true })—flushing already-scheduled notes and skipping worklet resets so active synth envelopes and reverb tails ring out smoothly across code edits.
Instant aether_all_notes_off Silence
Pressing Stop immediately increments the transport generation gate, discards all 8,192 queued heap events, hard-kills all 128 primary voices and 8 zombie tails, and clears FDN reverb, delay, and limiter buffers in place—guaranteeing zero runaway feedback or ghost notes.
Canonical Sound Registry · 30 Voices / 28 Rust Engines
Explore Every lila_* Procedural Instrument
lila_moogID #1 · 16v maxLILA Moog 303
4-Pole Zero-Delay Feedback (ZDF) Moog ladder filter with analog Padé drive and bass compensation
s('lila_moog').gain(0.6)lila_padID #2 · 24v maxLILA Celestial Wavetable Pad
Warm fundamental-led stereo wavetable pad with bandlimited mipmaps, slow spectral morphing, and a gentle envelope
note('[c3,g3,eb4]').s('lila_pad').slow(2).legato(1.25).gain(0.3).room(0.45)lila_fmID #3 · 16v maxLILA Crystal DX Bell
6-Operator FM matrix with harmonic golden-ratio feedback
s('lila_fm').gain(0.5)lila_stringsID #4 · 24v maxLILA Chamber Strings (Preview)
Preview chamber-string routing through the current plucked-waveguide engine; a distinct bowed model is not implemented yet
s('lila_strings').gain(0.45)lila_pluckID #4 · 24v maxLILA Acoustic Pluck
Karplus-Strong physical modeling with 1st-order Thiran fractional allpass filter and pick noise
s('lila_pluck').gain(0.6)lila_bellID #5 · 16v maxLILA Tibetan Singing Bowl
High-Q inharmonic Tibetan singing-bowl modal resonator with suede-mallet onset and long harmonic sustain
s('lila_bell').gain(0.5)lila_drumsID #6 · 16v maxLILA Drum Transient
Procedural kick-punch transient layered with a sine oscillator; a multi-piece drum kit and membrane/shell model are not implemented yet
s('lila_drums').gain(0.7)lila_rhodesID #7 · 32v maxLILA Neo-Soul Rhodes
Procedural felt hammer + velocity-responsive decaying FM tine + warm cabinet body with gentle 5.2Hz stereo tremolo
s('lila_rhodes').gain(0.42)lila_pianoID #8 · 32v maxLILA Concert Grand Piano
Procedurally modeled felt-hammer transient + Karplus-Strong string with dispersion + Spruce soundboard modal bank
s('lila_piano').gain(0.55)lila_808ID #9 · 8v maxLILA 808 Master
Sustained 808/sub voice with dual-stage pitch drop, acoustic punch beater, and asymmetrical wavefolding drive
s('lila_808').gain(0.7)lila_subID #9 · 8v maxLILA Sub Roller (Preview)
Low-register preview routed through the Master808 engine; a distinct sub voicing is not implemented yet
s('lila_sub').gain(0.75)lila_kalimbaID #10 · 32v maxLILA Wooden Kalimba
Composite pluck exciter + 16-mode African Calabash gourd resonator with nonlinear contact bite
s('lila_kalimba').gain(0.6)lila_vibesID #11 · 24v maxLILA Modal Vibraphone
16-mode inharmonic metal bar bank with motor AM tremolo modulation
s('lila_vibes').gain(0.5)lila_kickID #12 · 12v maxLILA Club Kick
Dedicated deterministic club-kick oscillator with tunable click, pitch drop, body, T60 decay, and bounded drive
s('lila_kick').note('e1').kickclick(0.32).kickdrop(28).kickdroptime(0.055).kickbody(0.42).kickdecay(0.58).gain(0.72)lila_acidID #13 · 1v maxLILA Acid
Dedicated anti-aliased saw/pulse acid voice with a resonant oversampled ladder, filter envelope, accent, and deterministic monophonic glide
s('lila_acid').note('c2').voice(0).lpf(520).lpq(36).lpenv(4.2).lpdecay(0.22).glide(0.07).distort(0.28).shape(0.16).gain(0.58)lila_hatID #14 · 24v maxLILA Metallic Hat
Deterministic six-partial metallic/noise one-shot with velocity-sensitive brightness, bounded note retuning, filtered air, and a calibrated T60 tail
s('lila_hat').note('c3').gain(0.46)lila_clapID #15 · 16v maxLILA Hand Clap
Deterministic four-burst filtered-noise hand clap with an inharmonic body, velocity-sensitive air, bounded note retuning, and a calibrated tail
s('lila_clap').note('c3').gain(0.56)lila_supersawID #16 · 16v maxLILA Supersaw
Deterministic stereo anti-aliased supersaw with a softened bloom, slow drift, quality-bounded 3/5/7-voice unison, and an internal ladder-filter envelope
s('lila_supersaw').note('c4').unison(7).detune(14).spread(0.68).lpf(1800).lpq(7).gain(0.38)lila_stabID #17 · 24v maxLILA Rave Stab
Deterministic short rave-chord voice with an anti-aliased transient stack, pitch-tracked modal body, internal ladder-filter sweep, and quality-bounded 1/2/3 layers
note('[c4,eb4,g4,bb4]').s('lila_stab').lpf(1400).lpq(9).attack(0.002).decay(0.18).sustain(0.08).release(0.16).shape(0.16).gain(0.48)lila_hooverID #18 · 16v maxLILA Hoover
Deterministic anti-aliased PWM/unison rave lead with two moving formant bands, mono-safe stereo spread, ladder filtering, and quality-bounded 2/4/6 oscillator lanes
s('lila_hoover').note('c3').unison(6).detune(13).spread(0.74).pw(0.46).lpf(3200).lpq(8).attack(0.012).release(0.42).shape(0.14).gain(0.48)lila_snareID #19 · 16v maxLILA Procedural Snare
Deterministic four-mode shell with a short pitch dive, velocity-sensitive filtered wire noise, bounded note retuning, and a calibrated one-shot tail
s('lila_snare').note('d3').gain(0.56)lila_sineID #20 · 64v maxLILA Pure Sine
64-bit phase-coherent pure sine oscillator with phase-continuous legato drones and optional binaural/monaural/isochronic entrainment
note('c3').s('lila_sine').binaural(6).gain(0.35)lila_triangleID #21 · 64v maxLILA PolyBLAMP Triangle
64-bit PolyBLAMP anti-aliased triangle oscillator with phase-continuous legato and optional binaural/monaural entrainment
note('c3 e3 g3').s('lila_triangle').lpf(1200).gain(0.4)lila_sawID #22 · 64v maxLILA PolyBLEP Sawtooth
64-bit PolyBLEP anti-aliased sawtooth oscillator with zero-delay state-variable filtering and phase-continuous LFO sweeps
note('c2').s('lila_saw').lpf(800).lpq(4).gain(0.42)lila_squareID #23 · 64v maxLILA PolyBLEP Square / Pulse
64-bit PolyBLEP variable-pulse-width square oscillator with smooth PWM and phase-continuous legato
note('c3').s('lila_square').pw(0.35).lpf(1400).gain(0.38)lila_pinkID #24 · 32v maxLILA Pink Noise (1/f)
Decorrelated stereo 7-pole Paul Kellet 1/f pink noise generator for psychoacoustic beds, rain, and resonant water substrates
s('lila_pink').bpf(480).bpq(3.5).gain(0.22)lila_whiteID #25 · 32v maxLILA White Noise
Decorrelated stereo flat-spectrum white noise generator with per-voice LPF/HPF/BPF sculpting
s('lila_white').hpf(2400).lpf(6400).gain(0.14)lila_brownID #26 · 32v maxLILA Brown Noise (1/f²)
Decorrelated stereo leaky-integrated 1/f² Brownian noise generator with sub-20 Hz DC blocking for deep ocean and womb-like beds
s('lila_brown').lpf(360).gain(0.28)lila_binauralID #27 · 32v maxLILA 64-Bit Binaural Entrainment
64-bit phase-locked dichotic binaural beat generator (Left = f0 - Δf/2, Right = f0 + Δf/2) with zero stereo cross-bleed
note('136.1').s('lila_binaural').binaural(6).gain(0.32)lila_monauralID #28 · 32v maxLILA 64-Bit Monaural Entrainment
64-bit phase-coherent acoustic interference monaural beat generator (0.5 * (sin(f0 - Δf/2) + sin(f0 + Δf/2))) effective on both speakers and headphones
note('110').s('lila_monaural').monaural(7.83).gain(0.34)Hear the Aether HD Difference Live
Open the LILA Sandbox, drop any lila_* voice into your Strudel stack—or flip Aether HD: On in the bottom bar to accelerate standard Strudel synths in real time.