LILA
LILA Sounds · Powered by Aether HD (Rust + Wasm)

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.

Audio Thread Memory
0 Allocs

128 preallocated Rust voices, 8 zombie steal-fade tails, and 4 FDN reverb buses. Zero GC pauses inside process().

Binary Event ABI
24 Bytes

Compact little-endian AetherEvent records drained from an 8,192-slot min-heap with dedicated kick/bass priority reserves.

Oscillator Precision
64-Bit f64

Branchless 9th-order minimax sine kernel (< 2e-9 error) + phase-continuous legato stream matching across .seg().

Procedural Synthesis
0 MB Samples

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.

Continuous Modulation (.seg / .slow)

Phase-Continuous Legato Stream Matching

Modulating filter cutoffs, panning, or pitch over time without voice explosion or segment-boundary clicks.

Run in Sandbox
Strudel 1.3.0 PatternAutomatic Aether HD Routing
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)
Stock Browser Synth Graph (SuperDough)

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.
Node Allocations / Bar48+ WebAudio Nodes
Oscillator PhaseResets Every Step
Filter StateRe-initialized per Hap
Aether HD (Rust / Wasm AudioWorklet)

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.
Active Rust Voices1 Continuous Voice
Audio-Thread Allocations0 Bytes (Preallocated)
Parameter Smoothing5 ms Linear / 1-Pole Slew

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.

STEP 01AetherStrudelBridge.ts

Event-Selective Bridge

Wraps s() / sound() and attaches dominantTrigger=true only to resolved Aether haps, skipping duplicate SuperDough node creation.

STEP 02AetherTransportGate.ts

Generation Fencing

Stamps every transport start/update with a monotonic generation ID and batches same-turn haps into one MessagePort transfer.

STEP 03aether-processor.js

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.

STEP 04AetherEvent (24B)

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.

STEP 05aether_process_block()

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.

Fixed-Size Little-Endian C ABI

The 24-Byte AetherEvent Memory Layout

38 Negotiated ABI v2 Parameters · 0 Heap Allocations
frame_offsetBytes 0..3 · u32

Exact sample-frame offset within the AudioWorklet render block

event_typeBytes 4..5 · u16

0 = Note On, 1 = Note Off, 2 = Smoothed Parameter Change

sound_idBytes 6..7 · u16

Canonical Aether engine ID (1..=28 procedural synth voices)

voice_idBytes 8..9 · u16

Stable voice identity so overlapping same-pitch notes release cleanly

stem_idBytes 10 · u8

Stem routing (1=Drums, 2=Bass, 3=Chords, 4=Leads, 5=Spatial)

param_id / flagsBytes 11 · u8

Note flags or ABI v2 parameter ID (1..=38: LPF, HPF, BPF, Acid, Kick, etc.)

frequency_hzBytes 12..15 · f32

Resolved pitch in Hz (1–24,000 Hz) retaining fractional microtonal precision

velocityBytes 16..19 · f32

Combined numeric gain × velocity factor clamped for speaker safety

param_valueBytes 20..23 · f32

Target parameter value for ABI v2 automation events (reserved for notes)

Always Active · Every Surface

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.

Hybrid Stack Example (SuperDough + Aether HD)
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
)
One-Click Toggle in Sandbox & Listen

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.

Accelerated Standard Synth NamesAether HD: On
s("sine")s("saw / sawtooth")s("supersaw")s("triangle")s("square / pulse")s("pink")s("white")s("brown")s("binaural")s("monaural")

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
Continuous Live Updates (Keep & Evolve)

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.

Deterministic Hard STOP Boundary

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 max

LILA Moog 303

4-Pole Zero-Delay Feedback (ZDF) Moog ladder filter with analog Padé drive and bass compensation

Warmth80%
Bright75%
Body85%
s('lila_moog').gain(0.6)
lila_padID #2 · 24v max

LILA Celestial Wavetable Pad

Warm fundamental-led stereo wavetable pad with bandlimited mipmaps, slow spectral morphing, and a gentle envelope

Warmth90%
Bright38%
Body82%
note('[c3,g3,eb4]').s('lila_pad').slow(2).legato(1.25).gain(0.3).room(0.45)
lila_fmID #3 · 16v max

LILA Crystal DX Bell

6-Operator FM matrix with harmonic golden-ratio feedback

Warmth50%
Bright90%
Body60%
s('lila_fm').gain(0.5)
lila_stringsID #4 · 24v max

LILA Chamber Strings (Preview)

Preview chamber-string routing through the current plucked-waveguide engine; a distinct bowed model is not implemented yet

Warmth85%
Bright65%
Body90%
s('lila_strings').gain(0.45)
lila_pluckID #4 · 24v max

LILA Acoustic Pluck

Karplus-Strong physical modeling with 1st-order Thiran fractional allpass filter and pick noise

Warmth80%
Bright70%
Body70%
s('lila_pluck').gain(0.6)
lila_bellID #5 · 16v max

LILA Tibetan Singing Bowl

High-Q inharmonic Tibetan singing-bowl modal resonator with suede-mallet onset and long harmonic sustain

Warmth70%
Bright75%
Body85%
s('lila_bell').gain(0.5)
lila_drumsID #6 · 16v max

LILA Drum Transient

Procedural kick-punch transient layered with a sine oscillator; a multi-piece drum kit and membrane/shell model are not implemented yet

Warmth70%
Bright70%
Body85%
s('lila_drums').gain(0.7)
lila_rhodesID #7 · 32v max

LILA Neo-Soul Rhodes

Procedural felt hammer + velocity-responsive decaying FM tine + warm cabinet body with gentle 5.2Hz stereo tremolo

Warmth90%
Bright60%
Body80%
s('lila_rhodes').gain(0.42)
lila_pianoID #8 · 32v max

LILA Concert Grand Piano

Procedurally modeled felt-hammer transient + Karplus-Strong string with dispersion + Spruce soundboard modal bank

Warmth75%
Bright80%
Body90%
s('lila_piano').gain(0.55)
lila_808ID #9 · 8v max

LILA 808 Master

Sustained 808/sub voice with dual-stage pitch drop, acoustic punch beater, and asymmetrical wavefolding drive

Warmth75%
Bright50%
Body95%
s('lila_808').gain(0.7)
lila_subID #9 · 8v max

LILA Sub Roller (Preview)

Low-register preview routed through the Master808 engine; a distinct sub voicing is not implemented yet

Warmth90%
Bright20%
Body100%
s('lila_sub').gain(0.75)
lila_kalimbaID #10 · 32v max

LILA Wooden Kalimba

Composite pluck exciter + 16-mode African Calabash gourd resonator with nonlinear contact bite

Warmth85%
Bright70%
Body85%
s('lila_kalimba').gain(0.6)
lila_vibesID #11 · 24v max

LILA Modal Vibraphone

16-mode inharmonic metal bar bank with motor AM tremolo modulation

Warmth60%
Bright85%
Body80%
s('lila_vibes').gain(0.5)
lila_kickID #12 · 12v max

LILA Club Kick

Dedicated deterministic club-kick oscillator with tunable click, pitch drop, body, T60 decay, and bounded drive

Warmth72%
Bright62%
Body92%
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 max

LILA Acid

Dedicated anti-aliased saw/pulse acid voice with a resonant oversampled ladder, filter envelope, accent, and deterministic monophonic glide

Warmth76%
Bright88%
Body74%
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 max

LILA Metallic Hat

Deterministic six-partial metallic/noise one-shot with velocity-sensitive brightness, bounded note retuning, filtered air, and a calibrated T60 tail

Warmth30%
Bright94%
Body34%
s('lila_hat').note('c3').gain(0.46)
lila_clapID #15 · 16v max

LILA Hand Clap

Deterministic four-burst filtered-noise hand clap with an inharmonic body, velocity-sensitive air, bounded note retuning, and a calibrated tail

Warmth48%
Bright82%
Body58%
s('lila_clap').note('c3').gain(0.56)
lila_supersawID #16 · 16v max

LILA 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

Warmth64%
Bright90%
Body88%
s('lila_supersaw').note('c4').unison(7).detune(14).spread(0.68).lpf(1800).lpq(7).gain(0.38)
lila_stabID #17 · 24v max

LILA 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

Warmth70%
Bright82%
Body82%
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 max

LILA 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

Warmth72%
Bright84%
Body94%
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 max

LILA 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

Warmth52%
Bright78%
Body72%
s('lila_snare').note('d3').gain(0.56)
lila_sineID #20 · 64v max

LILA Pure Sine

64-bit phase-coherent pure sine oscillator with phase-continuous legato drones and optional binaural/monaural/isochronic entrainment

Warmth95%
Bright10%
Body90%
note('c3').s('lila_sine').binaural(6).gain(0.35)
lila_triangleID #21 · 64v max

LILA PolyBLAMP Triangle

64-bit PolyBLAMP anti-aliased triangle oscillator with phase-continuous legato and optional binaural/monaural entrainment

Warmth88%
Bright35%
Body82%
note('c3 e3 g3').s('lila_triangle').lpf(1200).gain(0.4)
lila_sawID #22 · 64v max

LILA PolyBLEP Sawtooth

64-bit PolyBLEP anti-aliased sawtooth oscillator with zero-delay state-variable filtering and phase-continuous LFO sweeps

Warmth68%
Bright88%
Body80%
note('c2').s('lila_saw').lpf(800).lpq(4).gain(0.42)
lila_squareID #23 · 64v max

LILA PolyBLEP Square / Pulse

64-bit PolyBLEP variable-pulse-width square oscillator with smooth PWM and phase-continuous legato

Warmth62%
Bright78%
Body78%
note('c3').s('lila_square').pw(0.35).lpf(1400).gain(0.38)
lila_pinkID #24 · 32v max

LILA Pink Noise (1/f)

Decorrelated stereo 7-pole Paul Kellet 1/f pink noise generator for psychoacoustic beds, rain, and resonant water substrates

Warmth80%
Bright48%
Body85%
s('lila_pink').bpf(480).bpq(3.5).gain(0.22)
lila_whiteID #25 · 32v max

LILA White Noise

Decorrelated stereo flat-spectrum white noise generator with per-voice LPF/HPF/BPF sculpting

Warmth35%
Bright95%
Body50%
s('lila_white').hpf(2400).lpf(6400).gain(0.14)
lila_brownID #26 · 32v max

LILA 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

Warmth96%
Bright18%
Body96%
s('lila_brown').lpf(360).gain(0.28)
lila_binauralID #27 · 32v max

LILA 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

Warmth96%
Bright16%
Body92%
note('136.1').s('lila_binaural').binaural(6).gain(0.32)
lila_monauralID #28 · 32v max

LILA 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

Warmth94%
Bright22%
Body94%
note('110').s('lila_monaural').monaural(7.83).gain(0.34)
Ready in Your Browser · 0 Install

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.

Booting Strudel Engine...

Strudel Evaluation Terminal (0)

Unknown

Unknown Artist