/* TODO u-law encoding browser feature check (offlineaudiocontext might still be a bit niche) */ var audioFileChooser = document.getElementById('audioFileChooser'); audioFileChooser.addEventListener('change', readFile); function readFile() { for(var i = 0; i < audioFileChooser.files.length; i++) { var fileReader = new FileReader(); var sampleRateChoice = document.getElementById('sampleRate').value; if(sampleRateChoice == "auto") sampleRateChoice = null; else sampleRateChoice = parseInt(sampleRateChoice); fileReader.readAsArrayBuffer(audioFileChooser.files[i]); fileReader.addEventListener('load', function(fileName, ev) { processFile(ev.target.result, fileName, sampleRateChoice); }.bind(null, audioFileChooser.files[i].name)); } } function processFile(file, fileName, sampleRateChoice) { // determine sample rate // ideas borrowed from https://github.com/ffdead/wav.js var sampleRate = 0; if(!sampleRateChoice) { try { var sampleRateBytes = new Uint8Array(file, 24, 4); for(var i = 0; i < sampleRateBytes.length; i ++) { sampleRate |= sampleRateBytes[i] << (i*8); } } catch(err) { console.log('problem reading sample rate'); } if([44100, 22050, 11025].indexOf(sampleRate) == -1) { sampleRate = 44100; } } else { console.log('using chosen sample rate of ' + sampleRateChoice); sampleRate = sampleRateChoice; } var context = new OfflineAudioContext(1, 100*sampleRate, sampleRate); // 100 seconds for now context.decodeAudioData(file, function(buffer) { console.log(buffer.sampleRate); var monoData = []; if(buffer.numberOfChannels == 1) { monoData = buffer.getChannelData(0); } else if(buffer.numberOfChannels == 2) { var leftData = buffer.getChannelData(0); var rightData = buffer.getChannelData(1); for(var i=0;i0xFFFFFF) alert("DATA TOO LONG"); statusInt = '0x' + compressionCode + sampleRateCode + statusInt; outputData.unshift(statusInt); for(var i=0;i0) outputString += '\n'; outputString += audioData[i] + ','; } return outputString; } function generateCPPFile(fileName, formattedName, audioData) { var out = ""; out += '// Audio data converted from audio file by wav2sketch_js\n\n'; out += '#include "AudioSample' + formattedName + '.h"\n\n'; out += 'const unsigned int AudioSample' + formattedName + '[' + audioData.length + '] = {\n'; out += formatAudioData(audioData) + '\n};'; return out; } function generateHeaderFile(formattedName, audioData) { var out = ""; out += '// Audio data converted from audio file by wav2sketch_js\n\n'; out += 'extern const unsigned int AudioSample' + formattedName + '[' + audioData.length + '];'; return out; }