milkdrop
milkdrop · sourcesMILKDROP — a Winamp/Milkdrop music visualizer (wrapping the open-source butterchurn WebGL2 engine + ~20 curated classic presets) as a fully CV-instrumented video SOURCE. Patch audio into AUDIO and the visuals react (the tap is inaudible). The novel part: butterchurn drives nearly all preset motion from three audio scalars — bass/mid/treb — and MILKDROP lets a cable REPLACE any of them. Patch CV into BASS/MID/TREB to drive that band from the cable instead of the live audio (an unpatched band still follows the audio); REACT scales all three. SPEED time-warps the engine clock (clamped at 0), PRESET selects the active preset (quantized knob/CV), MORPH sets the crossfade seconds, and a rising edge on NEXT advances presets hands-free. OUT is a normal downstream video texture (route into a mixer / keyer / OUTPUT). The card has a live preview + preset name/index readout + RCT/SPD/PST/MPH knobs, and hide-controls turns it into a resizable monitor. The butterchurn engine lives in node_modules (not vendored into the WebGL attest basis) and the preset pack loads behind a dynamic import() as a separate chunk. All ports live on the yellow drill-down PATCH PANEL (no raw side jacks, #767).
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
audio | audio | AUDIO (audio cable) - the signal the visuals react to. A GainNode sink (published for the cross-domain audio bridge) fans into a mono analyser plus a left/right analyser pair (fftSize 1024, butterchurn's window); each frame the raw bytes are fed to the engine so it reacts to YOUR audio rather than its own internal sampler. The tap is inaudible (a silent gain-0 keep-alive keeps it running); unpatched, the analyser reads flat silence so the preset animates on its own clock. Patch a stereo or mono mix here. audio signal |
bass | cv | BASS (cv) - REPLACES the bass band the visualizer reacts to. While patched, the mapped CV value drives every preset equation that reads bass (low-frequency motion); left unpatched, the bass band follows the live AUDIO input. Centered around an "average" level so an LFO sweeps the band roughly 0..2. Scaled by REACT. control voltage (CV); modulates bass (additive offset — ±1 CV sweeps the full range, centered on the knob) |
mid | cv | MID (cv) - REPLACES the mid band (mid-frequency motion). Same replace-vs-passthrough behavior as BASS: patched = driven by the cable, unpatched = follows live audio. Scaled by REACT. control voltage (CV); modulates mid (additive offset — ±1 CV sweeps the full range, centered on the knob) |
treb | cv | TREB (cv) - REPLACES the treble band (high-frequency motion). Same replace-vs-passthrough behavior as BASS: patched = driven by the cable, unpatched = follows live audio. Scaled by REACT. control voltage (CV); modulates treb (additive offset — ±1 CV sweeps the full range, centered on the knob) |
reactivity | cv | REACT (cv) - modulates the React control, a global scalar multiplied onto all three bands (bass/mid/treb) whether they come from CV or live audio. Below 1 calms the reaction, above 1 exaggerates it. control voltage (CV); modulates reactivity (additive offset — ±1 CV sweeps the full range, centered on the knob) |
speed | cv | SPEED (cv) - modulates the Speed control, a time-warp on butterchurn's internal clock (the per-frame elapsed time is multiplied by it, clamped at zero). Turn it down for slow-motion warp, up for faster motion; 0 freezes the animation. control voltage (CV); modulates speed (additive offset — ±1 CV sweeps the full range, centered on the knob) |
presetSelect | cv | PRESET (cv) - modulates the Preset control, a quantized index into the curated preset list. A sweep selects across the presets; when the rounded index changes, that preset is loaded with a MORPH-second crossfade. control voltage (CV); modulates presetSelect (additive offset — ±1 CV sweeps the full range, centered on the knob) |
morph | cv | MORPH (cv) - modulates the Morph control, the crossfade time in seconds used when the preset changes (via PRESET, NEXT, or the card). 0 = hard cut, higher = a slow blend between presets. control voltage (CV); modulates morph (additive offset — ±1 CV sweeps the full range, centered on the knob) |
next | gate | NEXT (gate cable, edge:trigger) - a rising edge (crossing above mid-scale) advances to the NEXT preset in the curated list (wrapping), crossfading over MORPH seconds. Routed through the CV bridge as the synthetic nextTrig param and edge-detected per frame (fires once per rising edge, not while held). Patch a clock to switch presets in time. gate / trigger; modulates nextTrig (summed directly (the destination DSP scales it)); trigger — fires once per rising edge |
outputs
| id | cable | what it does |
|---|---|---|
out | video | OUT (video) - the rendered visualizer frame, upscaled to the engine output resolution. A normal downstream-usable video texture: chain it into any video input (mixer / keyer / effect / OUTPUT) and it also drives the on-card preview screen. RGB video stream |
params
| id | label | range | default | curve |
|---|---|---|---|---|
bass | Bass | 0..2 | — | linear |
mid | Mid | 0..2 | — | linear |
treb | Treble | 0..2 | — | linear |
reactivity | React | 0..2 | — | linear |
speed | Speed | 0..2 | — | linear |
presetSelect | Preset | 0..? | — | linear |
morph | Morph | 0..8 | — | linear |
nextTrig | Next Trig | 0..1 | — | linear |
controls
| control | what it does |
|---|---|
| Bass | Bass (0..2, default 1) - CV-only band override TARGET (no panel knob; the BASS jack writes it). When the BASS input is patched the mapped value REPLACES the bass band the visuals react to; unpatched, the live audio bass flows through. 1 is the "average" level. |
| Mid | Mid (0..2, default 1) - CV-only band override target for the mid band (no panel knob; the MID jack writes it). Patched = the cable replaces the mid band; unpatched = live audio. 1 is the "average" level. |
| Milkdrop milk input {n} | Load .milk preset - imports a classic Winamp Milkdrop `.milk` preset file from disk. The file is converted to butterchurn's format in the browser (milkdrop-preset-converter) and APPENDED to the picker for the rest of the session, then loaded with a MORPH-second crossfade; a status line reports progress or the failure. Custom imports are in-session only and are NOT saved with the patch (the curated PRESET index IS), so a reloaded rack returns to the curated list. |
| Milkdrop preset select {n} | Preset picker - a dropdown listing every preset by NAME: the ~20 curated ones plus any .milk files imported this session. Picking one loads it with a MORPH-second crossfade. It writes the same `presetSelect` value the PRESET knob, the PRESET CV jack and the NEXT trigger drive, so the selection stays in sync everywhere and is saved with the patch. It is also the only surface on which the preset NAMES appear at all — the knob and the CV jack address presets by index. |
| Morph | Morph (0..8 s, default 2) - crossfade time in seconds used whenever the preset changes (PRESET knob/CV, NEXT trigger, or the card). 0 = hard cut, larger = slow blend. CV via the MORPH jack; also a panel knob. |
| Next Trig | Next Trig (0..1, default 0) - hidden synthetic edge-detector param. The CV bridge writes the NEXT gate level here and the module edge-detects a rising crossing of mid-scale to advance to the next preset. Not a user-facing knob (drive the NEXT jack instead). |
| Preset | Preset (0..19, default 0) - selects the active preset by index into the curated ~20-preset list (rounded/quantized). Changing it loads that preset with a MORPH-second crossfade; the card prints the current preset name + index. CV via the PRESET jack; also a panel knob. |
| React | React (0..2, default 1) - global reaction scalar multiplied onto all three bands (CV-driven or live). 1 = as-is, below 1 calms, above 1 exaggerates the audio reactivity. CV via the REACT jack; also a panel knob. |
| Speed | Speed (0..2, default 1) - time-warp on the visualizer's internal clock: the per-frame elapsed time is multiplied by this (clamped at 0). 1 = normal, 0 = frozen, 2 = double-speed motion. CV via the SPEED jack; also a panel knob. |
| Treble | Treble (0..2, default 1) - CV-only band override target for the treble band (no panel knob; the TREB jack writes it). Patched = the cable replaces the treble band; unpatched = live audio. 1 is the "average" level. |
source
milkdrop.ts on GitHub.