Use mid compress

This commit is contained in:
oc committed 2018-01-24 20:24:38 +08:00
1 parent acd634a93b
commit 948257de82
1 file changed
+2 -3
+2 -3
View File
@@ -1,3 +1,2 @@
var sampleRate=44100;function AudioPlayer(context,generator,loop){sampleRate=context.sampleRate;var channelCount=2;var bufferSize=4096*4;var node=context.createScriptProcessor(bufferSize,0,channelCount);node.onaudioprocess=function(e){process(e)};function process(e){if(generator.finished){if(loop){generator.reset();generator.finished=false}else{node.disconnect();return}}var dataLeft=e.outputBuffer.getChannelData(0);var dataRight=e.outputBuffer.getChannelData(1);var generate=generator.generate(bufferSize);for(var i=0;i<bufferSize;++i){dataLeft[i]=generate[i*2];dataRight[i]=generate[i*2+1]}}return{"play":function(){node.connect(context.destination)},"pause":function(){node.disconnect()}}}function MidiFile(data){function readChunk(stream){var id=stream.read(4);var length=stream.readInt32();return{"id":id,"length":length,"data":stream.read(length)}}var lastEventTypeByte;function readEvent(stream){var event={};event.deltaTime=stream.readVarInt();var eventTypeByte=stream.readInt8();if((eventTypeByte&240)==240){if(eventTypeByte==255){event.type="meta";var subtypeByte=stream.readInt8();var length=stream.readVarInt();switch(subtypeByte){case 0:event.subtype="sequenceNumber";if(length!=2){throw"Expected length for sequenceNumber event is 2, got "+length}event.number=stream.readInt16();return event;case 1:event.subtype="text";event.text=stream.read(length);return event;case 2:event.subtype="copyrightNotice";event.text=stream.read(length);return event;case 3:event.subtype="trackName";event.text=stream.read(length);return event;case 4:event.subtype="instrumentName";event.text=stream.read(length);return event;case 5:event.subtype="lyrics";event.text=stream.read(length);return event;case 6:event.subtype="marker";event.text=stream.read(length);return event;case 7:event.subtype="cuePoint";event.text=stream.read(length);return event;case 32:event.subtype="midiChannelPrefix";if(length!=1){throw"Expected length for midiChannelPrefix event is 1, got "+length}event.channel=stream.readInt8();return event;case 47:event.subtype="endOfTrack";if(length!=0){throw"Expected length for endOfTrack event is 0, got "+length}return event;case 81:event.subtype="setTempo";if(length!=3){throw"Expected length for setTempo event is 3, got "+length}event.microsecondsPerBeat=((stream.readInt8()<<16)+(stream.readInt8()<<8)+stream.readInt8());return event;case 84:event.subtype="smpteOffset";if(length!=5){throw"Expected length for smpteOffset event is 5, got "+length}var hourByte=stream.readInt8();event.frameRate={0:24,32:25,64:29,96:30}[hourByte&96];event.hour=hourByte&31;event.min=stream.readInt8();event.sec=stream.readInt8();event.frame=stream.readInt8();event.subframe=stream.readInt8();return event;case 88:event.subtype="timeSignature";if(length!=4){throw"Expected length for timeSignature event is 4, got "+length}event.numerator=stream.readInt8();event.denominator=Math.pow(2,stream.readInt8());event.metronome=stream.readInt8();event.thirtyseconds=stream.readInt8();return event;case 89:event.subtype="keySignature";if(length!=2){throw"Expected length for keySignature event is 2, got "+length}event.key=stream.readInt8(true);event.scale=stream.readInt8();return event;case 127:event.subtype="sequencerSpecific";event.data=stream.read(length);return event;default:event.subtype="unknown";event.data=stream.read(length);return event}event.data=stream.read(length);return event}else{if(eventTypeByte==240){event.type="sysEx";var length=stream.readVarInt();event.data=stream.read(length);return event}else{if(eventTypeByte==247){event.type="dividedSysEx";var length=stream.readVarInt();event.data=stream.read(length);return event}else{throw"Unrecognised MIDI event type byte: "+eventTypeByte}}}}else{var param1;if((eventTypeByte&128)==0){param1=eventTypeByte;eventTypeByte=lastEventTypeByte}else{param1=stream.readInt8();lastEventTypeByte=eventTypeByte}var eventType=eventTypeByte>>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 tLine truncated
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;i<header.trackCount;i++){tracks[i]=[];var trackChunk=readChunk(stream);if(trackChunk.id!="MTrk"){throw"Unexpected chunk - expected MTrk, got "+trackChunk.id}var trackStream=Stream(trackChunk.data);while(!trackStream.eof()){var event=readEvent(trackStream);tracks[i].push(event)}}return{"header":header,"tracks":tracks}}function Replayer(midiFile,synth){var trackStates=[];var beatsPerMinute=120;var ticksPerBeat=midiFile.header.ticksPerBeat;var channelCount=16;var channels=[];var nextEventInfo;var samplesToNextEvent;function Channel(){var generatorsByNote={};var currentProgram=PianoProgram;function noteOn(note,velocity){if(generatorsByNote[note]&&!generatorsByNote[note].released){generatorsByNote[note].noteOff()}generator=currentProgram.createNote(note,velocity);synth.addGenerator(generator);generatorsByNote[note]=generator}function noteOff(note,velocity){if(generatorsByNote[note]&&!generatorsByNote[note].released){generatorsByNote[note].noteOff(velocity)}}function setProgram(programNumber){currentProgram=PROGRAMS[programNumber]||PianoProgram}return{"noteOn":noteOn,"noteOff":noteOff,"setProgram":setProgram}}function getNextEvent(){var ticksToNextEvent=null;var nextEventTrack=null;var nextEventIndex=null;for(var i=0;i<trackStates.length;i++){if(trackStates[i].ticksToNextEvent!=null&&(ticksToNextEvent==null||trackStates[i].ticksToNextEvent<ticksToNextEvent)){ticksToNextEvent=trackStates[i].ticksToNextEvent;nextEventTrack=i;nextEventIndex=trackStates[i].nextEventIndex}}if(nextEventTrack!=null){var nextEvent=midiFile.tracks[nextEventTrack][nextEventIndex];if(midiFile.tracks[nextEventTrack][nextEventIndex+1]){trackStates[nextEventTrack].ticksToNextEvent+=midiFile.tracks[nextEventTrack][nextEventIndex+1].deltaTime}else{trackStates[nextEventTrack].ticksToNextEvent=null}trackStates[nextEventTrack].nextEventIndex+=1;for(var i=0;i<trackStates.length;i++){if(trackStates[i].ticksToNextEvent!=null){trackStates[i].ticksToNextEvent-=ticksToNextEvent}}nextEventInfo={"ticksToEvent":ticksToNextEvent,"event":nextEvent,"track":nextEventTrack};var beatsToNextEvent=ticksToNextEvent/ticksPerBeat;var secondsToNextEvent=beatsToNextEvent/(beatsPerMinute/60);samplesToNextEvent+=secondsToNextEvent*synth.sampleRate}else{nextEventInfo=null;samplesToNextEvent=null;self.finished=true}}function generate(samples){var data=new Array(samples*2);var samplesRemaining=samples;var dataOffset=0;while(true){if(samplesToNextEvent!=null&&samplesToNextEvent<=samplesRemaining){var samplesToGenerate=Math.ceil(samplesToNextEvent);if(samplesToGenerate>0){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 reset(){for(var i=0;i<midiFile.tracks.length;i++){trackStates[i]={"nextEventIndex":0,"ticksToNextEvent":(midiFile.tracks[i].length?midiFile.tracks[i][0].deltaTime:null)}}for(var i=0;i<channelCount;i++){channels[i]=Channel()}samplesToNextEvent=0;getNextEvent()}reset();var self={"reset":reset,"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[offsetLine truncated
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<count*2;i++){input[i]=0}child.generate(input,0,count);childOffset=0;while(count){if(releaseTime!=null){if(t<endTime){while(count&&t<endTime){var ampl=sustainAmplitude-releaseRate*(t-releaseTime);buf[offset++]+=input[childOffset++]*ampl;buf[offset++]+=input[childOffset++]*ampl;t++;count--}}else{self.alive=false;return}}else{if(t<attackTime){while(count&&t<attackTime){var ampl=attackAmplitude*t/attackTime;buf[offset++]+=input[childOffset++]*ampl;buf[offset++]+=input[childOffset++]*ampl;t++;count--}}else{if(t<decayTime){while(count&&t<decayTime){var ampl=attackAmplitude-decayRate*(t-attackTime);buf[offset++]+=input[childOffset++]*ampl;buf[offset++]+=input[childOffset++]*ampl;t++;count--}}else{while(count){buf[offset++]+=input[childOffset++]*sustainAmplitude;buf[offset++]+=input[childOffset++]*sustainAmplitude;t++;count--}}}}}};return self}function midiToFrequency(note){return 440*Math.pow(2,(note-69)/12)}PianoProgram={"attackAmplitude":0.2,"sustainAmplitude":0.1,"attackTime":0.02,"decayTime":0.3,"releaseTime":0.02,"createNote":function(note,velocity){var frequency=midiToFrequency(note);return ADSRGenerator(SineGenerator(frequency),this.attackAmplitude*(velocity/128),this.sustainAmplitude*(velocity/128),this.attackTime,this.decayTime,this.releaseTime)}};StringProgram={"createNote":function(note,velocity){var frequency=midiToFrequency(note);return ADSRGenerator(SineGenerator(frequency),0.5*(velocity/128),0.2*(velocity/128),0.4,0.8,0.4)}};PROGRAMS={41:StringProgram,42:StringProgram,43:StringProgram,44:StringProgram,45:StringProgram,46:StringProgram,47:StringProgram,49:StringProgram,50:StringProgram};function Synth(sampleRate){var generators=[];function addGenerator(generator){generators.push(generator)}function generate(samples){var data=new Array(samples*2);generateIntoBuffer(samples,data,0);return data}function generateIntoBuffer(samplesToGenerate,buffer,offset){for(var i=offset;i<offset+samplesToGenerate*2;i++){buffer[i]=0}for(var i=generators.length-1;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}};
var sampleRate=44100;function AudioPlayer(b,f,a){sampleRate=b.sampleRate;var c=2;var g=4096*4;var d=b.createScriptProcessor(g,0,c);d.onaudioprocess=function(h){e(h)};function e(m){if(f.finished){if(a){f.reset();f.finished=false}else{d.disconnect();return}}var l=m.outputBuffer.getChannelData(0);var k=m.outputBuffer.getChannelData(1);var h=f.generate(g);for(var j=0;j<g;++j){l[j]=h[j*2];k[j]=h[j*2+1]}}return{"play":function(){d.connect(b.destination)},"pause":function(){d.disconnect()}}}function MidiFile(g){function a(q){var r=q.read(4);var i=q.readInt32();return{"id":r,"length":i,"data":q.read(i)}}var o;function c(w){var u={};u.deltaTime=w.readVarInt();var t=w.readInt8();if((t&240)==240){if(t==255){u.type="meta";var r=w.readInt8();var s=w.readVarInt();switch(r){case 0:u.subtype="sequenceNumber";if(s!=2){throw"Expected length for sequenceNumber event is 2, got "+s}u.number=w.readInt16();return u;case 1:u.subtype="text";u.text=w.read(s);return u;case 2:u.subtype="copyrightNotice";u.text=w.read(s);return u;case 3:u.subtype="trackName";u.text=w.read(s);return u;case 4:u.subtype="instrumentName";u.text=w.read(s);return u;case 5:u.subtype="lyrics";u.text=w.read(s);return u;case 6:u.subtype="marker";u.text=w.read(s);return u;case 7:u.subtype="cuePoint";u.text=w.read(s);return u;case 32:u.subtype="midiChannelPrefix";if(s!=1){throw"Expected length for midiChannelPrefix event is 1, got "+s}u.channel=w.readInt8();return u;case 47:u.subtype="endOfTrack";if(s!=0){throw"Expected length for endOfTrack event is 0, got "+s}return u;case 81:u.subtype="setTempo";if(s!=3){throw"Expected length for setTempo event is 3, got "+s}u.microsecondsPerBeat=((w.readInt8()<<16)+(w.readInt8()<<8)+w.readInt8());return u;case 84:u.subtype="smpteOffset";if(s!=5){throw"Expected length for smpteOffset event is 5, got "+s}var q=w.readInt8();u.frameRate={0:24,32:25,64:29,96:30}[q&96];u.hour=q&31;u.min=w.readInt8();u.sec=w.readInt8();u.frame=w.readInt8();u.subframe=w.readInt8();return u;case 88:u.subtype="timeSignature";if(s!=4){throw"Expected length for timeSignature event is 4, got "+s}u.numerator=w.readInt8();u.denominator=Math.pow(2,w.readInt8());u.metronome=w.readInt8();u.thirtyseconds=w.readInt8();return u;case 89:u.subtype="keySignature";if(s!=2){throw"Expected length for keySignature event is 2, got "+s}u.key=w.readInt8(true);u.scale=w.readInt8();return u;case 127:u.subtype="sequencerSpecific";u.data=w.read(s);return u;default:u.subtype="unknown";u.data=w.read(s);return u}u.data=w.read(s);return u}else{if(t==240){u.type="sysEx";var s=w.readVarInt();u.data=w.read(s);return u}else{if(t==247){u.type="dividedSysEx";var s=w.readVarInt();u.data=w.read(s);return u}else{throw"Unrecognised MIDI event type byte: "+t}}}}else{var v;if((t&128)==0){v=t;t=o}else{v=w.readInt8();o=t}var i=t>>4;u.channel=t&15;u.type="channel";switch(i){case 8:u.subtype="noteOff";u.noteNumber=v;u.velocity=w.readInt8();return u;case 9:u.noteNumber=v;u.velocity=w.readInt8();if(u.velocity==0){u.subtype="noteOff"}else{u.subtype="noteOn"}return u;case 10:u.subtype="noteAftertouch";u.noteNumber=v;u.amount=w.readInt8();return u;case 11:u.subtype="controller";u.controllerType=v;u.value=w.readInt8();return u;case 12:u.subtype="programChange";u.programNumber=v;return u;case 13:u.subtype="channelAftertouch";u.amount=v;return u;case 14:u.subtype="pitchBend";u.value=v+(w.readInt8()<<7);return u;default:throw"Unrecognised MIDI event type: "+i}}}stream=Stream(g);var k=a(stream);if(k.id!="MThd"||k.length!=6){throw"Bad .mid file - header not found"}var f=Stream(k.data);var d=f.readInt16();var h=f.readInt16();var p=f.readInt16();if(p&32768){throw"Expressing time division in SMTPE frames is not supported yet"}else{ticksPerBeat=p}var j={"formatType":d,"trackCount":h,"ticksPerBeat":ticksPerBeat};var m=[];for(var e=0;e<j.trackCount;e++){m[e]=[];var l=a(stream);if(l.id!="MTrk"){throw"Unexpected chunk - expected MTrk, got "+l.id}var n=Stream(l.data);while(!n.eof()){var b=c(n);m[e].push(b)}}return{"header":j,"tracks":m}}function Replayer(h,c){var k=[];var o=120;var l=h.header.ticksPerBeat;var a=16;var d=[];var m;var e;function b(){var t={};var p=PianoProgram;function s(u,v){if(t[u]&&!t[u].released){t[u].noteOff()}generator=p.createNote(u,v);c.addGenerator(generator);t[u]=generator}function r(u,v){if(t[u]&&!t[u].released){t[u].noteOff(v)}}function q(u){p=PROGRAMS[u]||PianoProgram}return{"noteOn":s,"noteOff":r,"setProgram":q}}function g(){var t=null;var v=null;var p=null;for(var s=0;s<k.length;s++){if(k[s].ticksToNextEvent!=null&&(t==null||k[s].ticksToNextEvent<t)){t=k[s].ticksToNextEvent;v=s;p=k[s].nextEventIndex}}if(v!=null){var r=h.tracks[v][p];if(h.tracks[v][p+1]){k[v].ticksToNextEvent+=h.tracks[v][p+1].deltaTime}else{k[v].ticksToNextEvent=null}k[v].nextEventIndex+=1;for(var s=0;s<k.length;s++){if(k[s].ticksToNextEvent!=null){k[s].ticksToNextEvent-=t}}m={"ticksToEvent":t,"event":r,"track":v};var u=t/l;var q=u/(o/60);e+=q*c.sampleRate}else{m=null;e=null;n.finished=true}}function j(q){var t=new ArraLine truncated
var s=q;var p=0;while(true){if(e!=null&&e<=s){var r=Math.ceil(e);if(r>0){c.generateIntoBuffer(r,t,p);p+=r*2;s-=r;e-=r}i();g()}else{if(s>0){c.generateIntoBuffer(s,t,p);e-=s}break}}return t}function i(){var p=m.event;switch(p.type){case"meta":switch(p.subtype){case"setTempo":o=60000000/p.microsecondsPerBeat}break;case"channel":switch(p.subtype){case"noteOn":d[p.channel].noteOn(p.noteNumber,p.velocity);break;case"noteOff":d[p.channel].noteOff(p.noteNumber,p.velocity);break;case"programChange":d[p.channel].setProgram(p.programNumber);break}break}}function f(){for(var p=0;p<h.tracks.length;p++){k[p]={"nextEventIndex":0,"ticksToNextEvent":(h.tracks[p].length?h.tracks[p][0].deltaTime:null)}}for(var p=0;p<a;p++){d[p]=b()}e=0;g()}f();var n={"reset":f,"generate":j,"finished":false};return n}function Stream(g){var b=0;function e(j){var i=g.substr(b,j);b+=j;return i}function f(){var i=((g.charCodeAt(b)<<24)+(g.charCodeAt(b+1)<<16)+(g.charCodeAt(b+2)<<8)+g.charCodeAt(b+3));b+=4;return i}function a(){var i=((g.charCodeAt(b)<<8)+g.charCodeAt(b+1));b+=2;return i}function h(j){var i=g.charCodeAt(b);if(j&&i>127){i-=256}b+=1;return i}function c(){return b>=g.length}function d(){var j=0;while(true){var i=h();if(i&128){j+=(i&127);j<<=7}else{return j+i}}}return{"eof":c,"read":e,"readInt32":f,"readInt16":a,"readInt8":h,"readVarInt":d}}function SineGenerator(c){var a={"alive":true};var d=sampleRate/c;var b=0;a.generate=function(g,i,h){for(;h;h--){var f=b/d;var e=Math.sin(f*2*Math.PI);g[i++]+=e;g[i++]+=e;b++}};return a}function SquareGenerator(d,a){var b={"alive":true};var e=sampleRate/d;var c=0;b.generate=function(g,i,h){for(;h;h--){var f=((c/e)%1>a?1:-1);g[i++]+=f;g[i++]+=f;c++}};return b}function ADSRGenerator(c,i,k,h,l,j){var n={"alive":true};var f=sampleRate*h;var g=sampleRate*(h+l);var b=(i-k)/(g-f);var a=null;var e=null;var d=k/(sampleRate*j);var m=0;n.noteOff=function(){if(n.released){return}a=m;n.released=true;e=a+sampleRate*j};n.generate=function(p,t,s){if(!n.alive){return}var o=new Array(s*2);for(var r=0;r<s*2;r++){o[r]=0}c.generate(o,0,s);childOffset=0;while(s){if(a!=null){if(m<e){while(s&&m<e){var q=k-d*(m-a);p[t++]+=o[childOffset++]*q;p[t++]+=o[childOffset++]*q;m++;s--}}else{n.alive=false;return}}else{if(m<f){while(s&&m<f){var q=i*m/f;p[t++]+=o[childOffset++]*q;p[t++]+=o[childOffset++]*q;m++;s--}}else{if(m<g){while(s&&m<g){var q=i-b*(m-f);p[t++]+=o[childOffset++]*q;p[t++]+=o[childOffset++]*q;m++;s--}}else{while(s){p[t++]+=o[childOffset++]*k;p[t++]+=o[childOffset++]*k;m++;s--}}}}}};return n}function midiToFrequency(a){return 440*Math.pow(2,(a-69)/12)}PianoProgram={"attackAmplitude":0.2,"sustainAmplitude":0.1,"attackTime":0.02,"decayTime":0.3,"releaseTime":0.02,"createNote":function(a,b){var c=midiToFrequency(a);return ADSRGenerator(SineGenerator(c),this.attackAmplitude*(b/128),this.sustainAmplitude*(b/128),this.attackTime,this.decayTime,this.releaseTime)}};StringProgram={"createNote":function(a,b){var c=midiToFrequency(a);return ADSRGenerator(SineGenerator(c),0.5*(b/128),0.2*(b/128),0.4,0.8,0.4)}};PROGRAMS={41:StringProgram,42:StringProgram,43:StringProgram,44:StringProgram,45:StringProgram,46:StringProgram,47:StringProgram,49:StringProgram,50:StringProgram};function Synth(b){var c=[];function e(f){c.push(f)}function a(f){var g=new Array(f*2);d(f,g,0);return g}function d(h,f,j){for(var g=j;g<j+h*2;g++){f[g]=0}for(var g=c.length-1;g>=0;g--){c[g].generate(f,j,h);if(!c[g].alive){c.splice(g,1)}}}return{"sampleRate":b,"addGenerator":e,"generate":a,"generateIntoBuffer":d}};