about the visualizers
each piece is a fullscreen, audio-reactive 2D canvas sketch. they share a small bit of plumbing — a slow-LFO mood envelope, mouse-activity tap, mic analyser — and otherwise each one is its own idea.
they're meant to be left running. low-key by default, more active when you move the cursor or feed them audio.
two categories
- self-contained
- generative — the visual is drawn from scratch, no input needed.
- source-driven
- consume a still image or video you drop in. the source's edges, brightness, or color drive the field. drag-and-drop or use the file picker in the params panel.
keyboard
- 0
- toggle the params panel (per-page sliders, bottom right)
- 9
- toggle the audio / midi panel (bottom left)
- a
- toggle the microphone on / off
- m
- toggle midi learn mode
params panel · 0
per-visualizer sliders — 4–6 of the most meaningful knobs for that piece. tweak freely; nothing persists between reloads.
at the bottom are two global controls that apply across every visualizer:
- grayscale — tap to toggle. on by default. composes with contrast as a CSS filter on the canvas.
- contrast — 0.5×–2.5×. defaults to 1.0.
both global states persist in localStorage, so the look you set carries across reloads and pages.
on mobile the panel has an [x] close button and a [params] tap-handle to reopen, since there's no keyboard.
audio · 9 · a
press a to grant mic access. while the mic is on, audio amplitude drives the visualizer's intensity directly — every piece reacts without any per-page setup. when the mic is off, intensity falls back to a slow ambient envelope plus your mouse movement.
the audio panel (9, bottom-left) holds:
- [a] mic on/off — clickable status row.
- sensitivity — 0.1×–5× gain. crank up for quiet rooms, pull back for loud music.
- low / mid / high — live FFT band meters, post-gain. useful for dialing in sensitivity by eye.
midi · m
plug in any USB midi controller that sends CC messages and you can drive the params-panel sliders from hardware. mappings are by panel slot position — knob 1 controls the first slider on whatever visualizer is open, knob 2 the second, and so on.
to bind a knob:
- open the audio panel (9) and tap [learn].
- the params panel sliders go inert; click a slider to select it as the target.
- twist the knob you want bound — a small ● appears next to that slider's name to confirm.
- repeat for each knob, then tap [learn] again to exit.
mappings are global (cc → slot index) and persist in localStorage, so the same physical knob keeps its slot across pages and reloads. [clear] wipes them.
web midi works on chromium browsers (chrome, edge, brave, opera) and safari 18+. firefox shows an "unsupported" status.
source-driven specifics
visualizers in the second list have an extra source row at the top of their params panel. drop in any image or video file — the visualizer rebuilds its underlying field (edge map, slitscan column, sort buffer, etc.) from your source and runs from there. video sources keep updating per-frame.
nothing is uploaded; everything happens locally in the browser tab.