var sampleRate=44100;function AudioPlayer(generator,opts){if(!opts){opts={}}var latency=opts.latency||1;var checkInterval=latency*100;var audioElement=new Audio();var webkitAudio=window.AudioContext||window.webkitAudioContext;var requestStop=false;if(audioElement.mozSetup){audioElement.mozSetup(2,sampleRate);var buffer=[];var minBufferLength=latency*2*sampleRate;var bufferFillLength=Math.floor(latency*sampleRate);function checkBuffer(){if(buffer.length){var written=audioElement.mozWriteAudio(buffer);buffer=buffer.slice(written)}if(buffer.length';document.body.appendChild(c);var swf=document.getElementById("da-swf");var minBufferDuration=latency*1000;var bufferFillLength=latency*sampleRate;function write(data){var out=new Array(data.length);for(var i=data.length-1;i!=0;i--){out[i]=Math.floor(data[i]*32768)}return swf.write(out.join(" "))}function checkBuffer(){if(swf.bufferedDuration()>4;event.channel=eventTypeByte&15;event.type="channel";switch(eventType){case 8:event.subtype="noteOff";event.noteNumber=param1;event.velocity=stream.readInt8();return event;case 9:event.noteNumber=param1;event.velocity=stream.readInt8();if(event.velocity==0){event.subtype="noteOff"}else{event.subtype="noteOn"}return event;case 10:event.subtype="noteAftertouch";event.noteNumber=param1;event.amount=stream.readInt8();return event;case 11:event.subtype="controller";event.controllerType=param1;event.value=stream.readInt8();return event;case 12:event.subtype="programChange";event.programNumber=param1;return event;case 13:event.subtype="channelAftertouch";event.amount=param1;return event;case 14:event.subtype="pitchBend";event.value=param1+(stream.readInt8()<<7);return event;default:throw"Unrecognised MIDI event type: "+eventType}}}stream=Stream(data);var headerChunk=readChunk(stream);if(headerChunk.id!="MThd"||headerChunk.length!=6){throw"Bad .mid file - header not found"}var headerStream=Stream(headerChunk.data);var formatType=headerStream.readInt16();var trackCount=headerStream.readInt16();var timeDivision=headerStream.readInt16();if(timeDivision&32768){throw"Expressing time division in SMTPE frames is not supported yet"}else{ticksPerBeat=timeDivision}var header={"formatType":formatType,"trackCount":trackCount,"ticksPerBeat":ticksPerBeat};var tracks=[];for(var i=0;i0){synth.generateIntoBuffer(samplesToGenerate,data,dataOffset);dataOffset+=samplesToGenerate*2;samplesRemaining-=samplesToGenerate;samplesToNextEvent-=samplesToGenerate}handleEvent();getNextEvent()}else{if(samplesRemaining>0){synth.generateIntoBuffer(samplesRemaining,data,dataOffset); samplesToNextEvent-=samplesRemaining}break}}return data}function handleEvent(){var event=nextEventInfo.event;switch(event.type){case"meta":switch(event.subtype){case"setTempo":beatsPerMinute=60000000/event.microsecondsPerBeat}break;case"channel":switch(event.subtype){case"noteOn":channels[event.channel].noteOn(event.noteNumber,event.velocity);break;case"noteOff":channels[event.channel].noteOff(event.noteNumber,event.velocity);break;case"programChange":channels[event.channel].setProgram(event.programNumber);break}break}}function replay(audio){console.log("replay");audio.write(generate(44100));setTimeout(function(){replay(audio)},10)}var self={"replay":replay,"generate":generate,"finished":false};return self}function Stream(str){var position=0;function read(length){var result=str.substr(position,length);position+=length;return result}function readInt32(){var result=((str.charCodeAt(position)<<24)+(str.charCodeAt(position+1)<<16)+(str.charCodeAt(position+2)<<8)+str.charCodeAt(position+3));position+=4;return result}function readInt16(){var result=((str.charCodeAt(position)<<8)+str.charCodeAt(position+1));position+=2;return result}function readInt8(signed){var result=str.charCodeAt(position);if(signed&&result>127){result-=256}position+=1;return result}function eof(){return position>=str.length}function readVarInt(){var result=0;while(true){var b=readInt8();if(b&128){result+=(b&127);result<<=7}else{return result+b}}}return{"eof":eof,"read":read,"readInt32":readInt32,"readInt16":readInt16,"readInt8":readInt8,"readVarInt":readVarInt}}function SineGenerator(freq){var self={"alive":true};var period=sampleRate/freq;var t=0;self.generate=function(buf,offset,count){for(;count;count--){var phase=t/period;var result=Math.sin(phase*2*Math.PI);buf[offset++]+=result;buf[offset++]+=result;t++}};return self}function SquareGenerator(freq,phase){var self={"alive":true};var period=sampleRate/freq;var t=0;self.generate=function(buf,offset,count){for(;count;count--){var result=((t/period)%1>phase?1:-1);buf[offset++]+=result;buf[offset++]+=result;t++}};return self}function ADSRGenerator(child,attackAmplitude,sustainAmplitude,attackTimeS,decayTimeS,releaseTimeS){var self={"alive":true};var attackTime=sampleRate*attackTimeS;var decayTime=sampleRate*(attackTimeS+decayTimeS);var decayRate=(attackAmplitude-sustainAmplitude)/(decayTime-attackTime);var releaseTime=null;var endTime=null;var releaseRate=sustainAmplitude/(sampleRate*releaseTimeS);var t=0;self.noteOff=function(){if(self.released){return}releaseTime=t;self.released=true;endTime=releaseTime+sampleRate*releaseTimeS};self.generate=function(buf,offset,count){if(!self.alive){return}var input=new Array(count*2);for(var i=0;i=0;i--){generators[i].generate(buffer,offset,samplesToGenerate);if(!generators[i].alive){generators.splice(i,1)}}}return{"sampleRate":sampleRate,"addGenerator":addGenerator,"generate":generate,"generateIntoBuffer":generateIntoBuffer}};