The two voices native Web Audio can't do safely, done as one AudioWorklet module
(loaded from a Blob URL, so still single-file):
- 🎸 Karplus-Strong string — a sample-accurate 8-voice plucked-string worklet
(noise burst → damped delay loop). Right-click sky → "string voice" swaps the
FM tine for it. Verified offline: STABLE (rms 0.04, not the billions the native
version exploded to), in-tune (A3→221, A4→436), harmonic.
- 🔊 12-bit bitcrush — a world-drivable lo-fi stage on the master bus (true
bit-depth quantise + sample-rate reduction). Route anything to `crush`; clean
by default (16-bit → 4-bit + downsample). Verified: transparent at 16-bit,
hi-freq grit 0.18 at 4-bit.
Loaded async on synth start, spliced glitch→crusher→out and karplus→preSat.
Verified live: both load with no errors, string-voice toggle flips correctly.
Grimoire + manual document the whole synth-voice suite.
This closes the timbre work: FM tine · supersaw · chorus · string · bitcrush —
every one tuned by the offline-render + FFT harness before it made a sound.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>