The stage
Give it something to listen to.
FX none on
Click a tile to aim, again to walk it. 1 4 9 W stage · space play/pause · ← → 10 s, hold to scan · [ ] mode · F fullscreen · shift+digit slots. Right-click anything. Tap a tile to aim, again to walk · double-tap fullscreen · hold for more
The deck
Shape what the modes are fed.
Drop a track on the stage and this comes alive. The analyser sits at the END of this chain, so every control here changes the picture as well as the sound — push the low shelf and the modes that follow the bass grow; close the filter and the ones that follow the treble go quiet. Tempo and pitch are separate controls: tempo sets how fast the track runs, pitch sets its key, and moving one leaves the other where it is.
Deck
nothing loaded
Nothing loaded
Drop a track anywhere, or roll the dice
space play · ← → 10 s, hold to scan · shift 30 s · P N previous next · [ ] mode
Tempo Speed / time
Pitch Key / detune
Tone
Flat — the three filters are at unity across the band
Space
Output
Queue empty
Anything this browser decodes — MP3, M4A, WAV, FLAC and more. The Method has the list.
Library not loaded
Pick E1, E2, E3 or E4 — the four lists the Audio Engine plays, from eriks.best/e/. Nothing is fetched until you do.
↑ ↓ move · enter play now · Q or + queue · space select · / find
The modes
What it can draw, and what drives it.
Every mode is handed the same reading of the sound — the waveform, the spectrum, eight bands from sub to air, the loudness, a beat flag and where the energy is sitting — and decides for itself what to do with it. They are listed here with the part of the signal each one actually follows, because “reacts to music” is what everything claims and nothing explains.
Method
One analysis, many pictures.
What is measured
A single analyser at 2048 samples, read once a frame. From it: the raw waveform, 1,024 frequency bins, eight bands spaced logarithmically because hearing is logarithmic, the RMS level, the loudest sample, a spectral centroid for “brightness”, and a beat.
The beat is energy-over-history: the sub-band energy against the mean of the last second and a half, with a floor so silence cannot ring it and a refractory period so one kick is one beat rather than four. It is not a musical downbeat and does not claim to be. The tempo shown is the median gap between the last nine of them.
Nine at once, one FFT
Every mode on the stage is given the same reading. Nine tiles is nine draws and one analysis — an analyser per tile would be nine transforms of the same signal producing nine identical answers.
Tempo without the pitch
Pitch and tempo move independently: tempo changes the time, pitch changes the key. A track is decoded into memory and played by a time-stretcher in an AudioWorklet — the one Laband runs, with a loop that goes round to the sample and a search that may look back when the tempo is very slow. Windowed grains of the record are laid down to make the same music at a new length, then read back at the new key. Where a browser has no AudioWorklet the same code runs on a ScriptProcessor, and renders the same samples.
Measured through the deck across the whole of both rails on generated tones, and on an organ recording from the library at 0.74× and −2.2 semitones: the key within 1.17 cents at any held setting and 1.5 while the tempo is swept from end to end (the recording’s spectrum moved −219.5 cents of the −220 asked for); the length within 0.02% by the clock and by the end of the track, though what is heard can fade below half level up to 0.44% before that end; and the clock running at the tempo whatever the pitch is doing. Before, this deck had one speed control wearing two labels: at those settings it ran 12% slow and sounded 741 cents flat.
Where it gives is drums. Slowed far enough, a sharp hit can smear into a roll: at 0.50× in the original key a click stays within 6 dB of its peak for about 33 ms, at 0.25× for up to about 180 ms and at 0.10× for up to half a second, the longest with the key raised. At 3–4× hits lose their edge — at 4× and ten semitones down a click typically loses about 20 dB of its peak and a softer hit about 11, the worst single hits 35 and 22 dB — and with the tempo up and the pitch far down, hits scatter by about 20 ms, the worst landing about 50 ms off the beat. Over sustained sound a stretched hit is typically heard up to about 100 ms from where the clock puts it at 0.25× (a single hit up to about 130) and up to about 50 ms at 0.74×, and moving the pitch while the tempo is far from 1.00× can move a hit by up to 110 ms.
A hand on the platter reads the record straight, so a scratch moves pitch with speed, as a record does; let go and the key glides back to the dial with the motor. The microphone and the bench tone are live and are never stretched, and a file shorter than two of the stretcher’s windows — 8,192 samples, about 0.19 s at 44.1 kHz and 0.17 s at 48 kHz — plays as a record unless it loops.
On paper
This page has a paper edition, which is the hard case for a visualiser: on black a white line is the loudest thing on the screen, and on white it is invisible. Every colour a mode produces passes through the estate’s ink function, which keeps the hue and the alpha, moves the lightness into the ink range, and inverts greys and whites. Additive glow is switched to ordinary compositing there too, because “lighter” on white saturates to white and erases the mode it was meant to make glow.
What it does not do
It does not record your sound or upload it. The microphone is connected to the analyser and to nothing else — not to your speakers, which is how a visualiser avoids feeding back in a room with the volume up. The settings it remembers — slots, presets, the shuffle’s place — stay in this browser.
What it will play
Whatever the browser you are in can decode — the line below asks it, format by format. Measured in Chrome: WAV, AAC in M4A, FLAC and Opus decode; AIFF and Apple Lossless do not, and it offers no WMA or APE.
MP3, M4A, WAV and FLAC are the safe choices; Ogg and Opus depend on the browser.
A file you drop is read into this page’s memory and decoded here. It is never uploaded, and the sound itself is stored nowhere. A track from the library is fetched from eriks.best/e/ only when it is about to play — its turn in the queue, or a press that plays it now.
Why nothing clicks
A control that jumps puts a step into the signal, and a step is a click you hear and a spike every mode draws. So Low, Mid, High, Filter, Width, Echo, Motion and Level glide to each new value — exponential moves with time constants of 20 to 80 ms — instead of landing on it. A change between chorus and flanger fades the effect out, moves the delay, and fades it back in. Drive is the exception: its saturation curve changes in one step, and only its level make-up glides. A seek dips the sound for about 4 ms either side of the jump.
Tempo and pitch re-lay only the part of the stretch not yet heard. Measured on a steady 440 Hz tone, one step of either — 0.005× or 0.1 semitone — added at most 0.1 dB of energy above 2 kHz at the moment of the move, and dipped the level by at most 0.31 dB for 5 ms. The worst move measured, ten semitones at 2×, added 12.4 dB there — still 14.5 dB under a hard 0.1 ms cut.
The stretcher is light: at the hardest setting measured, 4× and ten semitones down, it used 1.4% of one processor core, timed outside the page.