curiositech/2000s-visualization-expert
Expert in 2000s-era music visualization (Milkdrop, AVS, Geiss) and modern WebGL implementations. Specializes in Butterchurn integration, Web Audio API AnalyserNode FFT data, GLSL shaders for audio-reactive visuals, and psychedelic generative art. Activate on "Milkdrop", "music visualization", "WebGL visualizer", "Butterchurn", "audio reactive", "FFT visualization", "spectrum analyzer". NOT for simple bar charts/waveforms (use basic canvas), video editing, or non-audio visuals.
npx skills add https://github.com/curiositech/some_claude_skills --skill 2000s-visualization-expert
Expert in recreating the legendary 2000s music visualization era - Milkdrop, AVS, Geiss - using modern WebGL and Web Audio APIs.
✅ Use for:
❌ NOT for:
| Era | Key Software | Innovation |
|-----|--------------|------------|
| 1998-2000 | Geiss | Simple plasma effects, DirectX |
| 2001-2007 | Milkdrop 1 & 2 | Per-pixel equations, preset system |
| 2007-2015 | Decline | Streaming services rise |
| 2018-Present | Butterchurn | WebGL renaissance |
Milkdrop's magic: Layering simple effects - blur, zoom, rotation, color shift - with audio-reactive parameters.
→ See references/butterchurn-guide.md for full history and integration.
butterchurn, butterchurn-presetsimport butterchurn from 'butterchurn';
const visualizer = butterchurn.createVisualizer(audioContext, canvas, {
width: window.innerWidth,
height: window.innerHeight,
pixelRatio: window.devicePixelRatio || 1,
});
visualizer.connectAudio(audioNode);
visualizer.loadPreset(preset, 2.0); // 2s blend
const analyser = audioContext.createAnalyser();
analyser.fftSize = 2048;
analyser.smoothingTimeConstant = 0.8;
const frequencyData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(frequencyData);
Critical: FFT bins are linear but hearing is logarithmic! Use logarithmic mapping.
→ See references/web-audio-fft.md for frequency band extraction.
Pass audio data as 1D texture, use uniforms for bass/mid/treble:
uniform float u_bass;
float glow = smoothstep(0.5 - u_bass * 0.3, 0.0, dist);
→ See references/glsl-shaders.md for complete patterns.
What it looks like: Visualization silently fails
Why it's wrong: AudioContext starts suspended, needs user interaction
Fix: Resume on click: await audioContext.resume()
What it looks like: Bass dominates, treble invisible
Why it's wrong: FFT bins are linear; first 100 bins might be 0-2kHz
Fix: Use logarithmic bin mapping (code in references)
What it looks like: Jittery, seizure-inducing visuals
Why it's wrong: Raw FFT data is noisy frame-to-frame
Fix: analyserNode.smoothingTimeConstant = 0.7
What it looks like: Memory leaks, multiple render loops
Fix: Store animation ID, call cancelAnimationFrame on unmount
What it looks like: Blurry on retina, wrong aspect ratio
Fix: Multiply by devicePixelRatio, handle resize events
What it looks like: Choppy audio, dropped frames
Why it's wrong: Heavy shader compilation on UI thread
Fix: Compile shaders during loading, not during playback
Psychedelic/Trippy:
Flexi, martin + geiss - dedicated to the sherwin maxawowRovastar - FractopiaSmooth/Chill:
Flexi - predator-prey-spiralsGeiss - Cosmic Strings 2High Energy:
Flexi + Martin - disconnectedshifter - tumbling cubestextureRatio: 0.5will-change: transform on canvas→ references/butterchurn-guide.md - Complete Butterchurn integration
→ references/web-audio-fft.md - FFT extraction and frequency analysis
→ references/glsl-shaders.md - Audio-reactive shader patterns
This skill covers: Butterchurn/Milkdrop | Web Audio FFT | GLSL shaders | Full-screen visualization | Audio-reactive art
Take curiositech/2000s-visualization-expert from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.