window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
var analyser = context.createAnalyser();
var source;
var freqData;
var samples = 1024*2;
var initStream = function(stream) {
analyser.fftSize = samples;
source = context.createMediaStreamSource(stream);
source.connect(analyser);
freqData = new Uint8Array(analyser.frequencyBinCount);
};
var initAudio = function() {
if (!navigator.getUserMedia)
navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
navigator.getUserMedia({audio:true}, initStream, function(e) {
alert('Hey, you should click "allow" so I can listen to you!');
console.log(e);
});
};
var maxValue = function(data) {
var max = 0;
var maxIndex = 0;
for(var i= 0, l = data.length; i < l; i++) {
if(data[i] > max) {
maxIndex = i;
max = data[i];
}
}
console.log('max', max);
return maxIndex;
};
function getFrequencyValue(index, l) {
var nyquist = context.sampleRate/2;
console.log('nyquist', nyquist, l);
return Math.round((nyquist / l) * index);
}
var noteStrings = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
function noteFromPitch( frequency ) {
var noteNum = 12 * (Math.log( frequency / 440 )/Math.log(2) );
return Math.round( noteNum ) + 69;
}
var output = document.querySelector('.freq'),
note = document.querySelector('.note');
var getData = function() {
analyser.getByteFrequencyData(freqData);
if (freqData) {
var freq = getFrequencyValue(maxValue(freqData), freqData.length);
output.innerHTML = freq;
note.innerHTML = noteStrings[noteFromPitch(freq)%12];
}
};
initAudio();
setInterval(getData, 1000);