Feed it a track
Pick any audio file on this device. It is decoded in the tab and drives the waveform directly — nothing is uploaded.
Everything behind this text is being drawn right now, one frame at a time, from a handful of equations. Give it something to listen to and it starts answering.
Audio is decoded in this tab and never uploaded
Three ways in
Pick any audio file on this device. It is decoded in the tab and drives the waveform directly — nothing is uploaded.
Let the microphone listen instead. A voice, an instrument, or whatever is already playing nearby.
Cinema gives the visual the screen, shrinks the player to a puck, and turns on touch interactions.
The preset library
Every byte this page needs is served from this domain — the engine, the presets, the fonts. The one thing that is not loaded up front is the MilkDrop collection, because it is larger than the rest of the site put together and most visitors will never open the picker.
Eight visual worlds
Four of these run presets from the MilkDrop collection.
Your signal trail
The controls
Nothing here needs setting up. Pick a source, pick a world, and the rest is one keypress at a time — or eight knobs at once, if you brought a controller.
A file from this device, the microphone, or nothing at all — every preset animates on its own clock whether or not it can hear you.
Eight atmospheres, each one a different preset. Pick one, or press play and let it move on by itself every fifteen seconds.
Arrow keys step the presets, C enters Cinema, and eight knobs on a MIDI controller map themselves to the parameters underneath.
There is no way to ask a controller which knob is which, so the mapping is learned: the first eight knobs you move claim these eight rows in order, and the first four pads you press step the presets. It is remembered per device.
These drive the picture in Cinema, where the player is a bubble and the visual has the screen to itself. On the page nothing here takes a tap, so scrolling and every control keep working exactly as they do now. The same settings are one tap away inside the player.
Good to know
What it does with your audio, where the presets come from, and why one thing on this page is a download.
No. A file you choose is decoded by this tab and read straight into the visualizer, and the microphone is handled the same way. Nothing is sent to a server, because there is no server here — the whole page is static files.
They are MilkDrop presets: a set of per-frame and per-pixel equations plus a pair of GLSL shaders, originally written for Winamp. Butterchurn compiles the equations to WebAssembly and draws the result in WebGL. 28 are on the page already — 19 written for it and 9 picked out of the community collection — and the other 284 arrive with the download.
The collection is 2.1 MB, more than everything else on this page combined. Loading it up front would make the page slower for every visitor in order to serve the few who want all 312 presets, so it waits until it is asked for.
Any class-compliant USB controller and a browser that implements Web MIDI, which today means Chrome, Edge, or Opera. The mapping is learned from whatever you move first and remembered per device, so there is nothing to configure.
Either the browser has no WebGL 2, or this device asks for reduced motion — in which case the visuals wait for a deliberate click rather than starting on their own. The hero says which one applies.
Start a conversation
Use the form for a project note, a question, or the first rough version of an idea. We'll reply by email.
Nothing left to read
The page has said everything it needs to. Fill the screen, put something loud on, and leave it running.