| } | } | ||||
| function processFile(file) { | function processFile(file) { | ||||
| var context = new window.AudioContext(); | |||||
| var context = new OfflineAudioContext(1,10*44100,44100); | |||||
| context.decodeAudioData(file, function(buffer) { | context.decodeAudioData(file, function(buffer) { | ||||
| var monoData = buffer.getChannelData(0); // start with mono, do stereo later | var monoData = buffer.getChannelData(0); // start with mono, do stereo later | ||||
| var thisLength = monoData.length; | |||||
| // AudioPlayMemory requires padding to 2.9 ms boundary (128 samples @ 44100) | |||||
| var padLength = padding(thisLength, 128); | |||||
| var arraylen = ((thisLength + padLength) * 2 + 3) / 4 + 1; | |||||
| console.log(10241, thisLength, padLength, arraylen); | |||||
| console.log(monoData); | |||||
| var outputData = []; | |||||
| for(var i=0;i<monoData.length;i+=2) { | |||||
| var a = floatToUnsignedInt16(monoData[i]); | |||||
| var b = floatToUnsignedInt16(monoData[i+1]); | |||||
| outputData.push((65536*b + a).toString(16)); | |||||
| } | |||||
| var padLength = padding(outputData.length, 128); | |||||
| for(var i=0;i<padLength;i++) { | |||||
| outputData.push((0).toString(16)); | |||||
| } | |||||
| console.log(outputData); | |||||
| }); | }); | ||||
| } | } | ||||
| function floatToUnsignedInt16(f) { | |||||
| f = Math.max(-1, Math.min(1, f)); | |||||
| var uint; | |||||
| // horrible hacks going on here - basically i don't understand bitwise operators | |||||
| if(f>=0) uint = Math.round(f * 32767); | |||||
| else uint = Math.round((f + 1) * 32767 + 32768); | |||||
| return uint; | |||||
| } | |||||
| // compute the extra padding needed | // compute the extra padding needed | ||||
| function padding(sampleLength, block) { | function padding(sampleLength, block) { | ||||
| var extra = sampleLength % block; | var extra = sampleLength % block; |