// the find
Tonejs/Tone.js
A Web Audio framework for making interactive music in the browser.
Tone.js is a Web Audio framework that sits on top of the browser's native Web Audio API, adding a scheduler, transport, synths, effects, and signal routing. It's aimed at developers building interactive music applications in the browser — think step sequencers, generative music tools, or browser-based DAWs. Mature project, nearly 15k stars, actively maintained.
The Transport abstraction is genuinely well-designed: musical time (bars/beats/subdivisions) as a first-class concept instead of raw seconds makes scheduling non-trivial rhythmic patterns tractable. The signal graph model — where parameters like frequency and gain are themselves connectable nodes — means modulation routing that would be clunky with raw Web Audio becomes composable. Near-100% test coverage with offline rendering tests (not mocks) means the scheduler behavior is actually verified, not just hoped for. The GrainPlayer is a solid granular synthesis implementation that would take weeks to build correctly from scratch.
MIDI support is a gap: it requires an external conversion step (Midi.js) rather than being integrated, so loading a MIDI file is a two-library problem. The reverb (Tone.Reverb) generates its impulse response via offline rendering at construction time — there's a startup delay and no way to swap the impulse response at runtime without rebuilding the node. PolySynth voice stealing is simple and will audibly cut off notes when you exceed the voice count, which is fine for demos but needs manual workarounds in real instruments. Worklet support exists but the abstraction is minimal; custom DSP that needs AudioWorklet ends up fighting the framework's node lifecycle rather than fitting into it naturally.