Microphone Frequency Visualizer

by Santiago J

HTML

<canvas id="visualizer"></canvas>

CSS

#visualizer {
    background-color: #ddd;
}

JavaScript

window.AudioContext = window.AudioContext || window.webkitAudioContext;
navigator.getUserMedia = navigator.getUserMedia ||
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia;

var context = new AudioContext();
var analyser = context.createAnalyser();
var gain = context.createGain();
gain.gain.value = 0;
analyser.fftSize = 2048;
var frequencyData = new Float32Array(analyser.frequencyBinCount);

analyser.connect(gain);
gain.connect(context.destination);

// Visualizer
var analyzerSamples = analyser.frequencyBinCount;
var canvas = document.querySelector("#visualizer");
var ctx = canvas.getContext("2d");
canvas.width = analyser.frequencyBinCount;
canvas.height = 256;

function showFrequency() {
    var inp = frequencyData;
    analyser.getFloatFrequencyData(inp);
    ctx.clearRect(0, 0, analyzerSamples, 256);
    ctx.beginPath();
    ctx.moveTo(0.5, 127.5 - 127*inp[0]);
    for (var i = 1; i < inp.length; i++) {
        ctx.lineTo(i + 0.5, 127.5 - 127*inp[i]);
    }
    ctx.stroke();
}

setInterval(showFrequency, 1000/50);

window.addEventListener("load", function() {
    navigator.getUserMedia({audio: true, video: false}, function(stream) {
        var mic = context.createMediaStreamSource(stream);
        mic.connect(analyser);
    }, function(err) { throw new Error(err.name) });
});