MilkDrop
The MilkDrop mode plays MilkDrop presets: the swirling, warping, feedback-driven visuals that Ryan Geiss’s MilkDrop made famous in Winamp, and that a community has been writing presets for ever since. Nokkvi doesn’t contain MilkDrop itself; it runs the presets through OjoDrop, a MilkDrop engine written in Rust, fed by Nokkvi’s own audio.
Turning it on
Section titled “Turning it on”Press V (or click the visualizer button in the player bar) until the drop icon shows. The cycle is Off → Bars → Lines → Scope → MilkDrop → Off.
MilkDrop takes the cover art’s place:
- On the Queue (and the Radio view), the preset replaces the now-playing cover. The cover shows while the first preset loads.
- In Theater Mode it fills the panel: the whole window with the Cover Art setting on Hide in Theater Mode, or the square or stretched panel otherwise.
It only animates while music is playing and the panel is on screen. Pause freezes the picture; Stop gives the panel back to the cover. On other views, or with the window closed to the tray, nothing runs and no presets load.
With lyrics on, the text sits over the preset with the usual dimming layer above it. The frosted-cover backdrop is skipped, since there’s no cover to frost.
Changing presets
Section titled “Changing presets”Presets change on their own:
- every 30 seconds (the Preset Interval setting;
0turns the timer off), and - on each new track (the Change Preset With Track setting).
The old preset dissolves into the new one over 2 seconds (the Preset Crossfade setting; 0 cuts straight over), with a different pattern each time: all at once, a sweep, a growing or closing ring, or blotches. Each preset’s name pops up as a notification when it appears (turn that off with Show Preset Names). Presets are drawn shuffle-style: every preset once before any repeats, and never the same one twice in a row.
| Key | Action |
|---|---|
N | Next Preset: jump to another preset |
P | Previous Preset: go back through the presets you’ve seen |
Shift + M | Lock Preset: keep this one until you press it again (the timer and track changes leave it alone) |
All three are rebindable and do nothing outside MilkDrop mode. They also work in Theater Mode. From a script, nokkvi preset next (and previous, lock, unlock, favorite, unfavorite, hide) does the same; see the CLI guide.
Curating
Section titled “Curating”Right-click the preset (on the Queue cover, or in Theater Mode) for:
- Next Preset, Previous Preset, Lock Preset / Unlock Preset
- Favorite Preset / Unfavorite Preset: with the Presets setting on favorites_only, only your favorites are drawn (and all presets while you have none).
- Never Show This Preset: hides the preset on screen for good and moves on at once (if you’re paused, the next one loads when you press play). Hide the last one and the cover comes back.
Next and Previous only work while music plays with MilkDrop on screen; otherwise a notification says so.
Hidden and favorite presets are saved in ~/.config/nokkvi/milkdrop/curation.toml, a plain list you can read or edit (if you break its syntax, Nokkvi warns you and won’t save over it until you fix it and restart):
hidden = ["Some Author - a preset that didn't work"]favorites = ["Another Author - one I love"]nokkvi’s own presets
Section titled “nokkvi’s own presets”Twenty presets are made for Nokkvi and draw in your theme’s colours: its background, accents and visualizer gradient. Change theme and the preset on screen recolours on the spot. Six of them also use the playing album’s cover (or the station’s logo on the radio), and it follows each track change:
| Preset | What it does |
|---|---|
nokkvi - cover tunnel | The cover papers the walls of a tunnel, lit as relief, that rushes forward on the bass; each kick sends the waveform flying past as a squiggly hoop that lights the walls. |
nokkvi - cover halo | The cover as a glossy card leaning in a dark room, wobbling on kicks, with a sheen, a drop shadow and a frame that pulses with the bass; rays of its colours stream out behind it, lengthening with the music, with dust twinkling in them. |
nokkvi - cover ripple | The cover embossed under a lit pool’s surface; each kick drops a big ripple across it, rain keeps falling in between (more with the treble), and the glints travel as the light wanders. |
nokkvi - cover deep dive | A flight into the cover, planted at the vanishing point, as it grows into a lava field (dark crust over glowing cracks) that keeps sprouting finer detail; each kick stamps the waveform as a ring of heat that dives outward. |
nokkvi - aurora | A folded aurora curtain in the theme’s gradient, its rays reaching with the spectrum and surging along the arc on each kick, over stars, low hills and a rippling sea that mirrors it; no cover needed. |
nokkvi - starfield | A hyperspace flight through a spiralling vortex of stars that trail outward, each tied to a frequency; no cover needed. |
nokkvi - starfield nebula | The starfield flown through a living nebula in your theme’s gradient: glossy, liquid star trails over gas that keeps reorganising itself. On each beat the scene pauses and the view drags to a new angle with an echo smear. No cover. |
nokkvi - fractal zoom | A never-ending, twisting dive into a fractal that warps and changes with the music as you fall into it; each kick stamps the waveform as a ring that flies outward with the dive. No cover needed. |
nokkvi - living ink | Drops of ink shoot into a dark tank from every direction on the music’s hits, in your theme’s gradient: glossy rings, and lopsided blobs that splat on bright hits or drift in on swells. Rings break apart into smaller rings and blobs burst into smaller blobs, and the ink swells where it touches other ink, so a busy song fills much of the canvas with merging, painterly ink while quieter music lets it clear. Rings that crash into each other swell and outlive the rest. The camera holds still, then swings and twists to a new view at the start of each bar, dragging the frozen picture into an echo smear; the beat makes the ink thump, the bass swells it and the treble ripples its surface. No cover. |
nokkvi - julia lace | An endless dive into a Julia set’s spiral vortex, drawn as glowing lace lying in a dark, glossy liquid that mirrors the sky and a low moon. The set glides between different spiral forms, louder music dives faster, kicks lurch it deeper, and every beat sends a glowing ripple out from the vortex. No cover. |
nokkvi - coral city | A swim through an endless city of coral bubbles (domes, arches and tunnels), lit and fogged, steering itself through open water; the reef sways with the music and its lights flicker with the treble. No cover. |
nokkvi - coral dive | A dive into the same reef that never ends: every few seconds it arrives at the same shapes again, a size smaller; loudness sets the speed. No cover. |
nokkvi - infinity | A flight down a spiralling 3D corridor of neon-lit triangles (sometimes squares, pentagons or hexagons) standing half-sunk in a dark, rippling liquid that reflects them. The camera glides between patterns: straight, spiralling, winding, orbiting and a counter-twisting vortex. Louder music flies faster, kicks lunge forward, and every beat sends a wave of light down the frames. Inspired by martin’s “infinity”. No cover. |
nokkvi - fractal voyage | A voyage through four fractals lying in that same liquid: a Julia set, the Burning Ship, the Mandelbrot set and the dragon curve, about 45 seconds each (sooner when the music is loud). Each one dives toward its centre and eases to a stop, then the camera looks up at the moon while the scene blurs into the next. The Julia set is a different one each time round, and the dragon folds up from a single line. Beats send ripples across the water, or waves of light through the Burning Ship’s and the Mandelbrot’s own contours, and swell the moon and its reflection. No cover. |
nokkvi - fjord | A low flight down a winding Norwegian fjord between still, steep cliffs that rise straight out of the water. The river is the music: the song’s spectrum flows down the fjord as glossy swells traced by neon contour lines in your theme’s colours, and each kick flares through the lines and lights up the water, its plankton and the cliff feet as it races downstream. A soft, dreamy focus makes the distance glow and leaves faint echoes behind moving light. Each visit is a different time of day: an overcast day, a low golden-hour sun, or a night under the moon and an aurora that brightens with the music. No cover. |
nokkvi - pirate signal | nokkvi’s pirate smiley as a broadcast on an LCD, a thick coin over living sand and oil paint that pours from its rim with the spectrum. On each beat the scene pauses and the coin hops to a new spot at a new, often ridiculous, angle with motion blur; echoes of the face bloom into the sand. Beats glitch the signal, hard beats blow it up into big LCD pixels, sharp treble breaks it into static, and when the music goes quiet the face dissolves into LCD blocks until the next beat. It blinks, too. No cover. |
nokkvi - maxawow, nokkvi - cover maxawow | A remake of Flexi, martin and Geiss’s classic “dedicated to the sherwin maxawow”: three whirlpools stir a painterly smear with glinting, embossed ridges. The paint comes from the theme’s gradient, or bleeds in from the cover’s colours at the screen edges. |
nokkvi - black holes, nokkvi - cover black holes | A remake of Flexi’s “black holes [sucking fractals for lunch] 2”: four black holes bounce and collide, hopping on kicks, and the picture spirals into each of them. What they swallow is clouds in the theme’s gradient, or the cover. |
They’re built as light on a dark canvas (glowing trails, bright bands), so in light mode they keep your theme’s dark colours: the panel stays a dark window in your theme’s palette rather than washing out.
With Visualizer From Album Art on (Settings → Theme), their accent, highlight and gradient come from the playing cover instead of the theme, and the preset on screen recolours on each track change. It reloads to do that, so presets that build up trails start them over. Their backgrounds and text stay the theme’s. The other presets keep their own colours. See Colors from the album art.
To see only these, set Presets to nokkvi (Settings → Visualizer → MilkDrop, or preset_source = "nokkvi" in [visualizer.milkdrop]).
Your own presets can use the same trick: name a colour NOKKVI_BG, NOKKVI_SURFACE, NOKKVI_TEXT, NOKKVI_ACCENT, NOKKVI_HIGHLIGHT, NOKKVI_WARM or NOKKVI_RAMP0 to NOKKVI_RAMP5 in shader code (it becomes a vec3), or add _R, _G, _B for a number in the equations. Sample the cover as sampler_cover. Name the file nokkvi - something.json and it joins the nokkvi set.
The presets
Section titled “The presets”Besides its own twenty, Nokkvi ships about 450 presets built in: the pre-converted pack from butterchurn-presets (the preset collection behind the Butterchurn web player), minus the ones known not to run and the ones that need extra images. The file names keep each preset’s author credit, which is the name you see when it appears.
The presets are the work of the MilkDrop community; each author holds the copyright in their own preset. They have been shared freely for two decades, and Nokkvi follows the stance of projectM’s preset collections: they’re treated as freely redistributable, and any author who’d rather not have a preset included can open an issue to have it removed.
Adding your own
Section titled “Adding your own”Drop Butterchurn-format .json presets into ~/.config/nokkvi/milkdrop/. They join the rotation at the next login, or right away when you press the refresh key (R) in MilkDrop mode. A file with the same name as a built-in preset replaces it. A preset that fails to load is skipped for the rest of the session (the reason is in ~/.local/state/nokkvi/nokkvi.log).
Settings
Section titled “Settings”Settings → Visualizer → MilkDrop (or [visualizer.milkdrop] in config.toml; see the config reference):
| Setting | What it does |
|---|---|
| Preset Interval | Seconds between automatic changes (0 to 600, default 30; 0 = never). |
| Preset Crossfade | Seconds one preset takes to dissolve into the next (0 to 10, default 2; 0 = a hard cut). Capped at half the Preset Interval. Two presets are drawn during a fade, so it costs more GPU while it lasts. |
| Change Preset With Track | A new track brings a new preset (default on). |
| Presets | all, favorites_only, or nokkvi (only Nokkvi’s own presets). |
| Render Quality | Pixels rendered on the panel’s shorter side before scaling: low (480), medium (720, default), high (1080), native (the panel’s own size). Lower is softer and lighter on the GPU; native on a big window costs the most. |
| Show Preset Names | The name notification on each change (default on). |
What it can’t do (yet)
Section titled “What it can’t do (yet)”.milkfiles. Only presets already converted to Butterchurn’s JSON format load. Converting classic.milkpresets needs a separate tool.- Presets that use images. Presets that sample external textures are left out of the built-in pack; a user preset that needs one gets a generated stand-in (except
cover, which is the playing album’s). - Smooth transitions. Presets cut from one to the next rather than blending. As in MilkDrop, each new preset starts from the previous one’s picture rather than from black.
- Animating while paused. Pausing freezes the frame.
MilkDrop runs at up to 60 frames a second whatever your display’s refresh rate, because presets are written for that speed.