milkdrop

milkdrop · sources · schema v1

MILKDROP — 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).

MILKDROP is a Winamp-style Milkdrop music visualizer as a fully CV-instrumented video SOURCE. It wraps the open-source butterchurn engine (a WebGL2 reimplementation of Ryan Geiss's Milkdrop) and a curated set of ~20 classic Flexi/Geiss/Martin presets, then exposes the parts that actually drive the look as patchable CV. Patch any audio into the AUDIO input and the visuals react to it: a mono mix plus left/right channels are tapped (the audio is TAP-ONLY and inaudible — a silent gain-0 keep-alive runs the tap without routing to the speakers, so feed AUDIO OUT separately to hear it). The novel part is the per-band CV: butterchurn drives nearly all preset motion from three audio scalars — bass, mid, treb — and MILKDROP lets a cable REPLACE any of them. Patch a CV/LFO/envelope into BASS, MID, or TREB and that band is driven by the cable instead of the live audio (an unpatched band still follows the audio); the REACT control scales all three at once. SPEED is a time-warp (it scales how fast butterchurn's internal clock advances, clamped at zero — turn it down to slow the motion, up to speed it up). PRESET selects which of the curated presets is showing (a quantized index, knob or CV), MORPH sets the crossfade time when the preset changes, and a rising edge on NEXT advances to the next preset hands-free (clock it from a sequencer to switch presets in time). The output is a normal downstream video texture: route OUT into a mixer, keyer, effect, or OUTPUT. With nothing patched it still animates (the preset runs on its own clock) and shows the current preset; the card has a live preview screen and a preset name/index readout, and hiding the controls turns it into a resizable monitor (drag the bottom-right corner, double-click to restore). To LOAD/BROWSE presets directly, the card has a searchable preset PICKER (a dropdown listing every curated preset by name) — picking one loads it with a MORPH-second crossfade and is the same selection the PRESET knob, the PRESET CV jack, and the NEXT trigger drive (they stay in sync). A "Load .milk…" button imports a classic Winamp Milkdrop `.milk` preset file straight from disk: the file is converted to butterchurn's format in the browser (via milkdrop-preset-converter) and appended to the picker for the rest of the session (custom imports are in-session only and are not saved with the patch; the curated PRESET index IS saved).

the faceplate

milkdropaudioaudiobasscvmidcvtrebcvreactivitycvspeedcvpresetSelectcvmorphcvnextgateoutvideoaudiocvgatepitch
9 inputs · 1 outputs · 8 params

inputs

idcablewhat it does
audioaudioAUDIO (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
basscvBASS (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)
midcvMID (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)
trebcvTREB (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)
reactivitycvREACT (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)
speedcvSPEED (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)
presetSelectcvPRESET (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)
morphcvMORPH (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)
nextgateNEXT (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

idcablewhat it does
outvideoOUT (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

idlabelrangedefaultcurve
bassBass0..2linear
midMid0..2linear
trebTreble0..2linear
reactivityReact0..2linear
speedSpeed0..2linear
presetSelectPreset0..?linear
morphMorph0..8linear
nextTrigNext Trig0..1linear

controls

controlwhat it does
BassBass (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.
MidMid (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.
MorphMorph (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 TrigNext 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).
PresetPreset (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.
ReactReact (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.
SpeedSpeed (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.
TrebleTreble (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.

Generated from packages/web/src/lib/{audio,video}/module-registry.ts · repo