diff --git a/package.json b/package.json index 38855179..dd20de95 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "SpessaSynth", - "version": "3.20.35", + "version": "3.20.36.1", "type": "module", "scripts": { "start": "node src/website/server/server.js" diff --git a/src/spessasynth_lib/synthetizer/worklet_processor.min.js b/src/spessasynth_lib/synthetizer/worklet_processor.min.js index 7f5acccf..0db08991 100644 --- a/src/spessasynth_lib/synthetizer/worklet_processor.min.js +++ b/src/spessasynth_lib/synthetizer/worklet_processor.min.js @@ -10,7 +10,7 @@ var as=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(A,e)=>( `," ")),this.RMIDInfo.INAM&&(this.rawMidiName=this.RMIDInfo[We.name],this.midiName=V(this.rawMidiName,this.rawMidiName.length,void 0,!1).replaceAll(` `," "),g=!0),this.RMIDInfo.IALB&&!this.RMIDInfo.IPRD&&(this.RMIDInfo.IPRD=this.RMIDInfo.IALB),this.RMIDInfo.PRD&&!this.RMIDInfo.IALB&&(this.RMIDInfo.IALB=this.RMIDInfo.IPRD),this.bankOffset=1,this.RMIDInfo[We.bankOffset]&&(this.bankOffset=y(this.RMIDInfo[We.bankOffset],2))}}C&&(this.bankOffset=0)}else n=s;let h=this.readMIDIChunk(n);if(h.type!=="MThd")throw X(),new SyntaxError(`Invalid MIDI Header! Expected "MThd", got "${h.type}"`);if(h.size!==6)throw X(),new RangeError(`Invalid MIDI header chunk size! Expected 6, got ${h.size}`);this.format=zA(h.data,2),this.tracksAmount=zA(h.data,2),this.timeDivision=zA(h.data,2),this.keyRange={min:127,max:0},this.lyrics=[],this.tempoChanges=[{ticks:0,tempo:120}];let d=null,Q=null;this.lastVoiceEventTick=0,this.midiPorts=[];let l=0;this.midiPortChannelOffsets=[],this.usedChannelsOnTrack=[],this.tracks=[];for(let S=0;S0&&(K+=this.tracks[S-1][this.tracks[S-1].length-1].ticks);F.data.currentIndexthis.lastVoiceEventTick&&(this.lastVoiceEventTick=K),j=Cs[a>>4],(a&240)===k.noteOn){v.add(nA);let oA=F.data[F.data.currentIndex];this.keyRange.min=Math.min(this.keyRange.min,oA),this.keyRange.max=Math.max(this.keyRange.max,oA)}M=a;break}let Y=new T(j),Z=F.data.slice(F.data.currentIndex,F.data.currentIndex+j);F.data.currentIndex+=j,Y.set(Z,0);let CA=new ie(K,a,Y);switch(w.push(CA),nA){case-2:switch(a){case k.setTempo:this.tempoChanges.push({ticks:K,tempo:6e7/zA(Z,3)});break;case k.marker:switch(V(Y,Y.length).trim().toLowerCase()){default:break;case"start":case"loopstart":d=K;break;case"loopend":Q=K}Y.currentIndex=0;break;case k.midiPort:let fA=Y[0];this.midiPorts[S]=fA,this.midiPortChannelOffsets[fA]===void 0&&(this.midiPortChannelOffsets[fA]=l,l+=16);break;case k.copyright:o||(this.copyright+=V(Y,Y.length,void 0,!1)+` `);break;case k.lyric:this.lyrics.push(Y)}break;case-3:if(Y.slice(0,7).every((oA,fA)=>xo[fA]===oA)){let oA=Y.slice(7,Z.length-3),fA=V(oA,oA.length)+` -`;this.copyright+=fA,m(`%cDecoded Roland SC message! %c${fA}`,r.recognized,r.value)}break;default:if((a&240)===k.controllerChange)switch(Y[0]){case 2:case 116:d=K;break;case 4:case 117:Q===null?Q=K:Q=0;break;case 0:C&&Y[1]!==0&&Y[1]!==127&&(m("%cDLS RMIDI with offset 1 detected!",r.recognized),this.bankOffset=1)}}}this.tracks.push(w),this.usedChannelsOnTrack.push(v),m(`%cParsed %c${this.tracks.length}%c / %c${this.tracksAmount}`,r.info,r.value,r.info,r.value)}m("%cAll tracks parsed correctly!",r.recognized),SA("%cCorrecting loops, ports and detecting notes...",r.info);let u=[];for(let S of this.tracks){let w=S.find(F=>(F.messageStatusByte&240)===k.noteOn);w&&u.push(w.ticks)}this.firstNoteOn=Math.min(...u),m(`%cFirst note-on detected at: %c${this.firstNoteOn}%c ticks!`,r.info,r.recognized,r.info),d!==null&&Q===null?(d=this.firstNoteOn,Q=this.lastVoiceEventTick):(d===null&&(d=this.firstNoteOn),(Q===null||Q===0)&&(Q=this.lastVoiceEventTick)),this.loop={start:d,end:Q},m(`%cLoop points: start: %c${this.loop.start}%c end: %c${this.loop.end}`,r.info,r.recognized,r.info,r.recognized);let D=0;for(let S of this.midiPorts)if(S!==-1){D=S;break}if(this.midiPorts=this.midiPorts.map(S=>S===-1?D:S),this.midiPortChannelOffsets.length===0&&(this.midiPortChannelOffsets=[0]),this.midiPortChannelOffsets.length<2?m("%cNo additional MIDI Ports detected.",r.info):m("%cMIDI Ports detected!",r.recognized),!g)if(this.tracks.length>1){if(this.tracks[0].find(S=>S.messageStatusByte>=k.noteOn&&S.messageStatusBytew.messageStatusByte===k.trackName);S&&(this.rawMidiName=S.messageData,this.midiName=V(S.messageData,S.messageData.length,void 0,!1))}}else{let S=this.tracks[0].find(w=>w.messageStatusByte===k.trackName);S&&(this.rawMidiName=S.messageData,this.midiName=V(S.messageData,S.messageData.length,void 0,!1))}if(this.fileName=e,this.midiName=this.midiName.trim(),this.midiName.length===0){m("%cNo name detected. Using the alt name!",r.info),this.midiName=Is(e),this.rawMidiName=new Uint8Array(this.midiName.length);for(let S=0;Sl>Q?l:Q),s=[];for(let Q=0;Q{g[D]>=u.length||u[g[D]].ticks0;){let Q=c(),l=t.tracks[Q];if(g[Q]>=l.length){C--;continue}let u=l[g[Q]];if(g[Q]++,u.messageStatusByte===k.midiPort){h[Q]=u.messageData[0];continue}let D=u.messageStatusByte&240;if(D!==k.noteOn&&D!==k.controllerChange&&D!==k.programChange&&D!==k.systemExclusive)continue;let S=(u.messageStatusByte&15)+t.midiPortChannelOffsets[h[Q]]||0,w=s[S];switch(D){case k.programChange:w.program=u.messageData[0],n(w);break;case k.controllerChange:if(u.messageData[0]!==p.bankSelect||d==="gs"&&w.drums)continue;let F=u.messageData[1],v=Math.max(0,F-t.bankOffset);if(d==="xg"){let _=F===120||F===126||F===127;_!==w.drums?(w.drums=_,w.bank=w.drums?128:v,n(w)):w.bank=w.drums?128:v;continue}s[S].bank=v;break;case k.noteOn:if(u.messageData[1]===0)continue;n(w),o[w.string].add(`${u.messageData[0]}-${u.messageData[1]}`);break;case k.systemExclusive:if(u.messageData[0]!==65||u.messageData[2]!==66||u.messageData[3]!==18||u.messageData[4]!==64||!(u.messageData[5]&16)||u.messageData[6]!==21){u.messageData[0]===67&&u.messageData[2]===76&&u.messageData[5]===126&&u.messageData[6]===0&&(d="xg");continue}let M=[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][u.messageData[5]&15]+t.midiPortChannelOffsets[h[Q]],K=!!(u.messageData[7]>0&&u.messageData[5]>>4);w=s[M],w.drums=K,w.bank=K?128:0,n(w);break}}for(let Q of Object.keys(o))o[Q].size===0&&(m(`%cDetected change but no keys for %c${Q}`,r.info,r.value),delete o[Q]);return X(),o}function Fs(t,A){this.midiPortChannelOffset===0&&(this.midiPortChannelOffset+=16,this.midiPortChannelOffsets[A]=0),this.midiPortChannelOffsets[A]===void 0&&(this.synth.workletProcessorChannels.length{this.assignMIDIPort(e,A)}),this.duration=this.midiData.duration,this.firstNoteTime=Ce(this.midiData.firstNoteOn,this.midiData),m(`%cTotal song time: ${ft(Math.ceil(this.duration)).time}`,r.recognized),this.post(wA.songChange,[new Ve(this.midiData),this.songIndex]),this.synth.resetAllControllers(),this.duration<=1&&(b(`%cVery short song: (${ft(Math.round(this.duration)).time}). Disabling loop!`,r.warn),this.loop=!1),this.play(!0)}function Gs(t){this.songs=t.reduce((A,e)=>{if(e.duration)return A.push(e),A;try{A.push(new ze(e.binary,e.altName||""))}catch(s){return this.post(wA.midiError,s.message),A}return A},[]),!(this.songs.length<1)&&(this.songIndex=0,this.songs.length>1&&(this.loop=!1),this.loadNewSequence(this.songs[this.songIndex]))}function xs(){if(this.songs.length===1){this.currentTime=0;return}this.songIndex++,this.songIndex%=this.songs.length,this.loadNewSequence(this.songs[this.songIndex])}function Ms(){if(this.songs.length===1){this.currentTime=0;return}this.songIndex--,this.songIndex<0&&(this.songIndex=this.songs.length-1),this.loadNewSequence(this.songs[this.songIndex])}var PA=new Int16Array(127);PA[p.mainVolume]=100;PA[p.expressionController]=127;PA[p.pan]=64;PA[p.releaseTime]=64;PA[p.brightness]=64;PA[p.effects1Depth]=0;function Ns(t,A=void 0){this.oneTickToSeconds=60/(120*this.midiData.timeDivision),this.synth.resetAllControllers(),this.sendMIDIReset(),this._resetTimers();let e=this.synth.workletProcessorChannels.length,s=Array(e).fill(8192),n=[];for(let C=0;CC===p.dataDecrement||C===p.dataIncrement||C===p.dataEntryMsb||C===p.dataDecrement||C===p.lsbForControl6DataEntry||C===p.RPNLsb||C===p.RPNMsb||C===p.NRPNLsb||C===p.NRPNMsb||C===p.bankSelect||C===p.lsbForControl0BankSelect||C===p.resetAllControllers,g=[];for(let C=0;C=A)break}else if(this.playedTime>=t)break;let h=ke(c.messageStatusByte),d=h.channel+(this.midiPortChannelOffsets[this.midiPorts[C]]||0);switch(h.status){case k.noteOn:case k.noteOff:case k.keySignature:break;case k.pitchBend:s[d]=c.messageData[1]<<7|c.messageData[0];break;case k.programChange:let l=n[d];l.program=c.messageData[0],l.actualBank=l.bank;break;case k.controllerChange:let u=c.messageData[0];if(o(u)){let D=c.messageData[1];if(u===p.bankSelect){n[d].bank=D;break}this.sendMIDIMessages?this.sendMIDICC(d,u,D):this.synth.controllerChange(d,u,D)}else g[d]===void 0&&(g[d]=Array.from(PA)),g[d][u]=c.messageData[1];break;default:this._processEvent(c,C);break}this.eventIndex[C]++,C=this._findFirstEventIndex();let Q=this.tracks[C][this.eventIndex[C]];if(Q===void 0)return this.stop(),!1;this.playedTime+=this.oneTickToSeconds*(Q.ticks-c.ticks)}if(this.sendMIDIMessages){for(let C=0;C>7,s[C]&127),g[C]!==void 0&&g[C].forEach((c,h)=>{c!==PA[h]&&!o(h)&&this.sendMIDICC(C,h,c)}),n[C].program>=0&&n[C].actualBank>=0){let c=n[C].actualBank;this.sendMIDICC(C,p.bankSelect,c),this.sendMIDIProgramChange(C,n[C].program)}}else for(let C=0;C>7,s[C]&127),g[C]!==void 0&&g[C].forEach((c,h)=>{c!==PA[h]&&!o(h)&&this.synth.controllerChange(C,h,c)}),n[C].program>=0&&n[C].actualBank>=0){let c=n[C].actualBank;this.synth.controllerChange(C,p.bankSelect,c),this.synth.programChange(C,n[C].program)}return!0}function bs(t=!1){if(this.midiData!==void 0){if(t){this.currentTime=0;return}if(this.currentTime>=this.duration){this.currentTime=0;return}this.paused&&(this._recalculateStartTime(this.pausedTime),this.pausedTime=void 0),this.sendMIDIMessages||this.playingNotes.forEach(A=>{this.synth.noteOn(A.channel,A.midiNote,A.velocity,!1,!0)}),this.setProcessHandler()}}function Ls(t){this.stop(),this.playingNotes=[],this.pausedTime=void 0,this.post(wA.timeChange,currentTime-Ce(t,this.midiData));let A=this._playTo(0,t);this._recalculateStartTime(this.playedTime),A&&this.play()}function Us(t){this.absoluteStartTime=currentTime-t/this._playbackRate}function Ts(t,A){switch(t){default:break;case bA.loadNewSongList:this.loadNewSongList(A);break;case bA.pause:this.pause();break;case bA.play:this.play(A);break;case bA.stop:this.stop();break;case bA.setTime:this.currentTime=A;break;case bA.changeMIDIMessageSending:this.sendMIDIMessages=A;break;case bA.setPlaybackRate:this.playbackRate=A;break;case bA.setLoop:this.loop=A;break;case bA.changeSong:A?this.nextSong():this.previousSong();break;case bA.getMIDI:this.post(wA.getMIDI,this.midiData);break;case bA.setSkipToFirstNote:this._skipToFirstNoteOn=A;break}}function Hs(t,A=void 0){this.synth.enableEventSystem&&this.synth.post({messageType:pA.sequencerSpecific,messageData:{messageType:t,messageData:A}})}function Ys(t){this.post(wA.midiEvent,t)}function Js(t,A,e){t%=16,this.sendMIDIMessages&&this.sendMIDIMessage([k.controllerChange|t,A,e])}function vs(t,A){t%=16,this.sendMIDIMessages&&this.sendMIDIMessage([k.programChange|t,A])}function qs(t,A,e){t%=16,this.sendMIDIMessages&&this.sendMIDIMessage([k.pitchBend|t,e,A])}function Ps(){if(this.sendMIDIMessages){this.sendMIDIMessage([k.reset]);for(let t=0;tthis.duration||A<0){this._skipToFirstNoteOn?this.setTimeTicks(this.midiData.firstNoteOn-1):this.setTimeTicks(0);return}if(this._skipToFirstNoteOn&&AKs?440*Math.pow(2,(t-6900)/1200):Ft[~~t-je]}var Gt=-1660,Mo=1600,Rt=new Float32Array((Mo-Gt)*100+1);for(let t=0;t.5?1:0,s?e*2-1:e;case cA.concave:return s?(e=e*2-1,e<0?1-Ee[~~(e*-gA)]-1:Ee[~~e*gA]):Ee[~~(e*gA)];case cA.convex:return s?(e=e*2-1,e<0?1-Be[~~(e*-gA)]-1:Be[~~(e*gA)]):Be[~~(e*gA)]}}var xt=1,Mt=new Float32Array(1e3);for(let t=0;t=e.loopEnd;)s-=o;let C=~~s,c=C+1;for(;c>=e.loopEnd;)c-=o;let h=s-C,d=n[c],Q=n[C];A[g]=Q+(d-Q)*h,s+=e.playbackStep*t.currentTuningCalculated}}else{e.end>=n.length&&(e.end=n.length-1);for(let o=0;o=e.end){t.finished=!0;return}let c=s-g,h=n[C],d=n[g];A[o]=d+(h-d)*c,s+=e.playbackStep*t.currentTuningCalculated}}t.sample.cursor=s}function Os(t,A){let e=t.sample,s=e.cursor,n=e.loopEnd-e.loopStart,o=e.sampleData;if(t.sample.isLooping)for(let g=0;g=e.loopEnd;)s-=n;let C=~~s+1;for(;C>=e.loopEnd;)C-=n;A[g]=o[C],s+=e.playbackStep*t.currentTuningCalculated}else{e.end>=o.length&&(e.end=o.length-1);for(let g=0;g=e.end){t.finished=!0;return}A[g]=o[C],s+=e.playbackStep*t.currentTuningCalculated}}e.cursor=s}function Zs(t,A,e,s,n,o,g,C,c){if(!isNaN(e[0])){if(g>0){let h=o[0],d=o[1];g=Math.min(g,1e3);let Q=g/1300,l=t*Q,u=A*Q;for(let D=0;D0){let h=C[0],d=C[1];c=Math.min(c,1e3);let Q=c/1300,l=t*Q,u=A*Q;for(let D=0;D0)for(let h=0;h0)for(let h=0;h13499&&A.filter.reasonanceCb===0)return;let n=A.filter;(n.cutoffCents!==s||n.reasonanceCb!==A.modulatedGenerators[I.initialFilterQ])&&(n.cutoffCents=s,n.reasonanceCb=A.modulatedGenerators[I.initialFilterQ],t.calculateCoefficients(A));for(let o=0;o.45*sampleRate&&(e.cutoffHz=.45*sampleRate);let s=e.reasonanceCb/10-3.01;e.reasonanceGain=KA(-1*s);let n=1/Math.sqrt(e.reasonanceGain),o=2*Math.PI*e.cutoffHz/sampleRate,g=Math.cos(o),C=Math.sin(o)/(2*e.reasonanceGain),c=(1-g)*n,h=c/2,d=h,Q=1+C,l=-2*g,u=1-C;e.a0=h/Q,e.a1=c/Q,e.a2=d/Q,e.a3=l/Q,e.a4=u/Q}};var Xs=.001,YA=100,Nt=90,No=.005,LA=class t{constructor(A,e){this.sampleRate=A,this.canEndOnSilentSustain=e/10>=Nt}currentSampleTime=0;sampleRate;currentAttenuationDb=YA;state=0;releaseStartDb=YA;releaseStartTimeSamples=0;currentReleaseGain=1;attackDuration=0;decayDuration=0;releaseDuration=0;attenuation=0;attenuationTarget=0;sustainDbRelative=0;delayEnd=0;attackEnd=0;holdEnd=0;decayEnd=0;static startRelease(A){A.volumeEnvelope.releaseStartTimeSamples=A.volumeEnvelope.currentSampleTime,A.volumeEnvelope.currentReleaseGain=KA(A.volumeEnvelope.currentAttenuationDb),t.recalculate(A)}static recalculate(A){let e=A.volumeEnvelope,s=h=>Math.max(0,Math.floor(TA(h)*e.sampleRate));e.attenuationTarget=Math.max(0,Math.min(A.modulatedGenerators[I.initialAttenuation],1440))/10,e.sustainDbRelative=Math.min(YA,A.modulatedGenerators[I.sustainVolEnv]/10);let n=Math.min(YA,e.sustainDbRelative);e.attackDuration=s(A.modulatedGenerators[I.attackVolEnv]);let o=A.modulatedGenerators[I.decayVolEnv],g=(60-A.targetKey)*A.modulatedGenerators[I.keyNumToVolEnvDecay],C=n/YA;e.decayDuration=s(o+g)*C,e.releaseDuration=s(A.modulatedGenerators[I.releaseVolEnv]),e.delayEnd=s(A.modulatedGenerators[I.delayVolEnv]),e.attackEnd=e.attackDuration+e.delayEnd;let c=(60-A.targetKey)*A.modulatedGenerators[I.keyNumToVolEnvHold];if(e.holdEnd=s(A.modulatedGenerators[I.holdVolEnv]+c)+e.attackEnd,e.decayEnd=e.decayDuration+e.holdEnd,e.state===0&&e.attackEnd===0&&(e.state=2),A.isInRelease){let h=Math.max(0,Math.min(YA,e.sustainDbRelative)),d=h/YA;switch(e.decayDuration=s(o+g)*d,e.state){case 0:e.releaseStartDb=YA;break;case 1:let Q=1-(e.attackEnd-e.releaseStartTimeSamples)/e.attackDuration;e.releaseStartDb=20*Math.log10(Q)*-1;break;case 2:e.releaseStartDb=0;break;case 3:e.releaseStartDb=(1-(e.decayEnd-e.releaseStartTimeSamples)/e.decayDuration)*h;break;case 4:e.releaseStartDb=h;break}e.releaseStartDb=Math.max(0,Math.min(e.releaseStartDb,YA)),e.releaseStartDb>=Nt&&(A.finished=!0),e.currentReleaseGain=KA(e.releaseStartDb)}}static apply(A,e,s,n){let o=A.volumeEnvelope,g=s/10,C=n;if(A.isInRelease){let h=o.currentSampleTime-o.releaseStartTimeSamples;if(h>=o.releaseDuration){for(let Q=0;Q=e.length)return;o.state++;case 1:for(;o.currentSampleTime=e.length)return}o.state++;case 2:for(;o.currentSampleTime=e.length)return;o.state++;case 3:for(;o.currentSampleTime=e.length)return;o.state++;case 4:for(o.canEndOnSilentSustain&&o.sustainDbRelative>=Nt&&(A.finished=!0);;)if(o.attenuation+=(o.attenuationTarget-o.attenuation)*C,e[c]*=KA(o.sustainDbRelative+g+o.attenuation),o.currentAttenuationDb=o.sustainDbRelative,o.currentSampleTime++,++c>=e.length)return}}};var Ws=Math.PI/2,_s=.01;function zs(t,A,e,s,n,o){if(A.isInRelease||currentTime>=A.releaseStartTime&&(A.isInRelease=!0,LA.startRelease(A),HA.startRelease(A)),A.modulatedGenerators[I.initialAttenuation]>2500){A.isInRelease&&(A.finished=!0);return}let g=A.targetKey,C=A.modulatedGenerators[I.fineTune]+t.customControllers[IA.channelTuning]+t.customControllers[IA.channelTransposeFine]+t.customControllers[IA.masterTuning]+t.channelOctaveTuning[A.midiNote%12]+t.keyCentTuning[A.midiNote],c=A.modulatedGenerators[I.coarseTune]+t.customControllers[IA.channelTuningSemitones],h=this.tunings[t.preset.program]?.[g];h?.midiNote>=0&&(g=h.midiNote,C+=h.centTuning),C+=(g-A.sample.rootKey)*A.modulatedGenerators[I.scaleTuning];let d=A.modulatedGenerators[I.vibLfoToPitch];if(d!==0){let Z=A.startTime+TA(A.modulatedGenerators[I.delayVibLFO]),CA=we(A.modulatedGenerators[I.freqVibLFO]),oA=$e(Z,CA,currentTime);C+=oA*(d*t.customControllers[IA.modulationMultiplier])}let Q=A.modulatedGenerators[I.initialFilterFc],l=A.modulatedGenerators[I.modLfoToPitch],u=A.modulatedGenerators[I.modLfoToVolume],D=A.modulatedGenerators[I.modLfoToFilterFc],S=0;if(l+D+u!==0){let Z=A.startTime+TA(A.modulatedGenerators[I.delayModLFO]),CA=we(A.modulatedGenerators[I.freqModLFO]),oA=$e(Z,CA,currentTime);C+=oA*(l*t.customControllers[IA.modulationMultiplier]),S=-oA*u,Q+=oA*D}if(t.channelVibrato.depth>0){let Z=$e(A.startTime+t.channelVibrato.delay,t.channelVibrato.rate,currentTime);Z&&(C+=Z*t.channelVibrato.depth)}let w=A.modulatedGenerators[I.modEnvToPitch],F=A.modulatedGenerators[I.modEnvToFilterFc],v=HA.getValue(A,currentTime);Q+=v*F,C+=v*w;let M=~~(C+c*100);M!==A.currentTuningCents&&(A.currentTuningCents=M,A.currentTuningCalculated=Math.pow(2,M/1200));let K=(Math.max(-500,Math.min(500,A.modulatedGenerators[I.pan]))+500)/1e3,_=new Float32Array(e.length);switch(this.interpolationType){case Fe.linear:default:Vs(A,_);break;case Fe.nearestNeighbor:Os(A,_);break}he.apply(A,_,Q),LA.apply(A,_,S,this.volumeEnvelopeSmoothingFactor),A.currentPan+=(K-A.currentPan)*this.panSmoothingFactor;let a=Math.cos(Ws*A.currentPan)*this.panLeft,nA=Math.sin(Ws*A.currentPan)*this.panRight,j=this.oneOutputMode?0:A.modulatedGenerators[I.reverbEffectsSend],Y=this.oneOutputMode?0:A.modulatedGenerators[I.chorusEffectsSend];Zs(a,nA,_,e,s,n,j,o,Y)}function bo(t,A){let e=0;return t.drumChannel&&(e+=5),A.isInRelease&&(e-=5),e+=A.velocity/25,e-=A.volumeEnvelope.state,A.isInRelease&&(e-=5),e-=A.volumeEnvelope.currentAttenuationDb/50,e}function js(t){let A=[];for(let s of this.workletProcessorChannels)for(let n of s.voices)if(!n.finished){let o=bo(s,n);A.push({channel:s,voice:n,priority:o})}A.sort((s,n)=>s.priority-n.priority);let e=A.slice(0,t);for(let{channel:s,voice:n}of e){let o=s.voices.indexOf(n);o>-1&&s.voices.splice(o,1)}}function $s(t){t.releaseStartTime=currentTime,t.releaseStartTime-t.startTimeen=t);var Lo=function(t){var A,e,s,n,o,g,C,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",h="",d=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do n=c.indexOf(t.charAt(d++)),o=c.indexOf(t.charAt(d++)),g=c.indexOf(t.charAt(d++)),C=c.indexOf(t.charAt(d++)),A=n<<2|o>>4,e=(15&o)<<4|g>>2,s=(3&g)<<6|C,h+=String.fromCharCode(A),g!==64&&(h+=String.fromCharCode(e)),C!==64&&(h+=String.fromCharCode(s));while(d1&&(a.thisProgram=process.argv[1].replace(/\\/g,"/")),a.arguments=process.argv.slice(2),typeof module<"u",process.on("uncaughtException",function(i){if(!(i instanceof pe))throw i}),process.on("unhandledRejection",function(i,E){process.exit(1)}),a.quit=function(i){process.exit(i)},a.inspect=function(){return"[Emscripten Module object]"}):CA?(typeof read<"u"&&(a.read=function(E){return read(E)}),a.readBinary=function(E){var B;return typeof readbuffer=="function"?new Uint8Array(readbuffer(E)):(_A(typeof(B=read(E,"binary"))=="object"),B)},typeof scriptArgs<"u"?a.arguments=scriptArgs:typeof arguments<"u"&&(a.arguments=arguments),typeof quit=="function"&&(a.quit=function(i){quit(i)})):(j||Y)&&(j?document.currentScript&&(oA=document.currentScript.src):oA=self.location.href,oA=oA.indexOf("blob:")!==0?oA.split("/").slice(0,-1).join("/")+"/":"",a.read=function(E){var B=new XMLHttpRequest;return B.open("GET",E,!1),B.send(null),B.responseText},Y&&(a.readBinary=function(E){var B=new XMLHttpRequest;return B.open("GET",E,!1),B.responseType="arraybuffer",B.send(null),new Uint8Array(B.response)}),a.readAsync=function(E,B,f){var R=new XMLHttpRequest;R.open("GET",E,!0),R.responseType="arraybuffer",R.onload=function(){if(R.status==200||R.status==0&&R.response){B(R.response);return}f()},R.onerror=f,R.send(null)},a.setWindowTitle=function(i){document.title=i});var Me=a.print||(typeof console<"u"?console.log.bind(console):typeof print<"u"?print:null),RA=a.printErr||(typeof printErr<"u"?printErr:typeof console<"u"&&console.warn.bind(console)||Me);for(t in nA)nA.hasOwnProperty(t)&&(a[t]=nA[t]);function Ne(i){var E=u;return u=u+i+15&-16,E}function qt(i){var E=c[M>>2],B=E+i+15&-16;return c[M>>2]=B,B>=BA&&!jt()?(c[M>>2]=E,0):E}function Pt(i,E){return E||(E=16),i=Math.ceil(i/E)*E}function Qo(i){switch(i){case"i1":case"i8":return 1;case"i16":return 2;case"i32":case"float":return 4;case"i64":case"double":return 8;default:if(i[i.length-1]==="*")return 4;if(i[0]!=="i")return 0;var E=parseInt(i.substr(1));return _A(E%8==0),E/8}}function de(i){de.shown||(de.shown={}),de.shown[i]||(de.shown[i]=1,RA(i))}nA=void 0;var co={"f64-rem":function(i,E){return i%E},debugger:function(){}},rt=[];function vo(i,E){for(var B=0,f=B;f>>0)+4294967296*+(E>>>0):+(i>>>0)+4294967296*+(0|E)}function at(i,E,B){return B&&B.length?a["dynCall_"+i].apply(null,[E].concat(B)):a["dynCall_"+i].call(null,E)}var be=0,Kt=0;function _A(i,E){i||OA("Assertion failed: "+E)}function Vt(i){var E=a["_"+i];return _A(E,"Cannot call unknown function "+i+", make sure it is exported"),E}var Ot={stackSave:function(){ct()},stackRestore:function(){Qt()},arrayToC:function(i){var E,B,f=Je(i.length);return E=i,B=f,n.set(E,B),f},stringToC:function(i){var E=0;if(i!=null&&i!==0){var B=(i.length<<2)+1;E=Je(B),Wt(i,E,B)}return E}},lo={string:Ot.stringToC,array:Ot.arrayToC};function Zt(i,E,B,f,R){var q=Vt(i),W=[],x=0;if(f)for(var hA=0;hA>0]=E;break;case"i16":g[i>>1]=E;break;case"i32":c[i>>2]=E;break;case"i64":tempI64=[E>>>0,+yo(tempDouble=E)>=1?tempDouble>0?(0|ko(+ss(tempDouble/4294967296),4294967295))>>>0:~~+Do((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0],c[i>>2]=tempI64[0],c[i+4>>2]=tempI64[1];break;case"float":d[i>>2]=E;break;case"double":Q[i>>3]=E;break;default:OA("invalid type for setValue: "+B)}}function Vo(i,E,B){switch((E=E||"i8").charAt(E.length-1)==="*"&&(E="i32"),E){case"i1":case"i8":return n[i>>0];case"i16":return g[i>>1];case"i32":case"i64":return c[i>>2];case"float":return d[i>>2];case"double":return Q[i>>3];default:OA("invalid type for getValue: "+E)}return null}function Oo(i,E,B,f){typeof i=="number"?(q=!0,W=i):(q=!1,W=i.length);var R=typeof E=="string"?E:null;if(x=B==4?f:[typeof Ye=="function"?Ye:Ne,Je,Ne,qt][B===void 0?2:B](Math.max(W,R?1:E.length)),q){for(f=x,_A((3&x)==0),hA=x+(-4&W);f>2]=0;for(hA=x+W;f>0]=0;return x}if(R==="i8")return i.subarray||i.slice?o.set(i,x):o.set(new Uint8Array(i),x),x;for(var q,W,x,hA,rA,iA,tA,J=0;J>0],(f!=0||E)&&(W++,!E||W!=E););E||(E=W);var x="";if(q<128){for(;E>0;)R=String.fromCharCode.apply(String,o.subarray(i,i+Math.min(E,1024))),x=x?x+R:R,i+=1024,E-=1024;return x}return B=i,function(rA,iA){for(var tA=iA;rA[tA];)++tA;if(tA-iA>16&&rA.subarray&&Xt)return Xt.decode(rA.subarray(iA,tA));for(var J,mA,GA,xA,MA,ee,NA="";;){if(!(J=rA[iA++]))return NA;if(!(128&J)){NA+=String.fromCharCode(J);continue}if(mA=63&rA[iA++],(224&J)==192){NA+=String.fromCharCode((31&J)<<6|mA);continue}if(GA=63&rA[iA++],(240&J)==224?J=(15&J)<<12|mA<<6|GA:(xA=63&rA[iA++],(248&J)==240?J=(7&J)<<18|mA<<12|GA<<6|xA:(MA=63&rA[iA++],J=(252&J)==248?(3&J)<<24|mA<<18|GA<<12|xA<<6|MA:(1&J)<<30|mA<<24|GA<<18|xA<<12|MA<<6|(ee=63&rA[iA++]))),J<65536)NA+=String.fromCharCode(J);else{var Se=J-65536;NA+=String.fromCharCode(55296|Se>>10,56320|1023&Se)}}}(o,B)}function Xo(i){for(var E="";;){var B=n[i++>>0];if(!B)return E;E+=String.fromCharCode(B)}}function Wo(i,E){return function(f,R,q){for(var W=0;W>0]=f.charCodeAt(W);q||(n[R>>0]=0)}(i,E,!1)}var Xt=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function Ue(i,E,B,f){if(!(f>0))return 0;for(var R=B,q=B+f-1,W=0;W=55296&&x<=57343&&(x=65536+((1023&x)<<10)|1023&i.charCodeAt(++W)),x<=127){if(B>=q)break;E[B++]=x}else if(x<=2047){if(B+1>=q)break;E[B++]=192|x>>6,E[B++]=128|63&x}else if(x<=65535){if(B+2>=q)break;E[B++]=224|x>>12,E[B++]=128|x>>6&63,E[B++]=128|63&x}else if(x<=2097151){if(B+3>=q)break;E[B++]=240|x>>18,E[B++]=128|x>>12&63,E[B++]=128|x>>6&63,E[B++]=128|63&x}else if(x<=67108863){if(B+4>=q)break;E[B++]=248|x>>24,E[B++]=128|x>>18&63,E[B++]=128|x>>12&63,E[B++]=128|x>>6&63,E[B++]=128|63&x}else{if(B+5>=q)break;E[B++]=252|x>>30,E[B++]=128|x>>24&63,E[B++]=128|x>>18&63,E[B++]=128|x>>12&63,E[B++]=128|x>>6&63,E[B++]=128|63&x}}return E[B]=0,B-R}function Wt(i,E,B){return Ue(i,o,E,B)}function Te(i){for(var E=0,B=0;B=55296&&f<=57343&&(f=65536+((1023&f)<<10)|1023&i.charCodeAt(++B)),f<=127?++E:f<=2047?E+=2:f<=65535?E+=3:f<=2097151?E+=4:f<=67108863?E+=5:E+=6}return E}var _t=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function _o(i){for(var E=i,B=E>>1;g[B];)++B;if((E=B<<1)-i>32&&_t)return _t.decode(o.subarray(i,E));for(var f=0,R="";;){var q=g[i+2*f>>1];if(q==0)return R;++f,R+=String.fromCharCode(q)}}function zo(i,E,B){if(B===void 0&&(B=2147483647),B<2)return 0;for(var f=E,R=(B-=2)<2*i.length?B/2:i.length,q=0;q>1]=W,E+=2}return g[E>>1]=0,E-f}function jo(i){return 2*i.length}function $o(i){for(var E=0,B="";;){var f=c[i+4*E>>2];if(f==0)return B;if(++E,f>=65536){var R=f-65536;B+=String.fromCharCode(55296|R>>10,56320|1023&R)}else B+=String.fromCharCode(f)}}function Ar(i,E,B){if(B===void 0&&(B=2147483647),B<4)return 0;for(var f=E,R=f+B-4,q=0;q=55296&&W<=57343&&(W=65536+((1023&W)<<10)|1023&i.charCodeAt(++q)),c[E>>2]=W,(E+=4)+4>R)break}return c[E>>2]=0,E-f}function er(i){for(var E=0,B=0;B=55296&&f<=57343&&++B,E+=4}return E}function tr(i){var E=Te(i)+1,B=Ye(E);return B&&Ue(i,n,B,E),B}function sr(i){var E=Te(i)+1,B=Je(E);return Ue(i,n,B,E),B}function nr(i){return i}function or(){var i,E=function(){var f=Error();if(!f.stack){try{throw Error(0)}catch(R){f=R}if(!f.stack)return"(no stack trace available)"}return f.stack.toString()}();return a.extraStackTrace&&(E+=` +`;this.copyright+=fA,m(`%cDecoded Roland SC message! %c${fA}`,r.recognized,r.value)}break;default:if((a&240)===k.controllerChange)switch(Y[0]){case 2:case 116:d=K;break;case 4:case 117:Q===null?Q=K:Q=0;break;case 0:C&&Y[1]!==0&&Y[1]!==127&&(m("%cDLS RMIDI with offset 1 detected!",r.recognized),this.bankOffset=1)}}}this.tracks.push(w),this.usedChannelsOnTrack.push(v),m(`%cParsed %c${this.tracks.length}%c / %c${this.tracksAmount}`,r.info,r.value,r.info,r.value)}m("%cAll tracks parsed correctly!",r.recognized),SA("%cCorrecting loops, ports and detecting notes...",r.info);let u=[];for(let S of this.tracks){let w=S.find(F=>(F.messageStatusByte&240)===k.noteOn);w&&u.push(w.ticks)}this.firstNoteOn=Math.min(...u),m(`%cFirst note-on detected at: %c${this.firstNoteOn}%c ticks!`,r.info,r.recognized,r.info),d!==null&&Q===null?(d=this.firstNoteOn,Q=this.lastVoiceEventTick):(d===null&&(d=this.firstNoteOn),(Q===null||Q===0)&&(Q=this.lastVoiceEventTick)),this.loop={start:d,end:Q},m(`%cLoop points: start: %c${this.loop.start}%c end: %c${this.loop.end}`,r.info,r.recognized,r.info,r.recognized);let D=0;for(let S of this.midiPorts)if(S!==-1){D=S;break}if(this.midiPorts=this.midiPorts.map(S=>S===-1?D:S),this.midiPortChannelOffsets.length===0&&(this.midiPortChannelOffsets=[0]),this.midiPortChannelOffsets.length<2?m("%cNo additional MIDI Ports detected.",r.info):m("%cMIDI Ports detected!",r.recognized),!g)if(this.tracks.length>1){if(this.tracks[0].find(S=>S.messageStatusByte>=k.noteOn&&S.messageStatusBytew.messageStatusByte===k.trackName);S&&(this.rawMidiName=S.messageData,this.midiName=V(S.messageData,S.messageData.length,void 0,!1))}}else{let S=this.tracks[0].find(w=>w.messageStatusByte===k.trackName);S&&(this.rawMidiName=S.messageData,this.midiName=V(S.messageData,S.messageData.length,void 0,!1))}if(this.fileName=e,this.midiName=this.midiName.trim(),this.midiName.length===0){m("%cNo name detected. Using the alt name!",r.info),this.midiName=Is(e),this.rawMidiName=new Uint8Array(this.midiName.length);for(let S=0;Sl>Q?l:Q),s=[];for(let Q=0;Q{g[D]>=u.length||u[g[D]].ticks0;){let Q=c(),l=t.tracks[Q];if(g[Q]>=l.length){C--;continue}let u=l[g[Q]];if(g[Q]++,u.messageStatusByte===k.midiPort){h[Q]=u.messageData[0];continue}let D=u.messageStatusByte&240;if(D!==k.noteOn&&D!==k.controllerChange&&D!==k.programChange&&D!==k.systemExclusive)continue;let S=(u.messageStatusByte&15)+t.midiPortChannelOffsets[h[Q]]||0,w=s[S];switch(D){case k.programChange:w.program=u.messageData[0],n(w);break;case k.controllerChange:if(u.messageData[0]!==p.bankSelect||d==="gs"&&w.drums)continue;let F=u.messageData[1],v=Math.max(0,F-t.bankOffset);if(d==="xg"){let _=F===120||F===126||F===127;_!==w.drums?(w.drums=_,w.bank=w.drums?128:v,n(w)):w.bank=w.drums?128:v;continue}s[S].bank=v;break;case k.noteOn:if(u.messageData[1]===0)continue;n(w),o[w.string].add(`${u.messageData[0]}-${u.messageData[1]}`);break;case k.systemExclusive:if(u.messageData[0]!==65||u.messageData[2]!==66||u.messageData[3]!==18||u.messageData[4]!==64||!(u.messageData[5]&16)||u.messageData[6]!==21){u.messageData[0]===67&&u.messageData[2]===76&&u.messageData[5]===126&&u.messageData[6]===0&&(d="xg");continue}let M=[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][u.messageData[5]&15]+t.midiPortChannelOffsets[h[Q]],K=!!(u.messageData[7]>0&&u.messageData[5]>>4);w=s[M],w.drums=K,w.bank=K?128:0,n(w);break}}for(let Q of Object.keys(o))o[Q].size===0&&(m(`%cDetected change but no keys for %c${Q}`,r.info,r.value),delete o[Q]);return X(),o}function Fs(t,A){this.midiPortChannelOffset===0&&(this.midiPortChannelOffset+=16,this.midiPortChannelOffsets[A]=0),this.midiPortChannelOffsets[A]===void 0&&(this.synth.workletProcessorChannels.length{this.assignMIDIPort(e,A)}),this.duration=this.midiData.duration,this.firstNoteTime=Ce(this.midiData.firstNoteOn,this.midiData),m(`%cTotal song time: ${ft(Math.ceil(this.duration)).time}`,r.recognized),this.post(wA.songChange,[new Ve(this.midiData),this.songIndex]),this.synth.resetAllControllers(),this.duration<=1&&(b(`%cVery short song: (${ft(Math.round(this.duration)).time}). Disabling loop!`,r.warn),this.loop=!1),this.play(!0)}function Gs(t){this.songs=t.reduce((A,e)=>{if(e.duration)return A.push(e),A;try{A.push(new ze(e.binary,e.altName||""))}catch(s){return this.post(wA.midiError,s.message),A}return A},[]),!(this.songs.length<1)&&(this.songIndex=0,this.songs.length>1&&(this.loop=!1),this.loadNewSequence(this.songs[this.songIndex]))}function xs(){if(this.songs.length===1){this.currentTime=0;return}this.songIndex++,this.songIndex%=this.songs.length,this.loadNewSequence(this.songs[this.songIndex])}function Ms(){if(this.songs.length===1){this.currentTime=0;return}this.songIndex--,this.songIndex<0&&(this.songIndex=this.songs.length-1),this.loadNewSequence(this.songs[this.songIndex])}var PA=new Int16Array(127);PA[p.mainVolume]=100;PA[p.expressionController]=127;PA[p.pan]=64;PA[p.releaseTime]=64;PA[p.brightness]=64;PA[p.effects1Depth]=0;function Ns(t,A=void 0){this.oneTickToSeconds=60/(120*this.midiData.timeDivision),this.synth.resetAllControllers(),this.sendMIDIReset(),this._resetTimers();let e=this.synth.workletProcessorChannels.length,s=Array(e).fill(8192),n=[];for(let C=0;CC===p.dataDecrement||C===p.dataIncrement||C===p.dataEntryMsb||C===p.dataDecrement||C===p.lsbForControl6DataEntry||C===p.RPNLsb||C===p.RPNMsb||C===p.NRPNLsb||C===p.NRPNMsb||C===p.bankSelect||C===p.lsbForControl0BankSelect||C===p.resetAllControllers,g=[];for(let C=0;C=A)break}else if(this.playedTime>=t)break;let h=ke(c.messageStatusByte),d=h.channel+(this.midiPortChannelOffsets[this.midiPorts[C]]||0);switch(h.status){case k.noteOn:case k.noteOff:case k.keySignature:break;case k.pitchBend:s[d]=c.messageData[1]<<7|c.messageData[0];break;case k.programChange:let l=n[d];l.program=c.messageData[0],l.actualBank=l.bank;break;case k.controllerChange:let u=c.messageData[0];if(o(u)){let D=c.messageData[1];if(u===p.bankSelect){n[d].bank=D;break}this.sendMIDIMessages?this.sendMIDICC(d,u,D):this.synth.controllerChange(d,u,D)}else g[d]===void 0&&(g[d]=Array.from(PA)),g[d][u]=c.messageData[1];break;default:this._processEvent(c,C);break}this.eventIndex[C]++,C=this._findFirstEventIndex();let Q=this.tracks[C][this.eventIndex[C]];if(Q===void 0)return this.stop(),!1;this.playedTime+=this.oneTickToSeconds*(Q.ticks-c.ticks)}if(this.sendMIDIMessages){for(let C=0;C>7,s[C]&127),g[C]!==void 0&&g[C].forEach((c,h)=>{c!==PA[h]&&!o(h)&&this.sendMIDICC(C,h,c)}),n[C].program>=0&&n[C].actualBank>=0){let c=n[C].actualBank;this.sendMIDICC(C,p.bankSelect,c),this.sendMIDIProgramChange(C,n[C].program)}}else for(let C=0;C>7,s[C]&127),g[C]!==void 0&&g[C].forEach((c,h)=>{c!==PA[h]&&!o(h)&&this.synth.controllerChange(C,h,c)}),n[C].program>=0&&n[C].actualBank>=0){let c=n[C].actualBank;this.synth.controllerChange(C,p.bankSelect,c),this.synth.programChange(C,n[C].program)}return!0}function bs(t=!1){if(this.midiData!==void 0){if(t){this.currentTime=0;return}if(this.currentTime>=this.duration){this.currentTime=0;return}this.paused&&(this._recalculateStartTime(this.pausedTime),this.pausedTime=void 0),this.sendMIDIMessages||this.playingNotes.forEach(A=>{this.synth.noteOn(A.channel,A.midiNote,A.velocity,!1,!0)}),this.setProcessHandler()}}function Ls(t){this.stop(),this.playingNotes=[],this.pausedTime=void 0,this.post(wA.timeChange,currentTime-Ce(t,this.midiData));let A=this._playTo(0,t);this._recalculateStartTime(this.playedTime),A&&this.play()}function Us(t){this.absoluteStartTime=currentTime-t/this._playbackRate}function Ts(t,A){switch(t){default:break;case bA.loadNewSongList:this.loadNewSongList(A);break;case bA.pause:this.pause();break;case bA.play:this.play(A);break;case bA.stop:this.stop();break;case bA.setTime:this.currentTime=A;break;case bA.changeMIDIMessageSending:this.sendMIDIMessages=A;break;case bA.setPlaybackRate:this.playbackRate=A;break;case bA.setLoop:this.loop=A;break;case bA.changeSong:A?this.nextSong():this.previousSong();break;case bA.getMIDI:this.post(wA.getMIDI,this.midiData);break;case bA.setSkipToFirstNote:this._skipToFirstNoteOn=A;break}}function Hs(t,A=void 0){this.synth.enableEventSystem&&this.synth.post({messageType:pA.sequencerSpecific,messageData:{messageType:t,messageData:A}})}function Ys(t){this.post(wA.midiEvent,t)}function Js(t,A,e){t%=16,this.sendMIDIMessages&&this.sendMIDIMessage([k.controllerChange|t,A,e])}function vs(t,A){t%=16,this.sendMIDIMessages&&this.sendMIDIMessage([k.programChange|t,A])}function qs(t,A,e){t%=16,this.sendMIDIMessages&&this.sendMIDIMessage([k.pitchBend|t,e,A])}function Ps(){if(this.sendMIDIMessages){this.sendMIDIMessage([k.reset]);for(let t=0;tthis.duration||A<0){this._skipToFirstNoteOn?this.setTimeTicks(this.midiData.firstNoteOn-1):this.setTimeTicks(0);return}if(this._skipToFirstNoteOn&&AKs?440*Math.pow(2,(t-6900)/1200):Ft[~~t-je]}var Gt=-1660,Mo=1600,Rt=new Float32Array((Mo-Gt)*100+1);for(let t=0;t.5?1:0,s?e*2-1:e;case cA.concave:return s?(e=e*2-1,e<0?1-Ee[~~(e*-gA)]-1:Ee[~~e*gA]):Ee[~~(e*gA)];case cA.convex:return s?(e=e*2-1,e<0?1-Be[~~(e*-gA)]-1:Be[~~(e*gA)]):Be[~~(e*gA)]}}var xt=1,Mt=new Float32Array(1e3);for(let t=0;t=e.loopEnd;)s-=o;let C=~~s,c=C+1;for(;c>=e.loopEnd;)c-=o;let h=s-C,d=n[c],Q=n[C];A[g]=Q+(d-Q)*h,s+=e.playbackStep*t.currentTuningCalculated}}else{e.end>=n.length&&(e.end=n.length-1);for(let o=0;o=e.end){t.finished=!0;return}let c=s-g,h=n[C],d=n[g];A[o]=d+(h-d)*c,s+=e.playbackStep*t.currentTuningCalculated}}t.sample.cursor=s}function Os(t,A){let e=t.sample,s=e.cursor,n=e.loopEnd-e.loopStart,o=e.sampleData;if(t.sample.isLooping)for(let g=0;g=e.loopEnd;)s-=n;let C=~~s+1;for(;C>=e.loopEnd;)C-=n;A[g]=o[C],s+=e.playbackStep*t.currentTuningCalculated}else{e.end>=o.length&&(e.end=o.length-1);for(let g=0;g=e.end){t.finished=!0;return}A[g]=o[C],s+=e.playbackStep*t.currentTuningCalculated}}e.cursor=s}function Zs(t,A,e,s,n,o,g,C,c){if(!isNaN(e[0])){if(g>0){let h=o[0],d=o[1];g=Math.min(g,1e3);let Q=g/1300,l=t*Q,u=A*Q;for(let D=0;D0){let h=C[0],d=C[1];c=Math.min(c,1e3);let Q=c/1300,l=t*Q,u=A*Q;for(let D=0;D0)for(let h=0;h0)for(let h=0;h13499&&A.filter.reasonanceCb===0)return;let n=A.filter;(n.cutoffCents!==s||n.reasonanceCb!==A.modulatedGenerators[I.initialFilterQ])&&(n.cutoffCents=s,n.reasonanceCb=A.modulatedGenerators[I.initialFilterQ],t.calculateCoefficients(A));for(let o=0;o.45*sampleRate&&(e.cutoffHz=.45*sampleRate);let s=e.reasonanceCb/10-3.01;e.reasonanceGain=KA(-1*s);let n=1/Math.sqrt(e.reasonanceGain),o=2*Math.PI*e.cutoffHz/sampleRate,g=Math.cos(o),C=Math.sin(o)/(2*e.reasonanceGain),c=(1-g)*n,h=c/2,d=h,Q=1+C,l=-2*g,u=1-C;e.a0=h/Q,e.a1=c/Q,e.a2=d/Q,e.a3=l/Q,e.a4=u/Q}};var Xs=.001,YA=100,Nt=90,No=15e-6,LA=class t{constructor(A,e){this.sampleRate=A,this.canEndOnSilentSustain=e/10>=Nt}currentSampleTime=0;sampleRate;currentAttenuationDb=YA;state=0;releaseStartDb=YA;releaseStartTimeSamples=0;currentReleaseGain=1;attackDuration=0;decayDuration=0;releaseDuration=0;attenuation=0;attenuationTarget=0;sustainDbRelative=0;delayEnd=0;attackEnd=0;holdEnd=0;decayEnd=0;static startRelease(A){A.volumeEnvelope.releaseStartTimeSamples=A.volumeEnvelope.currentSampleTime,A.volumeEnvelope.currentReleaseGain=KA(A.volumeEnvelope.currentAttenuationDb),t.recalculate(A)}static recalculate(A){let e=A.volumeEnvelope,s=h=>Math.max(0,Math.floor(TA(h)*e.sampleRate));e.attenuationTarget=Math.max(0,Math.min(A.modulatedGenerators[I.initialAttenuation],1440))/10,e.sustainDbRelative=Math.min(YA,A.modulatedGenerators[I.sustainVolEnv]/10);let n=Math.min(YA,e.sustainDbRelative);e.attackDuration=s(A.modulatedGenerators[I.attackVolEnv]);let o=A.modulatedGenerators[I.decayVolEnv],g=(60-A.targetKey)*A.modulatedGenerators[I.keyNumToVolEnvDecay],C=n/YA;e.decayDuration=s(o+g)*C,e.releaseDuration=s(A.modulatedGenerators[I.releaseVolEnv]),e.delayEnd=s(A.modulatedGenerators[I.delayVolEnv]),e.attackEnd=e.attackDuration+e.delayEnd;let c=(60-A.targetKey)*A.modulatedGenerators[I.keyNumToVolEnvHold];if(e.holdEnd=s(A.modulatedGenerators[I.holdVolEnv]+c)+e.attackEnd,e.decayEnd=e.decayDuration+e.holdEnd,e.state===0&&e.attackEnd===0&&(e.state=2),A.isInRelease){let h=Math.max(0,Math.min(YA,e.sustainDbRelative)),d=h/YA;switch(e.decayDuration=s(o+g)*d,e.state){case 0:e.releaseStartDb=YA;break;case 1:let Q=1-(e.attackEnd-e.releaseStartTimeSamples)/e.attackDuration;e.releaseStartDb=20*Math.log10(Q)*-1;break;case 2:e.releaseStartDb=0;break;case 3:e.releaseStartDb=(1-(e.decayEnd-e.releaseStartTimeSamples)/e.decayDuration)*h;break;case 4:e.releaseStartDb=h;break}e.releaseStartDb=Math.max(0,Math.min(e.releaseStartDb,YA)),e.releaseStartDb>=Nt&&(A.finished=!0),e.currentReleaseGain=KA(e.releaseStartDb)}}static apply(A,e,s,n){let o=A.volumeEnvelope,g=s/10,C=n;if(A.isInRelease){let h=o.currentSampleTime-o.releaseStartTimeSamples;if(h>=o.releaseDuration){for(let Q=0;Q=e.length)return;o.state++;case 1:for(;o.currentSampleTime=e.length)return}o.state++;case 2:for(;o.currentSampleTime=e.length)return;o.state++;case 3:for(;o.currentSampleTime=e.length)return;o.state++;case 4:for(o.canEndOnSilentSustain&&o.sustainDbRelative>=Nt&&(A.finished=!0);;)if(o.attenuation+=(o.attenuationTarget-o.attenuation)*C,e[c]*=KA(o.sustainDbRelative+g+o.attenuation),o.currentAttenuationDb=o.sustainDbRelative,o.currentSampleTime++,++c>=e.length)return}}};var Ws=Math.PI/2,_s=.01;function zs(t,A,e,s,n,o){if(A.isInRelease||currentTime>=A.releaseStartTime&&(A.isInRelease=!0,LA.startRelease(A),HA.startRelease(A)),A.modulatedGenerators[I.initialAttenuation]>2500){A.isInRelease&&(A.finished=!0);return}let g=A.targetKey,C=A.modulatedGenerators[I.fineTune]+t.customControllers[IA.channelTuning]+t.customControllers[IA.channelTransposeFine]+t.customControllers[IA.masterTuning]+t.channelOctaveTuning[A.midiNote%12]+t.keyCentTuning[A.midiNote],c=A.modulatedGenerators[I.coarseTune]+t.customControllers[IA.channelTuningSemitones],h=this.tunings[t.preset.program]?.[g];h?.midiNote>=0&&(g=h.midiNote,C+=h.centTuning),C+=(g-A.sample.rootKey)*A.modulatedGenerators[I.scaleTuning];let d=A.modulatedGenerators[I.vibLfoToPitch];if(d!==0){let Z=A.startTime+TA(A.modulatedGenerators[I.delayVibLFO]),CA=we(A.modulatedGenerators[I.freqVibLFO]),oA=$e(Z,CA,currentTime);C+=oA*(d*t.customControllers[IA.modulationMultiplier])}let Q=A.modulatedGenerators[I.initialFilterFc],l=A.modulatedGenerators[I.modLfoToPitch],u=A.modulatedGenerators[I.modLfoToVolume],D=A.modulatedGenerators[I.modLfoToFilterFc],S=0;if(l+D+u!==0){let Z=A.startTime+TA(A.modulatedGenerators[I.delayModLFO]),CA=we(A.modulatedGenerators[I.freqModLFO]),oA=$e(Z,CA,currentTime);C+=oA*(l*t.customControllers[IA.modulationMultiplier]),S=-oA*u,Q+=oA*D}if(t.channelVibrato.depth>0){let Z=$e(A.startTime+t.channelVibrato.delay,t.channelVibrato.rate,currentTime);Z&&(C+=Z*t.channelVibrato.depth)}let w=A.modulatedGenerators[I.modEnvToPitch],F=A.modulatedGenerators[I.modEnvToFilterFc],v=HA.getValue(A,currentTime);Q+=v*F,C+=v*w;let M=~~(C+c*100);M!==A.currentTuningCents&&(A.currentTuningCents=M,A.currentTuningCalculated=Math.pow(2,M/1200));let K=(Math.max(-500,Math.min(500,A.modulatedGenerators[I.pan]))+500)/1e3,_=new Float32Array(e.length);switch(this.interpolationType){case Fe.linear:default:Vs(A,_);break;case Fe.nearestNeighbor:Os(A,_);break}he.apply(A,_,Q),LA.apply(A,_,S,this.volumeEnvelopeSmoothingFactor),A.currentPan+=(K-A.currentPan)*this.panSmoothingFactor;let a=Math.cos(Ws*A.currentPan)*this.panLeft,nA=Math.sin(Ws*A.currentPan)*this.panRight,j=this.oneOutputMode?0:A.modulatedGenerators[I.reverbEffectsSend],Y=this.oneOutputMode?0:A.modulatedGenerators[I.chorusEffectsSend];Zs(a,nA,_,e,s,n,j,o,Y)}function bo(t,A){let e=0;return t.drumChannel&&(e+=5),A.isInRelease&&(e-=5),e+=A.velocity/25,e-=A.volumeEnvelope.state,A.isInRelease&&(e-=5),e-=A.volumeEnvelope.currentAttenuationDb/50,e}function js(t){let A=[];for(let s of this.workletProcessorChannels)for(let n of s.voices)if(!n.finished){let o=bo(s,n);A.push({channel:s,voice:n,priority:o})}A.sort((s,n)=>s.priority-n.priority);let e=A.slice(0,t);for(let{channel:s,voice:n}of e){let o=s.voices.indexOf(n);o>-1&&s.voices.splice(o,1)}}function $s(t){t.releaseStartTime=currentTime,t.releaseStartTime-t.startTimeen=t);var Lo=function(t){var A,e,s,n,o,g,C,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",h="",d=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do n=c.indexOf(t.charAt(d++)),o=c.indexOf(t.charAt(d++)),g=c.indexOf(t.charAt(d++)),C=c.indexOf(t.charAt(d++)),A=n<<2|o>>4,e=(15&o)<<4|g>>2,s=(3&g)<<6|C,h+=String.fromCharCode(A),g!==64&&(h+=String.fromCharCode(e)),C!==64&&(h+=String.fromCharCode(s));while(d1&&(a.thisProgram=process.argv[1].replace(/\\/g,"/")),a.arguments=process.argv.slice(2),typeof module<"u",process.on("uncaughtException",function(i){if(!(i instanceof pe))throw i}),process.on("unhandledRejection",function(i,E){process.exit(1)}),a.quit=function(i){process.exit(i)},a.inspect=function(){return"[Emscripten Module object]"}):CA?(typeof read<"u"&&(a.read=function(E){return read(E)}),a.readBinary=function(E){var B;return typeof readbuffer=="function"?new Uint8Array(readbuffer(E)):(_A(typeof(B=read(E,"binary"))=="object"),B)},typeof scriptArgs<"u"?a.arguments=scriptArgs:typeof arguments<"u"&&(a.arguments=arguments),typeof quit=="function"&&(a.quit=function(i){quit(i)})):(j||Y)&&(j?document.currentScript&&(oA=document.currentScript.src):oA=self.location.href,oA=oA.indexOf("blob:")!==0?oA.split("/").slice(0,-1).join("/")+"/":"",a.read=function(E){var B=new XMLHttpRequest;return B.open("GET",E,!1),B.send(null),B.responseText},Y&&(a.readBinary=function(E){var B=new XMLHttpRequest;return B.open("GET",E,!1),B.responseType="arraybuffer",B.send(null),new Uint8Array(B.response)}),a.readAsync=function(E,B,f){var R=new XMLHttpRequest;R.open("GET",E,!0),R.responseType="arraybuffer",R.onload=function(){if(R.status==200||R.status==0&&R.response){B(R.response);return}f()},R.onerror=f,R.send(null)},a.setWindowTitle=function(i){document.title=i});var Me=a.print||(typeof console<"u"?console.log.bind(console):typeof print<"u"?print:null),RA=a.printErr||(typeof printErr<"u"?printErr:typeof console<"u"&&console.warn.bind(console)||Me);for(t in nA)nA.hasOwnProperty(t)&&(a[t]=nA[t]);function Ne(i){var E=u;return u=u+i+15&-16,E}function qt(i){var E=c[M>>2],B=E+i+15&-16;return c[M>>2]=B,B>=BA&&!jt()?(c[M>>2]=E,0):E}function Pt(i,E){return E||(E=16),i=Math.ceil(i/E)*E}function Qo(i){switch(i){case"i1":case"i8":return 1;case"i16":return 2;case"i32":case"float":return 4;case"i64":case"double":return 8;default:if(i[i.length-1]==="*")return 4;if(i[0]!=="i")return 0;var E=parseInt(i.substr(1));return _A(E%8==0),E/8}}function de(i){de.shown||(de.shown={}),de.shown[i]||(de.shown[i]=1,RA(i))}nA=void 0;var co={"f64-rem":function(i,E){return i%E},debugger:function(){}},rt=[];function vo(i,E){for(var B=0,f=B;f>>0)+4294967296*+(E>>>0):+(i>>>0)+4294967296*+(0|E)}function at(i,E,B){return B&&B.length?a["dynCall_"+i].apply(null,[E].concat(B)):a["dynCall_"+i].call(null,E)}var be=0,Kt=0;function _A(i,E){i||OA("Assertion failed: "+E)}function Vt(i){var E=a["_"+i];return _A(E,"Cannot call unknown function "+i+", make sure it is exported"),E}var Ot={stackSave:function(){ct()},stackRestore:function(){Qt()},arrayToC:function(i){var E,B,f=Je(i.length);return E=i,B=f,n.set(E,B),f},stringToC:function(i){var E=0;if(i!=null&&i!==0){var B=(i.length<<2)+1;E=Je(B),Wt(i,E,B)}return E}},lo={string:Ot.stringToC,array:Ot.arrayToC};function Zt(i,E,B,f,R){var q=Vt(i),W=[],x=0;if(f)for(var hA=0;hA>0]=E;break;case"i16":g[i>>1]=E;break;case"i32":c[i>>2]=E;break;case"i64":tempI64=[E>>>0,+yo(tempDouble=E)>=1?tempDouble>0?(0|ko(+ss(tempDouble/4294967296),4294967295))>>>0:~~+Do((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0],c[i>>2]=tempI64[0],c[i+4>>2]=tempI64[1];break;case"float":d[i>>2]=E;break;case"double":Q[i>>3]=E;break;default:OA("invalid type for setValue: "+B)}}function Vo(i,E,B){switch((E=E||"i8").charAt(E.length-1)==="*"&&(E="i32"),E){case"i1":case"i8":return n[i>>0];case"i16":return g[i>>1];case"i32":case"i64":return c[i>>2];case"float":return d[i>>2];case"double":return Q[i>>3];default:OA("invalid type for getValue: "+E)}return null}function Oo(i,E,B,f){typeof i=="number"?(q=!0,W=i):(q=!1,W=i.length);var R=typeof E=="string"?E:null;if(x=B==4?f:[typeof Ye=="function"?Ye:Ne,Je,Ne,qt][B===void 0?2:B](Math.max(W,R?1:E.length)),q){for(f=x,_A((3&x)==0),hA=x+(-4&W);f>2]=0;for(hA=x+W;f>0]=0;return x}if(R==="i8")return i.subarray||i.slice?o.set(i,x):o.set(new Uint8Array(i),x),x;for(var q,W,x,hA,rA,iA,tA,J=0;J>0],(f!=0||E)&&(W++,!E||W!=E););E||(E=W);var x="";if(q<128){for(;E>0;)R=String.fromCharCode.apply(String,o.subarray(i,i+Math.min(E,1024))),x=x?x+R:R,i+=1024,E-=1024;return x}return B=i,function(rA,iA){for(var tA=iA;rA[tA];)++tA;if(tA-iA>16&&rA.subarray&&Xt)return Xt.decode(rA.subarray(iA,tA));for(var J,mA,GA,xA,MA,ee,NA="";;){if(!(J=rA[iA++]))return NA;if(!(128&J)){NA+=String.fromCharCode(J);continue}if(mA=63&rA[iA++],(224&J)==192){NA+=String.fromCharCode((31&J)<<6|mA);continue}if(GA=63&rA[iA++],(240&J)==224?J=(15&J)<<12|mA<<6|GA:(xA=63&rA[iA++],(248&J)==240?J=(7&J)<<18|mA<<12|GA<<6|xA:(MA=63&rA[iA++],J=(252&J)==248?(3&J)<<24|mA<<18|GA<<12|xA<<6|MA:(1&J)<<30|mA<<24|GA<<18|xA<<12|MA<<6|(ee=63&rA[iA++]))),J<65536)NA+=String.fromCharCode(J);else{var Se=J-65536;NA+=String.fromCharCode(55296|Se>>10,56320|1023&Se)}}}(o,B)}function Xo(i){for(var E="";;){var B=n[i++>>0];if(!B)return E;E+=String.fromCharCode(B)}}function Wo(i,E){return function(f,R,q){for(var W=0;W>0]=f.charCodeAt(W);q||(n[R>>0]=0)}(i,E,!1)}var Xt=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function Ue(i,E,B,f){if(!(f>0))return 0;for(var R=B,q=B+f-1,W=0;W=55296&&x<=57343&&(x=65536+((1023&x)<<10)|1023&i.charCodeAt(++W)),x<=127){if(B>=q)break;E[B++]=x}else if(x<=2047){if(B+1>=q)break;E[B++]=192|x>>6,E[B++]=128|63&x}else if(x<=65535){if(B+2>=q)break;E[B++]=224|x>>12,E[B++]=128|x>>6&63,E[B++]=128|63&x}else if(x<=2097151){if(B+3>=q)break;E[B++]=240|x>>18,E[B++]=128|x>>12&63,E[B++]=128|x>>6&63,E[B++]=128|63&x}else if(x<=67108863){if(B+4>=q)break;E[B++]=248|x>>24,E[B++]=128|x>>18&63,E[B++]=128|x>>12&63,E[B++]=128|x>>6&63,E[B++]=128|63&x}else{if(B+5>=q)break;E[B++]=252|x>>30,E[B++]=128|x>>24&63,E[B++]=128|x>>18&63,E[B++]=128|x>>12&63,E[B++]=128|x>>6&63,E[B++]=128|63&x}}return E[B]=0,B-R}function Wt(i,E,B){return Ue(i,o,E,B)}function Te(i){for(var E=0,B=0;B=55296&&f<=57343&&(f=65536+((1023&f)<<10)|1023&i.charCodeAt(++B)),f<=127?++E:f<=2047?E+=2:f<=65535?E+=3:f<=2097151?E+=4:f<=67108863?E+=5:E+=6}return E}var _t=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function _o(i){for(var E=i,B=E>>1;g[B];)++B;if((E=B<<1)-i>32&&_t)return _t.decode(o.subarray(i,E));for(var f=0,R="";;){var q=g[i+2*f>>1];if(q==0)return R;++f,R+=String.fromCharCode(q)}}function zo(i,E,B){if(B===void 0&&(B=2147483647),B<2)return 0;for(var f=E,R=(B-=2)<2*i.length?B/2:i.length,q=0;q>1]=W,E+=2}return g[E>>1]=0,E-f}function jo(i){return 2*i.length}function $o(i){for(var E=0,B="";;){var f=c[i+4*E>>2];if(f==0)return B;if(++E,f>=65536){var R=f-65536;B+=String.fromCharCode(55296|R>>10,56320|1023&R)}else B+=String.fromCharCode(f)}}function Ar(i,E,B){if(B===void 0&&(B=2147483647),B<4)return 0;for(var f=E,R=f+B-4,q=0;q=55296&&W<=57343&&(W=65536+((1023&W)<<10)|1023&i.charCodeAt(++q)),c[E>>2]=W,(E+=4)+4>R)break}return c[E>>2]=0,E-f}function er(i){for(var E=0,B=0;B=55296&&f<=57343&&++B,E+=4}return E}function tr(i){var E=Te(i)+1,B=Ye(E);return B&&Ue(i,n,B,E),B}function sr(i){var E=Te(i)+1,B=Je(E);return Ue(i,n,B,E),B}function nr(i){return i}function or(){var i,E=function(){var f=Error();if(!f.stack){try{throw Error(0)}catch(R){f=R}if(!f.stack)return"(no stack trace available)"}return f.stack.toString()}();return a.extraStackTrace&&(E+=` `+a.extraStackTrace()),(i=E).replace(/__Z[\w\d_]+/g,function(B){var f,R=f=B;return B===R?B:B+" ["+R+"]"})}function It(i,E){return i%E>0&&(i+=E-i%E),i}function zt(i){a.buffer=s=i}function gt(){a.HEAP8=n=new Int8Array(s),a.HEAP16=g=new Int16Array(s),a.HEAP32=c=new Int32Array(s),a.HEAPU8=o=new Uint8Array(s),a.HEAPU16=C=new Uint16Array(s),a.HEAPU32=h=new Uint32Array(s),a.HEAPF32=d=new Float32Array(s),a.HEAPF64=Q=new Float64Array(s)}function jt(){var i=a.usingWasm?65536:16777216,E=2147483648-i;if(c[M>>2]>E)return!1;var B=BA;for(BA=Math.max(BA,16777216);BA>2];)BA=BA<=536870912?It(2*BA,i):Math.min(It((3*BA+2147483648)/4,i),E);var f=a.reallocBuffer(BA);return f&&f.byteLength==BA?(zt(f),gt(),!0):(BA=B,!1)}l=u=S=w=F=v=M=0,D=!1,a.reallocBuffer||(a.reallocBuffer=function(i){try{if(ArrayBuffer.transfer)E=ArrayBuffer.transfer(s,i);else{var E,B=n;E=new ArrayBuffer(i),new Int8Array(E).set(B)}}catch{return!1}return!!wo(E)&&E});try{(K=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get))(new ArrayBuffer(4))}catch{K=function(E){return E.byteLength}}var Ct=a.TOTAL_STACK||5242880,BA=a.TOTAL_MEMORY||16777216;function fo(){return BA}function fe(i){for(;i.length>0;){var E=i.shift();if(typeof E=="function"){E();continue}var B=E.func;typeof B=="number"?E.arg===void 0?a.dynCall_v(B):a.dynCall_vi(B,E.arg):B(E.arg===void 0?null:E.arg)}}BA=0?i:E<=32?2*Math.abs(1<=f&&(E<=32||i>f)&&(i=-2*f+i),i}var yo=Math.abs,Do=Math.ceil,ss=Math.floor,ko=Math.min,Ae=0,ht=null,me=null;function Er(i){return i}a.preloadedImages={},a.preloadedAudios={};var ns="data:application/octet-stream;base64,";function He(i){return String.prototype.startsWith?i.startsWith(ns):i.indexOf(ns)===0}(function(){var E="main.wast",B="main.wasm",f="main.temp.asm.js";He(E)||(E=fA(E)),He(B)||(B=fA(B)),He(f)||(f=fA(f));var R={global:null,env:null,asm2wasm:co,parent:a},q=null;function W(tA){return tA}function x(){try{if(a.wasmBinary)return new Uint8Array(a.wasmBinary);if(a.readBinary)return a.readBinary(B);throw"both async and sync fetching of the wasm failed"}catch(tA){OA(tA)}}a.asmPreload=a.asm;var hA=a.reallocBuffer,rA=function(tA){tA=It(tA,a.usingWasm?65536:16777216);var J=a.buffer.byteLength;if(a.usingWasm)try{var mA=a.wasmMemory.grow((tA-J)/65536);return mA!==-1?a.buffer=a.wasmMemory.buffer:null}catch{return null}};a.reallocBuffer=function(tA){return iA==="asmjs"?hA(tA):rA(tA)};var iA="";a.asm=function(tA,J,mA){var GA;if(!(J=GA=J).table){var xA,MA=a.wasmTableSize;MA===void 0&&(MA=1024);var ee=a.wasmMaxTableSize;typeof WebAssembly=="object"&&typeof WebAssembly.Table=="function"?ee!==void 0?J.table=new WebAssembly.Table({initial:MA,maximum:ee,element:"anyfunc"}):J.table=new WebAssembly.Table({initial:MA,element:"anyfunc"}):J.table=Array(MA),a.wasmTable=J.table}return J.memoryBase||(J.memoryBase=a.STATIC_BASE),J.tableBase||(J.tableBase=0),xA=function(Se,oe,ut){if(typeof WebAssembly!="object")return RA("no native wasm support detected"),!1;if(!(a.wasmMemory instanceof WebAssembly.Memory))return RA("no native wasm Memory in use"),!1;function ve(JA,vA){if((q=JA.exports).memory){var ye,dt,is;ye=q.memory,dt=a.buffer,ye.byteLength0?B:Te(i)+1,R=Array(f),q=Ue(i,R,0,R.length);return E&&(R.length=q),R}function cr(i){for(var E=[],B=0;B255&&(f&=255),E.push(String.fromCharCode(f))}return E.join("")}u+=16,M=Ne(4),F=(S=w=Pt(u))+Ct,v=Pt(F),c[M>>2]=v,D=!0,a.wasmTableSize=4,a.wasmMaxTableSize=4,a.asmGlobalArg={},a.asmLibraryArg={abort:OA,assert:_A,enlargeMemory:jt,getTotalMemory:fo,abortOnCannotGrowMemory:function(){OA("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+BA+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")},invoke_iii:function(E,B,f){var R=ct();try{return a.dynCall_iii(E,B,f)}catch(q){if(Qt(R),typeof q!="number"&&q!=="longjmp")throw q;a.setThrew(1,0)}},___assert_fail:function(E,B,f,R){OA("Assertion failed: "+Le(E)+", at: "+[B?Le(B):"unknown filename",f,R?Le(R):"unknown function"])},___setErrNo:function(E){return a.___errno_location&&(c[a.___errno_location()>>2]=E),E},_abort:function(){a.abort()},_emscripten_memcpy_big:function(E,B,f){return o.set(o.subarray(B,B+f),E),E},_llvm_floor_f64:ss,DYNAMICTOP_PTR:M,tempDoublePtr:kA,ABORT:be,STACKTOP:w,STACK_MAX:F};var os=a.asm(a.asmGlobalArg,a.asmLibraryArg,s);a.asm=os,a.___errno_location=function(){return a.asm.___errno_location.apply(null,arguments)};var wo=a._emscripten_replace_memory=function(){return a.asm._emscripten_replace_memory.apply(null,arguments)};a._free=function(){return a.asm._free.apply(null,arguments)};var Ye=a._malloc=function(){return a.asm._malloc.apply(null,arguments)};a._memcpy=function(){return a.asm._memcpy.apply(null,arguments)},a._memset=function(){return a.asm._memset.apply(null,arguments)},a._sbrk=function(){return a.asm._sbrk.apply(null,arguments)},a._stb_vorbis_js_channels=function(){return a.asm._stb_vorbis_js_channels.apply(null,arguments)},a._stb_vorbis_js_close=function(){return a.asm._stb_vorbis_js_close.apply(null,arguments)},a._stb_vorbis_js_decode=function(){return a.asm._stb_vorbis_js_decode.apply(null,arguments)},a._stb_vorbis_js_open=function(){return a.asm._stb_vorbis_js_open.apply(null,arguments)},a._stb_vorbis_js_sample_rate=function(){return a.asm._stb_vorbis_js_sample_rate.apply(null,arguments)},a.establishStackSpace=function(){return a.asm.establishStackSpace.apply(null,arguments)},a.getTempRet0=function(){return a.asm.getTempRet0.apply(null,arguments)},a.runPostSets=function(){return a.asm.runPostSets.apply(null,arguments)},a.setTempRet0=function(){return a.asm.setTempRet0.apply(null,arguments)},a.setThrew=function(){return a.asm.setThrew.apply(null,arguments)};var Je=a.stackAlloc=function(){return a.asm.stackAlloc.apply(null,arguments)},Qt=a.stackRestore=function(){return a.asm.stackRestore.apply(null,arguments)},ct=a.stackSave=function(){return a.asm.stackSave.apply(null,arguments)};function pe(i){this.name="ExitStatus",this.message="Program terminated with exit("+i+")",this.status=i}function lt(i){i=i||a.arguments,!(Ae>0)&&(function(){if(a.preRun)for(typeof a.preRun=="function"&&(a.preRun=[a.preRun]);a.preRun.length;)po(a.preRun.shift());fe($t)}(),!(Ae>0)&&(a.calledRun||(a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1),E()},1)):E())));function E(){!a.calledRun&&(a.calledRun=!0,be||(Bt||(Bt=!0,fe(Et)),fe(As),a.onRuntimeInitialized&&a.onRuntimeInitialized(),function(){if(a.postRun)for(typeof a.postRun=="function"&&(a.postRun=[a.postRun]);a.postRun.length;)So(a.postRun.shift());fe(ts)}()))}}function lr(i,E){(!E||!a.noExitRuntime||i!==0)&&(a.noExitRuntime||(be=!0,Kt=i,w=_,fe(es),mo=!0,a.onExit&&a.onExit(i)),a.quit(i,new pe(i)))}function OA(i){throw a.onAbort&&a.onAbort(i),i!==void 0?(Me(i),RA(i),i=JSON.stringify(i)):i="",be=!0,Kt=1,"abort("+i+"). Build with -s ASSERTIONS=1 for more info."}if(a.dynCall_iii=function(){return a.asm.dynCall_iii.apply(null,arguments)},a.asm=os,a.ccall=Zt,a.cwrap=function(E,B,f,R){var q=(f=f||[]).every(function(W){return W==="number"});return B!=="string"&&q&&!R?Vt(E):function(){return Zt(E,B,f,arguments,R)}},pe.prototype=Error(),pe.prototype.constructor=pe,me=function i(){a.calledRun||lt(),a.calledRun||(me=i)},a.run=lt,a.abort=OA,a.preInit)for(typeof a.preInit=="function"&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();a.noExitRuntime=!0,lt(),a.onRuntimeInitialized=()=>{An=!0,en()},VA.decode=function(i){return function(B){if(!An)throw Error("Not initialized");var f={};function R(oe){return new Int32Array(a.HEAPU8.buffer,oe,1)[0]}function q(oe,ut){var ve=new ArrayBuffer(ut*Float32Array.BYTES_PER_ELEMENT),re=new Float32Array(ve);return re.set(new Float32Array(a.HEAPU8.buffer,oe,ut)),re}f.open=a.cwrap("stb_vorbis_js_open","number",[]),f.close=a.cwrap("stb_vorbis_js_close","void",["number"]),f.channels=a.cwrap("stb_vorbis_js_channels","number",["number"]),f.sampleRate=a.cwrap("stb_vorbis_js_sample_rate","number",["number"]),f.decode=a.cwrap("stb_vorbis_js_decode","number",["number","number","number","number","number"]);var W,x,hA,rA,iA=f.open(),tA=(W=B,x=B.byteLength,hA=a._malloc(x),(rA=new Uint8Array(a.HEAPU8.buffer,hA,x)).set(new Uint8Array(W,0,x)),rA),J=a._malloc(4),mA=a._malloc(4),GA=f.decode(iA,tA.byteOffset,tA.byteLength,J,mA);if(a._free(tA.byteOffset),GA<0)throw f.close(iA),a._free(J),Error("stbvorbis decode failed: "+GA);for(var xA=f.channels(iA),MA=Array(xA),ee=new Int32Array(a.HEAPU32.buffer,R(J),xA),NA=0;NA=0&&(s=this.workletProcessorChannels[e]),t.messageType){case eA.noteOn:this.noteOn(e,A[0],A[1],A[2]);break;case eA.noteOff:this.noteOff(e,A);break;case eA.pitchWheel:this.pitchWheel(e,A[0],A[1]);break;case eA.ccChange:this.controllerChange(e,A[0],A[1],A[2]);break;case eA.customcCcChange:s.customControllers[A[0]]=A[1];break;case eA.killNote:this.killNote(e,A);break;case eA.programChange:this.programChange(e,A[0],A[1]);break;case eA.channelPressure:this.channelPressure(e,A);break;case eA.polyPressure:this.polyPressure(e,A[0],A[1]);break;case eA.ccReset:e===UA?this.resetAllControllers():this.resetControllers(e);break;case eA.systemExclusive:this.systemExclusive(A);break;case eA.setChannelVibrato:if(e===UA)for(let g=0;g{let e=(A.midiControllers[EA+P.pitchWheelRange]>>7)+(A.midiControllers[EA+P.pitchWheelRange]&127)/127;return{voicesAmount:A.voices.length,pitchBend:A.midiControllers[EA+P.pitchWheel],pitchBendRangeSemitones:e,isMuted:A.isMuted,isDrum:A.drumChannel}});this.post({messageType:pA.channelProperties,messageData:t})}function Uo(t,A,e){let s=t,n=A<<7|e;return t===127&&A===127&&e===127?{midiNote:-1,centTuning:null}:{midiNote:s,centTuning:n*.0061}}function on(t,A=0){let e=t[0];if(!(this.deviceID!==UA&&t[1]!==127&&this.deviceID!==t[1]))switch(e){default:b(`%cUnrecognized SysEx: %c${lA(t)}`,r.warn,r.unrecognized);break;case 126:case 127:switch(t[2]){case 4:let n;switch(t[3]){case 1:let o=t[5]<<7|t[4];this.setMIDIVolume(o/16384),m(`%cMaster Volume. Volume: %c${o}`,r.info,r.value);break;case 2:let C=((t[5]<<7|t[4])-8192)/8192;this.setMasterPan(C),m(`%cMaster Pan. Pan: %c${C}`,r.info,r.value);break;case 3:let c=(t[5]<<7|t[6])-8192;n=Math.floor(c/81.92),this.setMasterTuning(n),m(`%cMaster Fine Tuning. Cents: %c${n}`,r.info,r.value);break;case 4:n=(t[5]-64)*100,this.setMasterTuning(n),m(`%cMaster Coarse Tuning. Cents: %c${n}`,r.info,r.value);break;default:b(`%cUnrecognized MIDI Device Control Real-time message: %c${lA(t)}`,r.warn,r.unrecognized)}break;case 9:t[3]===1?(m("%cGM system on",r.info),this.system="gm"):t[3]===3?(m("%cGM2 system on",r.info),this.system="gm2"):(m("%cGM system off, defaulting to GS",r.info),this.system="gs");break;case 8:switch(t[3]){case 2:case 7:let o=4;t[3]===7&&o++;let g=t[o++],C=t[o++];for(let h=0;h>1&1)===1&&this.setOctaveTuning(15+A,c);for(let h=0;h<7;h++)(t[5]>>h&1)===1&&this.setOctaveTuning(7+h+A,c);for(let h=0;h<7;h++)(t[6]>>h&1)===1&&this.setOctaveTuning(h+A,c);m(`%cMIDI Octave Scale ${t[3]===8?"(1 byte)":"(2 bytes)"} tuning via Tuning: %c${c.join(" ")}`,r.info,r.value);break;default:b(`%cUnrecognized MIDI Tuning standard message: %c${lA(t)}`,r.warn,r.unrecognized);break}break;default:b(`%cUnrecognized MIDI Realtime/non realtime message: %c${lA(t)}`,r.warn,r.unrecognized)}break;case 65:let s=function(){b(`%cUnrecognized Roland %cGS %cSysEx: %c${lA(t)}`,r.warn,r.recognized,r.warn,r.unrecognized)};if(t[2]===66&&t[3]===18){let n=t[7];if(t[6]===127){n===0?(m("%cGS Reset received!",r.info),this.resetAllControllers(!1),this.system="gs"):n===127&&(m("%cGS system off, switching to GM2",r.info),this.resetAllControllers(!1),this.system="gm2");return}else if(t[4]===64){if((t[5]&16)>0){let o=[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][t[5]&15]+A;switch(t[6]){default:s();break;case 21:let g=n>0&&t[5]>>4;this.setDrums(o,g),m(`%cChannel %c${o}%c ${g?"is now a drum channel":"now isn't a drum channel"}%c via: %c${lA(t)}`,r.info,r.value,r.recognized,r.info,r.value);return;case 22:let C=n-64;this.transposeChannel(o,C),m(`%cChannel %c${o}%c pitch shift. Semitones %c${C}%c, with %c${lA(t)}`,r.info,r.recognized,r.info,r.value,r.info,r.value);return;case 28:let c=n;c===0&&(c=Math.floor(Math.random()*128)),this.controllerChange(o,p.pan,c);break;case 33:this.controllerChange(o,p.effects3Depth,n);break;case 34:this.controllerChange(o,p.effects1Depth,n);break;case 64:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:let h=t.length-9,d=new Int8Array(12);for(let l=0;l=this.workletProcessorChannels.length)return;let o=t[6];switch(t[5]){case 1:this.controllerChange(n,p.bankSelect,o);break;case 2:this.controllerChange(n,p.lsbForControl0BankSelect,o);break;case 3:this.programChange(n,o);break;case 8:let g=this.workletProcessorChannels[n];if(g.drumChannel)return;let C=o-64;g.channelTransposeKeyShift=C;break;case 11:this.controllerChange(n,p.mainVolume,o);break;case 14:let c=o;c===0&&(c=Math.floor(Math.random()*127)),this.controllerChange(n,p.pan,c);break;case 19:this.controllerChange(n,p.effects1Depth,o);break;case 18:this.controllerChange(n,p.effects3Depth,o);break;default:b(`%cUnrecognized Yamaha XG Part Setup: %c${t[5].toString(16).toUpperCase()}`,r.warn,r.unrecognized)}}else this.system==="xg"&&b(`%cUnrecognized Yamaha XG SysEx: %c${lA(t)}`,r.warn,r.unrecognized);else this.system==="xg"&&b(`%cUnrecognized Yamaha SysEx: %c${lA(t)}`,r.warn,r.unrecognized);break}}function rn(t,A,e){if(A.transformAmount===0)return 0;let s;if(A.sourceUsesCC)s=t[A.sourceIndex];else{let c=A.sourceIndex+EA;switch(A.sourceIndex){case P.noController:s=16383;break;case P.noteOnKeyNum:s=e.midiNote<<7;break;case P.noteOnVelocity:s=e.velocity<<7;break;case P.polyPressure:s=e.pressure<<7;break;default:s=t[c];break}}let n=dA[A.sourceCurveType][A.sourcePolarity][A.sourceDirection][s],o;if(A.secSrcUsesCC)o=t[A.secSrcIndex];else{let c=A.secSrcIndex+EA;switch(A.secSrcIndex){case P.noController:o=16383;break;case P.noteOnKeyNum:o=e.midiNote<<7;break;case P.noteOnVelocity:o=e.velocity<<7;break;case P.polyPressure:o=e.pressure<<7;break;default:o=t[c]}}let g=dA[A.secSrcCurveType][A.secSrcPolarity][A.secSrcDirection][o],C=n*g*A.transformAmount;return A.transformType===2?Math.abs(C):C}function XA(t,A,e=-1,s=0){let{modulators:n,generators:o,modulatedGenerators:g}=t;if(HA.recalculate(t),e===-1){g.set(o),n.forEach(h=>{let d=N[h.modulatorDestination],Q=g[h.modulatorDestination]+rn(A,h,t);g[h.modulatorDestination]=Math.max(d.min,Math.min(Q,d.max))}),LA.recalculate(t);return}let C=new Set([I.initialAttenuation,I.delayVolEnv,I.attackVolEnv,I.holdVolEnv,I.decayVolEnv,I.sustainVolEnv,I.releaseVolEnv,I.keyNumToVolEnvHold,I.keyNumToVolEnvDecay]),c=new Set;n.forEach(h=>{if(h.sourceUsesCC===e&&h.sourceIndex===s||h.secSrcUsesCC===e&&h.secSrcIndex===s){let d=h.modulatorDestination;c.has(d)||(g[d]=o[d],n.forEach(Q=>{if(Q.modulatorDestination===d){let l=N[h.modulatorDestination],D=g[h.modulatorDestination]+rn(A,Q,t);g[h.modulatorDestination]=Math.max(l.min,Math.min(D,l.max))}}),c.add(d))}}),[...c].some(h=>C.has(h))&&LA.recalculate(t)}var dA=[];for(let t=0;t<4;t++){dA[t]=[[new Float32Array(gA),new Float32Array(gA)],[new Float32Array(gA),new Float32Array(gA)]];for(let A=0;A200&&e<40||this.highPerformanceMode&&e<10||g.isMuted)return;let C=A+g.channelTransposeKeyShift;if(A>127||A<0)return;let c=g.preset.program;this.tunings[c]?.[A]?.midiNote>=0&&(C=this.tunings[c]?.[A].midiNote);let h=this.getWorkletVoices(t,C,e,g,o,s),d=g.voices;h.forEach(Q=>{let l=Q.generators[I.exclusiveClass];l!==0&&d.forEach(u=>{u.generators[I.exclusiveClass]===l&&(this.releaseVoice(u),u.modulatedGenerators[I.releaseVolEnv]=-7e3,u.modulatedGenerators[I.releaseModEnv]=-7e3,LA.recalculate(u),HA.recalculate(u))}),XA(Q,g.midiControllers),Q.volumeEnvelope.attenuation=Q.volumeEnvelope.attenuationTarget,Q.currentPan=(Math.max(-500,Math.min(500,Q.modulatedGenerators[I.pan]))+500)/1e3}),this.totalVoicesAmount+=h.length,this.totalVoicesAmount>this.voiceCap&&this.voiceKilling(h.length),d.push(...h),n&&(this.sendChannelProperties(),this.callEvent("noteon",{midiNote:A,channel:t,velocity:e}))}function In(t,A){if(A>127||A<0){b("Received a noteOn for note",A,"Ignoring.");return}let e=A+this.workletProcessorChannels[t].channelTransposeKeyShift,s=this.workletProcessorChannels[t].preset.program;if(this.tunings[s]?.[A]?.midiNote>=0&&(e=this.tunings[s]?.[A].midiNote),this.highPerformanceMode&&!this.workletProcessorChannels[t].drumChannel){this.killNote(t,e);return}this.workletProcessorChannels[t].voices.forEach(o=>{o.midiNote!==e||o.isInRelease===!0||(this.workletProcessorChannels[t].holdPedal?this.workletProcessorChannels[t].sustainedVoices.push(o):this.releaseVoice(o))}),this.callEvent("noteoff",{midiNote:A,channel:t})}function gn(t,A){this.workletProcessorChannels[t].voices.forEach(e=>{e.midiNote===A&&(e.modulatedGenerators[I.releaseVolEnv]=-12e3,this.releaseVoice(e))})}function Cn(t,A=!1){let e=this.workletProcessorChannels[t].voices;A?(e.length=0,this.workletProcessorChannels[t].sustainedVoices.length=0,this.sendChannelProperties()):(e.forEach(s=>{s.isInRelease||this.releaseVoice(s)}),this.workletProcessorChannels[t].sustainedVoices.forEach(s=>{this.releaseVoice(s)}))}function En(t=!1){m("%cStop all received!",r.info);for(let A=0;AXA(n,this.workletProcessorChannels[t].midiControllers,0,P.pitchWheel)),this.sendChannelProperties()}function fn(t,A){let e=this.workletProcessorChannels[t];e.midiControllers[EA+P.channelPressure]=A<<7,this.workletProcessorChannels[t].voices.forEach(s=>XA(s,e.midiControllers,0,P.channelPressure)),this.callEvent("channelpressure",{channel:t,pressure:A})}function mn(t,A,e){this.workletProcessorChannels[t].voices.forEach(s=>{s.midiNote===A&&(s.pressure=e,XA(s,this.workletProcessorChannels[t].midiControllers,0,P.polyPressure))}),this.callEvent("polypressure",{channel:t,midiNote:A,pressure:e})}function pn(t,A){if(A.length!==12)throw new Error("Tuning is not the length of 12.");this.workletProcessorChannels[t].channelOctaveTuning=A}function Sn(t,A,e,s=!1){let n=this.workletProcessorChannels[t];if(n===void 0){b(`Trying to access channel ${t} which does not exist... ignoring!`);return}if(A>=p.lsbForControl1ModulationWheel&&A<=p.lsbForControl13EffectControl2&&A!==p.lsbForControl6DataEntry){let o=A-32;if(n.lockedControllers[o])return;n.midiControllers[o]=n.midiControllers[o]&16256|e&127,n.voices.forEach(g=>XA(g,n.midiControllers,1,o))}switch(A){case p.allNotesOff:this.stopAll(t);break;case p.allSoundOff:this.stopAll(t,!0);break;case p.bankSelect:let o=e;if(!s){switch(this.system){case"gm":m(`%cIgnoring the Bank Select (${e}), as the synth is in GM mode.`,r.info);return;case"xg":o===120||o===126||o===127?this.setDrums(t,!0):t%16!==yA&&this.setDrums(t,!1);break;case"gm2":o===120&&(n.drumChannel=!0,this.callEvent("drumchange",{channel:t,isDrumChannel:!0}))}n.drumChannel&&(o=128),o===128&&!n.drumChannel&&(o=n.midiControllers[p.bankSelect])}n.midiControllers[p.bankSelect]=o;break;case p.lsbForControl0BankSelect:this.system==="xg"?n.drumChannel||e!==127&&(n.midiControllers[p.bankSelect]=e):this.system==="gm2"&&(n.midiControllers[p.bankSelect]=e);break;case p.RPNLsb:n.RPValue=n.RPValue<<7|e,n.dataEntryState=uA.RPFine;break;case p.RPNMsb:n.RPValue=e,n.dataEntryState=uA.RPCoarse;break;case p.NRPNMsb:n.NRPCoarse=e,n.dataEntryState=uA.NRPCoarse;break;case p.NRPNLsb:n.NRPFine=e,n.dataEntryState=uA.NRPFine;break;case p.dataEntryMsb:this.dataEntryCoarse(t,e);break;case p.lsbForControl6DataEntry:this.dataEntryFine(t,e);break;case p.resetAllControllers:this.resetControllers(t);break;case p.sustainPedal:e>=64?n.holdPedal=!0:(n.holdPedal=!1,n.sustainedVoices.forEach(g=>{this.releaseVoice(g)}),n.sustainedVoices=[]);break;default:if(n.lockedControllers[A])return;n.midiControllers[A]=e<<7,n.voices.forEach(g=>XA(g,n.midiControllers,1,A)),this.callEvent("controllerchange",{channel:t,controllerNumber:A,controllerValue:e});break}}function yn(t){this.midiVolume=t,this.setMasterPan(this.pan)}function Dn(t){this.masterGain=t*Lt,this.setMasterPan(this.pan)}function kn(t){this.pan=t,t=t/2+.5,this.panLeft=(1-t)*this.currentGain,this.panRight=t*this.currentGain}function wn(t,A){A&&this.stopAll(t,!0),this.workletProcessorChannels[t].isMuted=A,this.sendChannelProperties(),this.callEvent("mutechannel",{channel:t,isMuted:A})}function Fn(t){this.workletProcessorChannels[t].lockGSNRPNParams=!0,this.workletProcessorChannels[t].channelVibrato.rate=0,this.workletProcessorChannels[t].channelVibrato.delay=0,this.workletProcessorChannels[t].channelVibrato.depth=0}function Rn(t,A,e,s){this.workletProcessorChannels[t].lockGSNRPNParams||(this.workletProcessorChannels[t].channelVibrato.rate=e,this.workletProcessorChannels[t].channelVibrato.delay=s,this.workletProcessorChannels[t].channelVibrato.depth=A)}function Gn(t,A){let e=this.workletProcessorChannels[t],s=()=>{e.channelVibrato.delay===0&&e.channelVibrato.rate===0&&e.channelVibrato.depth===0&&(e.channelVibrato.depth=50,e.channelVibrato.rate=8,e.channelVibrato.delay=.6)};switch(e.dataEntryState){default:case uA.Idle:break;case uA.NRPFine:if(this.system!=="gs"||e.lockGSNRPNParams)return;switch(e.NRPCoarse){default:if(A===64)return;b(`%cUnrecognized NRPN for %c${t}%c: %c(0x${e.NRPCoarse.toString(16).toUpperCase()} 0x${e.NRPFine.toString(16).toUpperCase()})%c data value: %c${A}`,r.warn,r.recognized,r.warn,r.unrecognized,r.warn,r.value);break;case 1:switch(e.NRPFine){default:if(A===64)return;b(`%cUnrecognized NRPN for %c${t}%c: %c(0x${e.NRPCoarse.toString(16)} 0x${e.NRPFine.toString(16)})%c data value: %c${A}`,r.warn,r.recognized,r.warn,r.unrecognized,r.warn,r.value);break;case 8:if(A===64)return;s(),e.channelVibrato.rate=A/64*8,m(`%cVibrato rate for %c${t}%c is now set to %c${A} = ${e.channelVibrato.rate}%cHz.`,r.info,r.recognized,r.info,r.value,r.info);break;case 9:if(A===64)return;s(),e.channelVibrato.depth=A/2,m(`%cVibrato depth for %c${t}%c is now set to %c${A} = ${e.channelVibrato.depth}%c cents range of detune.`,r.info,r.recognized,r.info,r.value,r.info);break;case 10:if(A===64)return;s(),e.channelVibrato.delay=A/64/3,m(`%cVibrato delay for %c${t}%c is now set to %c${A} = ${e.channelVibrato.delay}%c seconds.`,r.info,r.recognized,r.info,r.value,r.info);break;case 32:let g=A;this.controllerChange(t,p.brightness,A),m(`%cFilter cutoff for %c${t}%c is now set to %c${g}`,r.info,r.recognized,r.info,r.value)}break;case 24:let n=A-64;e.keyCentTuning[e.NRPFine]=n*100,m(`%cGS drum key tuning. MIDI note: %c${e.NRPFine}%c semitones: %c${n}`,r.info,r.recognized,r.info,r.value);break;case 29:let o=A;this.controllerChange(t,p.effects1Depth,o),m(`%cGS Drum reverb for %c${t}%c: %c${o}`,r.info,r.recognized,r.info,r.value);break}break;case uA.RPCoarse:case uA.RPFine:switch(e.RPValue){default:b(`%cUnrecognized RPN for %c${t}%c: %c(0x${e.RPValue.toString(16)})%c data value: %c${A}`,r.warn,r.recognized,r.warn,r.unrecognized,r.warn,r.value);break;case 0:e.midiControllers[EA+P.pitchWheelRange]=A<<7,m(`%cChannel ${t} bend range. Semitones: %c${A}`,r.info,r.value);break;case 2:this.setChannelTuningSemitones(t,A-64);break;case 1:this.setChannelTuning(t,A-64,!1);break;case 5:this.setModulationDepth(t,A*100);break;case 16383:this.resetParameters(t);break}}}function xn(t,A){let e=this.workletProcessorChannels[t];switch(e.dataEntryState){default:break;case uA.RPCoarse:case uA.RPFine:switch(e.RPValue){default:break;case 0:if(A===0)break;e.midiControllers[EA+P.pitchWheelRange]|=A;let s=(e.midiControllers[EA+P.pitchWheelRange]>>7)+A/127;m(`%cChannel ${t} bend range. Semitones: %c${s}`,r.info,r.value);break;case 1:let o=e.customControllers[IA.channelTuning]<<7|A;this.setChannelTuning(t,o*.01220703125);break;case 5:let C=e.customControllers[IA.modulationMultiplier]*50+A/128*100;this.setModulationDepth(t,C);break;case 16383:this.resetParameters(t);break}}}function Mn(t=!0){t&&m("%cResetting all controllers!",r.info),this.callEvent("allcontrollerreset",void 0);for(let A=0;A{this.workletProcessorChannels[A].lockedControllers[n]&&this.callEvent("controllerchange",{channel:A,controllerNumber:n,controllerValue:this.workletProcessorChannels[A].midiControllers[n]>>7})};if(s(p.mainVolume),s(p.pan),s(p.expressionController),s(p.modulationWheel),s(p.effects3Depth),s(p.effects1Depth),s(p.brightness),this.workletProcessorChannels[A].lockedControllers[EA+P.pitchWheel]){let n=this.workletProcessorChannels[A].midiControllers[EA+P.pitchWheel],o=n>>7,g=n&127;this.callEvent("pitchwheel",{channel:A,MSB:o,LSB:g})}}this.tunings=[],this.tunings=[];for(let A=0;A<127;A++)this.tunings.push([]);this.setMIDIVolume(1),this.system=Ke}function Nn(t){let A=this.workletProcessorChannels[t],s=A.lockedControllers.reduce((o,g,C)=>(g&&o.push(C),o),[]).map(o=>({ccNum:o,ccVal:A.midiControllers[o]}));A.channelOctaveTuning.fill(0),A.keyCentTuning.fill(0),A.midiControllers.set(ZA),A.channelVibrato={rate:0,depth:0,delay:0},A.holdPedal=!1,s.forEach(o=>{A.midiControllers[o.ccNum]=o.ccVal});let n=A.customControllers[IA.channelTransposeFine];A.customControllers.set(kt),A.customControllers[IA.channelTransposeFine]=n,this.resetParameters(t)}function bn(t){let A=this.workletProcessorChannels[t];A.NRPCoarse=0,A.NRPFine=0,A.RPValue=0,A.dataEntryState=uA.Idle}function Ln(){let t=4;for(let s of this.instruments)t+=s.instrumentZones.reduce((n,o)=>(o.generators=o.generators.filter(g=>g.generatorType!==I.sampleID&&g.generatorType!==I.keyRange&&g.generatorType!==I.velRange),(o.velRange.max!==127||o.velRange.min!==0)&&o.generators.unshift({generatorType:I.velRange,generatorValue:o.velRange.max<<8|o.velRange.min}),(o.keyRange.max!==127||o.keyRange.min!==0)&&o.generators.unshift({generatorType:I.keyRange,generatorValue:o.keyRange.max<<8|o.keyRange.min}),o.isGlobal||o.generators.push({generatorType:I.sampleID,generatorValue:this.samples.indexOf(o.sample)}),o.generators.length*4+n),0);let A=new T(t),e=0;for(let s of this.instruments)for(let n of s.instrumentZones){n.generatorZoneStartIndex=e;for(let o of n.generators)H(A,o.generatorType),H(A,o.generatorValue),e++}return QA(A,0),sA(new $("igen",A.length,A))}function Un(t,A,e,s,n){let o=this.samples.map((h,d)=>{e&&h.compressSample(s,n);let Q=h.getRawData();return m(`%cEncoded sample %c${d}. ${h.sampleName}%c of %c${this.samples.length}`,r.info,r.recognized,r.info,r.recognized),Q}),g=this.samples.reduce((h,d,Q)=>h+o[Q].length+46,0),C=new T(g);this.samples.forEach((h,d)=>{let Q=o[d],l,u,D=Q.length;h.isCompressed?(l=C.currentIndex,u=l+Q.length):(l=C.currentIndex/2,u=l+Q.length/2,D+=46),t.push(l),C.set(Q,C.currentIndex),C.currentIndex+=D,A.push(u)});let c=sA(new $("smpl",C.length,C),new T([115,100,116,97]));return sA(new $("LIST",c.length,c))}function Tn(t,A){let s=new T(46*(this.samples.length+1));return this.samples.forEach((n,o)=>{FA(s,n.sampleName,20);let g=t[o];QA(s,g);let C=A[o];QA(s,C);let c=n.sampleLoopStartIndex/2+g,h=n.sampleLoopEndIndex/2+g;n.isCompressed&&(c-=g,h-=g),QA(s,c),QA(s,h),QA(s,n.sampleRate),s[s.currentIndex++]=n.samplePitch,s[s.currentIndex++]=n.samplePitchCorrection,H(s,n.sampleLink),H(s,n.sampleType)}),FA(s,"EOS",46),sA(new $("shdr",s.length,s))}function Hn(){let t=10;for(let s of this.instruments)t+=s.instrumentZones.reduce((n,o)=>o.modulators.length*10+n,0);let A=new T(t),e=0;for(let s of this.instruments)for(let n of s.instrumentZones){n.modulatorZoneStartIndex=e;for(let o of n.modulators)H(A,o.sourceEnum),H(A,o.modulatorDestination),H(A,o.transformAmount),H(A,o.secondarySourceEnum),H(A,o.transformType),e++}return ge(A,0,10),sA(new $("imod",A.length,A))}function Yn(){let t=this.instruments.reduce((o,g)=>g.instrumentZones.length*4+o,4),A=new T(t),e=0,s=0,n=0;for(let o of this.instruments){o.instrumentZoneIndex=e;for(let g of o.instrumentZones)g.zoneID=e,H(A,s),H(A,n),s+=g.generators.length,n+=g.modulators.length,e++}return H(A,s),H(A,n),sA(new $("ibag",A.length,A))}function Jn(){let t=this.instruments.length*22+22,A=new T(t),e=0,s=0;for(let n of this.instruments)FA(A,n.instrumentName,20),H(A,e),e+=n.instrumentZones.length,n.instrumentID=s,s++;return FA(A,"EOI",20),H(A,e),sA(new $("inst",A.length,A))}function vn(){let t=4;for(let s of this.presets)t+=s.presetZones.reduce((n,o)=>(o.generators=o.generators.filter(g=>g.generatorType!==I.instrument&&g.generatorType!==I.keyRange&&g.generatorType!==I.velRange),(o.velRange.max!==127||o.velRange.min!==0)&&o.generators.unshift({generatorType:I.velRange,generatorValue:o.velRange.max<<8|o.velRange.min}),(o.keyRange.max!==127||o.keyRange.min!==0)&&o.generators.unshift({generatorType:I.keyRange,generatorValue:o.keyRange.max<<8|o.keyRange.min}),o.isGlobal||o.generators.push({generatorType:I.instrument,generatorValue:this.instruments.indexOf(o.instrument)}),o.generators.length*4+n),0);let A=new T(t),e=0;for(let s of this.presets)for(let n of s.presetZones){n.generatorZoneStartIndex=e;for(let o of n.generators)H(A,o.generatorType),H(A,o.generatorValue);e+=n.generators.length}return H(A,0),H(A,0),sA(new $("pgen",A.length,A))}function qn(){let t=10;for(let s of this.presets)t+=s.presetZones.reduce((n,o)=>o.modulators.length*10+n,0);let A=new T(t),e=0;for(let s of this.presets)for(let n of s.presetZones){n.modulatorZoneStartIndex=e;for(let o of n.modulators)H(A,o.sourceEnum),H(A,o.modulatorDestination),H(A,o.transformAmount),H(A,o.secondarySourceEnum),H(A,o.transformType),e++}return ge(A,0,10),sA(new $("pmod",A.length,A))}function Pn(){let t=this.presets.reduce((o,g)=>g.presetZones.length*4+o,4),A=new T(t),e=0,s=0,n=0;for(let o of this.presets){o.presetZoneStartIndex=e;for(let g of o.presetZones)g.zoneID=e,H(A,s),H(A,n),s+=g.generators.length,n+=g.modulators.length,e++}return H(A,s),H(A,n),sA(new $("pbag",A.length,A))}function Kn(){let t=this.presets.length*38+38,A=new T(t),e=0;for(let s of this.presets)FA(A,s.presetName,20),H(A,s.program),H(A,s.bank),H(A,e),QA(A,s.library),QA(A,s.genre),QA(A,s.morphology),e+=s.presetZones.length;return FA(A,"EOP",20),H(A,0),H(A,0),H(A,e),QA(A,0),QA(A,0),QA(A,0),sA(new $("phdr",A.length,A))}var To={compress:!1,compressionQuality:.5,compressionFunction:void 0};function Vn(t=To){if(t.compress&&typeof t.compressionFunction!="function")throw new TypeError("No compression function supplied but compression enabled.");SA("%cSaving soundfont...",r.info),m(`%cCompression: %c${t?.compress||"false"}%c quality: %c${t?.compressionQuality||"none"}`,r.info,r.recognized,r.info,r.recognized),m("%cWriting INFO...",r.info);let A=[];this.soundFontInfo.ISFT="SpessaSynth",t?.compress&&(this.soundFontInfo.ifil="3.0");for(let[K,_]of Object.entries(this.soundFontInfo))if(K==="ifil"||K==="iver"){let a=parseInt(_.split(".")[0]),nA=parseInt(_.split(".")[1]),j=new T(4);H(j,a),H(j,nA),A.push(sA(new $(K,4,j)))}else if(K==="DMOD")A.push(sA(new $(K,_.length,_)));else{let a=new T(_.length);FA(a,_),A.push(sA(new $(K,_.length,a)))}let e=De([new T([73,78,70,79]),...A]),s=sA(new $("LIST",e.length,e));m("%cWriting SDTA...",r.info);let n=[],o=[],g=Un.call(this,n,o,t?.compress,t?.compressionQuality||.5,t.compressionFunction);m("%cWriting PDTA...",r.info),m("%cWriting SHDR...",r.info);let C=Tn.call(this,n,o);m("%cWriting IGEN...",r.info);let c=Ln.call(this);m("%cWriting IMOD...",r.info);let h=Hn.call(this);m("%cWriting IBAG...",r.info);let d=Yn.call(this);m("%cWriting INST...",r.info);let Q=Jn.call(this),l=vn.call(this);m("%cWriting PMOD...",r.info);let u=qn.call(this);m("%cWriting PBAG...",r.info);let D=Pn.call(this);m("%cWriting PHDR...",r.info);let S=Kn.call(this),w=De([new T([112,100,116,97]),S,D,u,l,Q,d,h,c,C]),F=sA(new $("LIST",w.length,w));m("%cWriting the output file...",r.info);let v=De([new T([115,102,98,107]),s,g,F]),M=sA(new $("RIFF",v.length,v));return m(`%cSaved succesfully! Final file size: %c${M.length}`,r.info,r.recognized),X(),M}var ne=class t{constructor(A=void 0){this.soundFontInfo={},this.presets=[],this.samples=[],this.instruments=[],this.defaultModulators=Ze.map(e=>AA.copy(e)),A?.presets&&(this.presets.push(...A.presets),this.soundFontInfo=A.info)}removeUnusedElements(){this.instruments.forEach(A=>{A.useCount<1&&A.instrumentZones.forEach(e=>{e.isGlobal||e.sample.useCount--})}),this.instruments=this.instruments.filter(A=>A.useCount>0),this.samples=this.samples.filter(A=>A.useCount>0)}deleteInstrument(A){if(A.useCount>0)throw new Error(`Cannot delete an instrument that has ${A.useCount} usages.`);this.instruments.splice(this.instruments.indexOf(A),1),A.deleteInstrument(),this.removeUnusedElements()}deleteSample(A){if(A.useCount>0)throw new Error(`Cannot delete sample that has ${A.useCount} usages.`);this.samples.splice(this.samples.indexOf(A),1),this.removeUnusedElements()}deletePreset(A){A.deletePreset(),this.presets.splice(this.presets.indexOf(A),1),this.removeUnusedElements()}getPresetNoFallback(A,e,s=!1){let n=this.presets.find(o=>o.bank===A&&o.program===e);if(n)return n;if(s!==!1)return A===128?this.presets.find(o=>o.bank===128):this.presets.find(o=>o.program===e)}setSampleIDOffset(A){this.presets.forEach(e=>e.sampleIDOffset=A)}getPreset(A,e){let s=this.presets.find(n=>n.bank===A&&n.program===e);return s||(A===128?(s=this.presets.find(n=>n.bank===128&&n.program===e),s||(s=this.presets.find(n=>n.bank===128))):s=this.presets.find(n=>n.program===e&&n.bank!==128),s&&b(`%cPreset ${A}.${e} not found. Replaced with %c${s.presetName} (${s.bank}.${s.program})`,r.warn,r.recognized)),s||(b(`Preset ${e} not found. Defaulting to`,this.presets[0].presetName),s=this.presets[0]),s}getPresetByName(A){let e=this.presets.find(s=>s.presetName===A);return e||(b("Preset not found. Defaulting to:",this.presets[0].presetName),e=this.presets[0]),e}static mergeSoundfonts(...A){let e=A.shift(),s=e.presets;for(;A.length;)A.shift().presets.forEach(o=>{s.find(g=>g.bank===o.bank&&g.program===o.program)===void 0&&s.push(o)});return new t({presets:s,info:e.soundFontInfo})}};ne.prototype.write=Vn;function On(t){SA("%cLoading instruments...",r.info);for(let A=0;AA.deleteZone()),this.presetZones.length=0}deleteZone(A){this.presetZones[A].deleteZone(),this.presetZones.splice(A,1)}preload(A,e){for(let s=A;s{o.sample.isSampleLoaded||o.sample.getAudioData()})}preloadSpecific(A,e){this.getSamplesAndGenerators(A,e).forEach(s=>{s.sample.isSampleLoaded||s.sample.getAudioData()})}getSamplesAndGenerators(A,e){let s=this.foundSamplesAndGenerators[A][e];if(s)return s;if(this.presetZones.length<1)return[];function n(Q,l,u){return u>=Q&&u<=l}function o(Q,l){Q.push(...l.filter(u=>!Q.find(D=>D.generatorType===u.generatorType)))}function g(Q,l){Q.push(...l.filter(u=>!Q.find(D=>AA.isIdentical(u,D))))}let C=[],c=this.presetZones[0].isGlobal?[...this.presetZones[0].generators]:[],h=this.presetZones[0].isGlobal?[...this.presetZones[0].modulators]:[];return this.presetZones.filter(Q=>n(Q.keyRange.min,Q.keyRange.max,A)&&n(Q.velRange.min,Q.velRange.max,e)&&!Q.isGlobal).forEach(Q=>{if(Q.instrument.instrumentZones.length<1)return;let l=Q.generators,u=Q.modulators,D=Q.instrument.instrumentZones[0].isGlobal?[...Q.instrument.instrumentZones[0].generators]:[],S=Q.instrument.instrumentZones[0].isGlobal?[...Q.instrument.instrumentZones[0].modulators]:[];Q.instrument.instrumentZones.filter(F=>n(F.keyRange.min,F.keyRange.max,A)&&n(F.velRange.min,F.velRange.max,e)&&!F.isGlobal).forEach(F=>{let v=[...F.generators],M=[...F.modulators];o(l,c),o(v,D),g(u,h),g(M,S),g(M,this.defaultModulators);let K=[...M];for(let _=0;_AA.isIdentical(a,j));nA!==-1?K[nA]=K[nA].sumTransform(a):K.push(a)}C.push({instrumentGenerators:v,presetGenerators:l,modulators:K,sample:F.sample,sampleID:F.generators.find(_=>_.generatorType===I.sampleID).generatorValue})})}),this.foundSamplesAndGenerators[A][e]=C,C}};var Re=class{velRange={min:0,max:127};keyRange={min:0,max:127};isGlobal=!1;generators=[];modulators=[]};var $A=class extends Re{sample=void 0;useCount=0;deleteZone(){this.useCount--,!this.isGlobal&&this.sample.useCount--}},ce=class extends Re{instrument=void 0;deleteZone(){this.isGlobal||this.instrument.removeUseCount()}};var le=class{constructor(){this.instrumentName="",this.instrumentZones=[],this._useCount=0}addUseCount(){this._useCount++,this.instrumentZones.forEach(A=>A.useCount++)}removeUseCount(){this._useCount--;for(let A=0;AA.deleteZone()),this.instrumentZones.length=0}safeDeleteZone(A){return this.instrumentZones[A].useCount--,this.instrumentZones[A].useCount<1?(this.deleteZone(A),!0):!1}deleteZone(A){this.instrumentZones[A].deleteZone(),this.instrumentZones.splice(A,1)}};var At=class extends Qe{constructor(A,e){super(Ze),this.program=e&127,this.bank=A>>8&127,A>>31&&(this.bank=128),this.DLSInstrument=new le,this.DLSInstrument.addUseCount();let n=new ce;n.instrument=this.DLSInstrument,this.presetZones=[n]}};function Zn(t){this.verifyHeader(t,"LIST"),this.verifyText(V(t.chunkData,4),"ins ");let A=[];for(;t.chunkData.length>t.chunkData.currentIndex;)A.push(O(t.chunkData));let e=A.find(u=>u.header==="insh");if(!e)throw X(),new Error("No instrument header!");let s=y(e.chunkData,4),n=y(e.chunkData,4),o=y(e.chunkData,4),g=new At(n,o),C="unnamedPreset",c=DA(A,"INFO");if(c){let u=O(c.chunkData);for(;u.header!=="INAM";)u=O(c.chunkData);C=V(u.chunkData,u.chunkData.length).trim()}g.presetName=C,g.DLSInstrument.instrumentName=C,te(`%cParsing %c"${C}"%c...`,r.info,r.recognized,r.info);let h=DA(A,"lrgn");if(!h)throw X(),new Error("No region list!");let d=new $A;d.isGlobal=!0;let Q=DA(A,"lart"),l=DA(A,"lar2");this.readLart(Q,l,d),g.DLSInstrument.instrumentZones.push(d);for(let u=0;u>10&15;F===cA.linear&&w!==cA.linear&&(F=w);let v=s>>14&1,M=s>>15&1;g===I.initialAttenuation&&(M=!M),Q=qA(F,v,M,C.isCC,C.enum)}let l=s>>4&15,u=s>>8&1,D=s>>9&1,S=qA(l,u,D,d.isCC,d.enum);if(c){let w=S;S=Q,Q=w}return new AA({srcEnum:Q,secSrcEnum:S,dest:g,transform:0,amt:n})}function Ut(t,A){let e=t.chunkData,s=[],n=[];y(e,4);let o=y(e,4);for(let g=0;g>16;if(C===0&&c===0&&d===0){let u;switch(h){case G.pan:u=new L(I.pan,l);break;case G.gain:u=new L(I.initialAttenuation,-l*10/.4);break;case G.filterCutoff:u=new L(I.initialFilterFc,l);break;case G.filterQ:u=new L(I.initialFilterQ,l);break;case G.modLfoFreq:u=new L(I.freqModLFO,l);break;case G.modLfoDelay:u=new L(I.delayModLFO,l);break;case G.vibLfoFreq:u=new L(I.freqVibLFO,l);break;case G.vibLfoDelay:u=new L(I.delayVibLFO,l);break;case G.volEnvDelay:u=new L(I.delayVolEnv,l);break;case G.volEnvAttack:u=new L(I.attackVolEnv,l);break;case G.volEnvHold:u=new L(I.holdVolEnv,l);break;case G.volEnvDecay:u=new L(I.decayVolEnv,l);break;case G.volEnvRelease:u=new L(I.releaseVolEnv,l);break;case G.volEnvSustain:let D=(1e3-l)/10;u=new L(I.sustainVolEnv,D*10);break;case G.modEnvDelay:u=new L(I.delayModEnv,l);break;case G.modEnvAttack:u=new L(I.attackModEnv,l);break;case G.modEnvHold:u=new L(I.holdModEnv,l);break;case G.modEnvDecay:u=new L(I.decayModEnv,l);break;case G.modEnvRelease:u=new L(I.releaseModEnv,l);break;case G.modEnvSustain:let S=1e3-l;u=new L(I.sustainModEnv,S);break;case G.reverbSend:u=new L(I.reverbEffectsSend,l);break;case G.chorusSend:u=new L(I.chorusEffectsSend,l);break;case G.pitch:let w=Math.floor(l/100),F=Math.floor(l-w*100);u=new L(I.fineTune,F),s.push(new L(I.coarseTune,w));break}u&&s.push(u)}else{let u=!0;if(c===z.none)if(C===z.modLfo&&h===G.pitch)s.push(new L(I.modLfoToPitch,l));else if(C===z.modLfo&&h===G.gain)s.push(new L(I.modLfoToVolume,l));else if(C===z.modLfo&&h===G.filterCutoff)s.push(new L(I.modLfoToFilterFc,l));else if(C===z.vibratoLfo&&h===G.pitch)s.push(new L(I.vibLfoToPitch,l));else if(C===z.modEnv&&h===G.pitch)s.push(new L(I.modEnvToPitch,l));else if(C===z.modEnv&&h===G.filterCutoff)s.push(new L(I.modEnvToFilterFc,l));else if(C===z.keyNum&&h===G.volEnvHold){s.push(new L(I.keyNumToVolEnvHold,l/-128));let D=Math.round(60/128*l);s.forEach(S=>{S.generatorType===I.holdVolEnv&&(S.generatorValue+=D)})}else if(C===z.keyNum&&h===G.volEnvDecay){s.push(new L(I.keyNumToVolEnvDecay,l/-128));let D=Math.round(60/128*l);s.forEach(S=>{S.generatorType===I.decayVolEnv&&(S.generatorValue+=D)})}else if(C===z.keyNum&&h===G.modEnvHold){s.push(new L(I.keyNumToModEnvHold,l/-128));let D=Math.round(60/128*l);s.forEach(S=>{S.generatorType===I.holdModEnv&&(S.generatorValue+=D)})}else if(C===z.keyNum&&h===G.modEnvDecay){s.push(new L(I.keyNumToModEnvDecay,l/-128));let D=Math.round(60/128*l);s.forEach(S=>{S.generatorType===I.decayModEnv&&(S.generatorValue+=D)})}else u=!1;else u=!1;if(u===!1){let D=Wn(C,c,h,d,l);D?(n.push(D),m("%cSucceeded converting to SF2 Modulator!",r.recognized)):b("Failed converting to SF2 Modulator!")}}}return n.find(g=>g.modulatorDestination===I.reverbEffectsSend)===void 0&&n.push(new AA({srcEnum:219,dest:I.reverbEffectsSend,amt:1e3,secSrcEnum:0,transform:0})),n.find(g=>g.modulatorDestination===I.chorusEffectsSend)===void 0&&n.push(new AA({srcEnum:221,dest:I.chorusEffectsSend,amt:1e3,secSrcEnum:0,transform:0})),A&&n.push(new AA({srcEnum:129,dest:I.vibLfoToPitch,amt:0,secSrcEnum:0,transform:0}),new AA({srcEnum:13,dest:I.vibLfoToPitch,amt:0,secSrcEnum:0,transform:0})),{modulators:n,generators:s}}function _n(t,A,e){if(t)for(;t.chunkData.currentIndext.chunkData.currentIndex;)A.push(O(t.chunkData));let e=A.find(j=>j.header==="rgnh"),s=y(e.chunkData,2),n=y(e.chunkData,2),o=y(e.chunkData,2),g=y(e.chunkData,2),C=new et({min:s,max:n},{min:o,max:g});y(e.chunkData,2);let c=y(e.chunkData,2);c!==0&&C.generators.push(new L(I.exclusiveClass,c));let h=DA(A,"lart"),d=DA(A,"lar2");this.readLart(h,d,C),C.isGlobal=!1;let Q=A.find(j=>j.header==="wsmp");y(Q.chunkData,4);let l=y(Q.chunkData,2),u=jA(Q.chunkData[Q.chunkData.currentIndex++],Q.chunkData[Q.chunkData.currentIndex++]),S=(y(Q.chunkData,4)|0)/-655360;y(Q.chunkData,4);let w=y(Q.chunkData,4),F,v={start:0,end:0};if(w===0)F=0;else{y(Q.chunkData,4),y(Q.chunkData,4)===0?F=1:F=3,v.start=y(Q.chunkData,4);let Y=y(Q.chunkData,4);v.end=v.start+Y}let M=A.find(j=>j.header==="wlnk");if(M===void 0)return;y(M.chunkData,2),y(M.chunkData,2),y(M.chunkData,4);let K=y(M.chunkData,4),_=this.samples[K];if(_===void 0)throw new Error("Invalid sample ID!");let nA=(S||_.sampleDbAttenuation)*10/.4;return C.setWavesample(nA,F,v,l,_,K,u),C}var ue=class{constructor(A,e,s,n,o,g,C,c){this.sampleName=A,this.sampleRate=e,this.samplePitch=s,this.samplePitchCorrection=n,this.sampleLink=o,this.sampleType=g,this.sampleLoopStartIndex=C,this.sampleLoopEndIndex=c,this.isCompressed=(g&16)>0,this.compressedData=void 0,this.useCount=0}getRawData(){let A=new Error("Not implemented");throw A.name="NotImplementedError",A}compressSample(A,e){if(!this.isCompressed)try{this.compressedData=e([this.getAudioData()],1,this.sampleRate,A),this.sampleType|=16,this.isCompressed=!0}catch{b(`Failed to compress ${this.sampleName}. Leaving as uncompressed!`),this.isCompressed=!1,this.compressedData=void 0,this.sampleType&=-17}}getAudioData(){let A=new Error("Not implemented");throw A.name="NotImplementedError",A}};var tt=class extends ue{constructor(A,e,s,n,o,g,C,c){super(A,e,s,n,0,1,o*2,(g-1)*2),this.sampleData=C,this.sampleDbAttenuation=c}getAudioData(){return this.sampleData}sampleDbAttenuation;sampleData;getRawData(){if(this.isCompressed){if(!this.compressedData)throw new Error("Compressed but no data??");return this.compressedData}let A=new Uint8Array(this.sampleData.length*2);for(let e=0;e>8&255}return A}};function jn(t){SA("%cLoading Wave samples...",r.recognized);let A=0;for(;t.chunkData.currentIndexY.header==="fmt ");if(!n)throw new Error("No fmt chunk in the wave file!");if(y(n.chunkData,2)!==1)throw new Error("Only PCM format in WAVE is supported.");if(y(n.chunkData,2)!==1)throw new Error("Only mono samples are supported.");let C=y(n.chunkData,4);y(n.chunkData,4),y(n.chunkData,2);let c=y(n.chunkData,2),h=c/8,d=Math.pow(2,h*8-1),Q=Math.pow(2,h*8),l,u=!1;c===8?(l=255,u=!0):l=d;let D=s.find(Y=>Y.header==="data");if(!D)throw new Error("No data chunk in the wave chunk!");let S=D.size/h,w=new Float32Array(S);for(let Y=0;Y=d&&(Z-=Q),w[Y]=Z/l)}let F=60,v=0,M=0,K=w.length-1,_=0,a=s.find(Y=>Y.header==="wsmp");if(a){if(y(a.chunkData,4),F=y(a.chunkData,2),v=jA(a.chunkData[a.chunkData.currentIndex++],a.chunkData[a.chunkData.currentIndex++]),_=(y(a.chunkData,4)|0)/-655360,y(a.chunkData,4),y(a.chunkData,4)===1){y(a.chunkData,8),M=y(a.chunkData,4);let CA=y(a.chunkData,4);K=M+CA}}else b("No wsmp chunk in wave... using sane defaults.");let nA=DA(s,"INFO"),j=`Unnamed ${A}`;if(nA){let Y=O(nA.chunkData);for(;Y.header!=="INAM"&&nA.chunkData.currentIndexc.header==="colh");if(!o)throw X(),new Error("No colh chunk!");this.instrumentAmount=y(o.chunkData,4),m(`%cInstruments amount: %c${this.instrumentAmount}`,r.info,r.recognized);let g=DA(s,"wvpl");this.readDLSSamples(g);let C=DA(s,"lins");if(!C)throw X(),new Error("No lins chunk!");this.readDLSInstrumentList(C),this.presets.sort((c,h)=>c.program-h.program+(c.bank-h.bank)),m(`%cParsing finished! %c"${this.soundFontInfo.INAM||"UNNAMED"}"%c has %c${this.presets.length} %cpresets, diff --git a/src/spessasynth_lib/synthetizer/worklet_system/worklet_utilities/volume_envelope.js b/src/spessasynth_lib/synthetizer/worklet_system/worklet_utilities/volume_envelope.js index c94af05b..7bfa6ed1 100644 --- a/src/spessasynth_lib/synthetizer/worklet_system/worklet_utilities/volume_envelope.js +++ b/src/spessasynth_lib/synthetizer/worklet_system/worklet_utilities/volume_envelope.js @@ -10,7 +10,8 @@ export const VOLUME_ENVELOPE_SMOOTHING_FACTOR = 0.001; const DB_SILENCE = 100; const PERCEIVED_DB_SILENCE = 90; -const PERCEIVED_GAIN_SILENCE = 0.005; +// around 96 dB of attenuation +const PERCEIVED_GAIN_SILENCE = 0.000015; // can't go lower than that (see #50) /** * VOL ENV STATES: