Three.js From Zero · Article s9-03

S9-03 Audio-Reactive Visuals

Season 9 · Article 03

Audio-Reactive Visuals

AnalyserNode gives FFT output. Feed amplitude into scale. Feed bass into shader uniform. Sync visuals to the music.

1. AnalyserNode

const analyser = ctx.createAnalyser();
analyser.fftSize = 512;         // 256 bins
analyser.smoothingTimeConstant = 0.8;

source.connect(analyser);
analyser.connect(ctx.destination);

// Each frame:
const freqData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(freqData);
// freqData[0] = DC, freqData[1] = low bass, etc.
// 0-255 normalized.

2. Time-domain vs frequency-domain

  • getByteTimeDomainData: raw waveform (for oscilloscope display).
  • getByteFrequencyData: FFT magnitude per bin (for spectrum + beat detection).

3. Band extraction

const bass = averageRange(freqData, 0, 20);      // 0-~500Hz
const mid  = averageRange(freqData, 20, 80);     // ~500-3kHz
const hi   = averageRange(freqData, 80, 200);    // ~3-15kHz

function averageRange(data, lo, hi) {
  let sum = 0;
  for (let i = lo; i < hi; i++) sum += data[i];
  return sum / (hi - lo) / 255;
}

4. Drive visuals

sphere.scale.setScalar(1 + bass * 0.8);
material.color.setHSL(hi, 0.8, 0.5 + mid * 0.2);
shader.uniforms.uGlow.value = bass * 3;

5. Beat detection (simple)

let bassHistory = [];
function isBeat(bass) {
  bassHistory.push(bass);
  if (bassHistory.length > 43) bassHistory.shift();  // ~1s at 60fps
  const avg = bassHistory.reduce((a,b) => a + b, 0) / bassHistory.length;
  return bass > avg * 1.4;  // 40% above average = beat
}

On beat: trigger flash, particle burst, camera shake. The music-games pattern.

6. Live demo — reactive sphere + bars

7. Shader uniforms from audio

// Each frame
shader.uniforms.uBass.value = bass;
shader.uniforms.uMid.value = mid;
shader.uniforms.uHi.value = hi;

// In fragment shader
vec3 color = mix(lowColor, highColor, uHi);
float glow = uBass * 5.0;
gl_FragColor = vec4(color + glow, 1.0);

8. Use cases

  • Music visualizers (Monstercat, Trap Nation aesthetic).
  • DJ/VJ performance tools.
  • Rhythm games.
  • Synesthetic demos.
  • Accessibility: visualize audio for deaf users.

9. Takeaways

  • AnalyserNode → FFT bins per frame.
  • Average bass/mid/hi bands.
  • Feed amplitude → scale, color, uniforms.
  • Beat detection: energy spike over rolling average.
  • Shader uniforms update each frame for music-reactive materials.