This site's audio engine
Most of the site's music is live-coded with Strudel — synthesized in your browser, every visit, with the Web Audio API. The Playlist plays those beats alongside real audio files, all through the same engine.
Hit play and the site runs a Strudel pattern — a few lines of live-coding code — through a full Web Audio graph: drum voices, a bass line, live effects, and a mix that reacts to the beat. The same graph also streams plain audio files — tracks Berni uploads and the reels from his projects — looped, so they react and visualize just like the code does. This page is the breakdown; head to the Playlist to pick a track and read the exact code that's playing.
Signal chain
Every voice feeds one master chain: a gain stage, a sweepable lowpass, three parallel sends (a tempo-synced feedback delay, a convolution reverb whose impulse response is also synthesized, and an LFO-driven flanger), then an HRTF panner and the analyser that feeds the visualizer.
The FX rack
The AUDIO.FX pads (available while the beat plays) are momentary performance effects on the live signal — hold to engage, release to let go:
- filter
- slams the master lowpass down to 420 Hz
- echo
- raises the delay send and pushes feedback toward self-oscillation
- reverb
- opens the convolver send — a 2.2-second synthesized impulse
- flanger
- an LFO wobbling a 5 ms delay line with feedback
- riser
- looped noise through a bandpass sweeping 300 Hz → 9 kHz
- brake
- slews the tempo down to a crawl and darkens the filter
The visualizer
An analyser node (128-bin FFT) streams live frequency data to the equalizer behind the hero, which renders it in five switchable modes. Reduced-motion users get a still ring instead.
No samples, no licenses, works offline — the whole engine is a few hundred lines of TypeScript.