@audio/synth

July 10, 2026 · View on GitHub

Synthesis & signal generators — test tones, noise colors, classic synthesis atoms.

Generator contract (family convention): every pitched generator is (freq, opts) → Float32Arrayosc, pluck, voice, risset, lfo, wavetable, fm (+ bell, epiano), modal, membrane, metal. Unpitched generators take a single opts-or-scalar form: noise(duration, opts), chirp(opts), rhythm(opts), adsr(opts), sfx(preset | opts), dtmf(digits, opts). Durations are seconds; sample rate is fs (default 44100); output is mono Float32Array. poly(notes, { voice, voiceOpts }) hosts any pitched generator as a voice — per-voice config (fm's ratio/index, modal's model, wavetable's tables) rides in via voiceOpts.

PackageStatusWhat
@audio/synth-noisecolors of noise — white/pink/brown/blue/violet, seeded, slope-verified; (duration, opts) seconds; pinkNoise filter kernel as named export
@audio/synth-oscoscillator — periodic-function waveforms (sine/square/saw/triangle), detune, custom wave fn
@audio/synth-chirpfrequency sweep — exp/linear
@audio/synth-dtmfDTMF tone pairs (Q.23 frequencies)
@audio/synth-pluckKarplus-Strong plucked string
@audio/synth-rissetRisset drum (inharmonic bell-drum)
@audio/synth-rhythmgrid-timed pattern renderer (metronome/click track)
@audio/synth-envelopeADSR contour generator (one-shot, known length)
@audio/synth-lfolow-frequency oscillator (modulation source)
@audio/synth-voiceosc + envelope voice (Tone.js Synth class)
@audio/synth-drummembrane (pitch-drop kick) / metal (inharmonic cymbal) / noiseDrum (snare/hat)
@audio/synth-fmFM (phase modulation) — Chowning 1973, single-op or serial ops stack, per-op feedback + index decay; bell/epiano presets; FFT sidebands match Bessel J_k to 0.00%
@audio/synth-modalmodal synthesis — impulse-invariant resonator bank; F&R-cited bar/membrane/plate/tube/stiff-string tables, strike-position weighting, per-mode T60
@audio/synth-polyN-voice allocator — oldest-note steal with 5 ms fade, {freq|midi} notes, any pitched generator as voice
@audio/synth-sfxZZFX-class parameterized SFX, 8 deterministic presets
@audio/synth-wavetablewavetable oscillator with table morphing (tables required)

audio.js manifests: 13/16 atoms ship one (hostable by audio / @audio/wam). Exempt with reasons: synth-dtmf (symbolic digit-string input has no params representation), synth-lfo (modulation source, not an audio-rate processor for hosts), synth-wavetable (tables is an asset argument — arrays have no params representation; use the kernel directly).

Parity targets: Audacity generators, Tone.js synthesis primitives. pink-noise extracted from audio-filter; musical test synths also live in beat/synth.js + beat/floatbeats.js (future floatbeats fixtures package).

MIDI rendering: poly(parse(smf).notes, { voice: pluck }) — see @audio/midi.