10-16-2018, 10:03 PM
(10-16-2018, 09:30 PM)Frank Wrote:(10-16-2018, 05:07 PM)blobertthebob Wrote:(10-16-2018, 04:54 PM)Jacob_ Wrote:this is dankCode:loadInstrument(13);
var el = $('<input type="file" accept="audio/*">');
$(document.body).append(el);
el.on('change', function(e){
var reader = new FileReader();
reader.onload = function (e) {
var context = new AudioContext();
context.decodeAudioData(e.target.result, function(buffer){
var node = context.createAnalyser();
var resolution = 4;
node.fftSize = 4096;
node.smoothingTimeConstant = 0;
var bufferLength = node.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
var audioSource = context.createBufferSource();
audioSource.buffer = buffer;
audioSource.loop = false;
audioSource.connect(node);
var time = 0;
audioSource.start(0);
setInterval(function(){
node.getByteFrequencyData(dataArray);
var f = [];
for (var i = 1; i < dataArray.length - 1; i++) {
var isPeak = dataArray[i] >= dataArray[i-1] && dataArray[i] >= dataArray[i+1];
if (isPeak) {
f.push([i, dataArray[i]]);
}
}
f.sort(function(a, b){return b[1] - a[1]});
for(var i = 0; i < Math.min(f.length, 4); i++) {
var frequency = f[i][0] * context.sampleRate / node.fftSize;
var note = piano[Math.round((piano.length*Math.log(2)+12*Math.log(55/frequency)+Math.log(4))/(Math.log(2)))];
if (note != undefined && f[i][1] > 32) {
song.addNote(new Note(song, note, time/resolution, 1/resolution, 13));
}
}
time++;
}, song.sleepTime/resolution);
setInterval(SequencerView.repaint, 1000);
});
}
reader.readAsArrayBuffer(e.target.files[0]);
});
el.click();
Agreed, I was considering doing something like this, but I thought it was impossible. Who knows, maybe I should try to outdo this.
The difficult part is converting a segment of audio to an array of frequency buckets, and that's completely handled by the Web Audio API. This could definitely be done better though, it just figures out the loudest 4 notes for each 1/16 interval and adds each one if the volume is above some arbitrary number.
If you put your programming knowledge to work at something more useful than stealing people's passwords you'd be surprised at what you can do.
