spessasynth_lib
Version:
MIDI and SoundFont2/DLS library with no compromises
13 lines (11 loc) • 292 kB
JavaScript
var Fs=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(A,t)=>(typeof require<"u"?require:A)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});function Hn(e){e=Math.floor(e);let A=Math.floor(e/60),t=Math.round(e-A*60);return{minutes:A,seconds:t,time:`${A.toString().padStart(2,"0")}:${t.toString().padStart(2,"0")}`}}function Rs(e){return e.trim().replaceAll(".mid","").replaceAll(".kar","").replaceAll(".rmi","").replaceAll(".xmf","").replaceAll(".mxmf","").replaceAll("_"," ").trim()}function HA(e){let A="";for(let t=0;t<e.length;t++){let n=e[t].toString(16).padStart(2,"0").toUpperCase();A+=n,A+=" "}return A}function Gs(e){let A=[];for(let t of e)(t===47||t===92)&&(t=10),A.push(t);return new Uint8Array(A)}var I={warn:"color: orange;",unrecognized:"color: red;",info:"color: aqua;",recognized:"color: lime",value:"color: yellow; background-color: black;"};var it={backwards:0,forwards:1,shuffleOn:2,shuffleOff:3,index:4},zA={loadNewSongList:0,pause:1,stop:2,play:3,setTime:4,changeMIDIMessageSending:5,setPlaybackRate:6,setLoop:7,changeSong:8,getMIDI:9,setSkipToFirstNote:10,setPreservePlaybackState:11},UA={midiEvent:0,songChange:1,timeChange:2,pause:3,getMIDI:4,midiError:5,metaEvent:6,loopCountChange:7,songListChange:8};var b=class extends Uint8Array{currentIndex=0;constructor(A){super(A)}slice(A,t){let n=super.slice(A,t);return n.currentIndex=0,n}};function FA(e){let A=e.reduce((s,o)=>s+o.length,0),t=new b(A),n=0;for(let s of e)t.set(s,n),n+=s.length;return t}var VA=class{ticks;messageStatusByte;messageData;constructor(A,t,n){this.ticks=A,this.messageStatusByte=t,this.messageData=n}};function xs(e){let A=e&240,t=e&15,n=t;switch(A){case 128:case 144:case 160:case 176:case 192:case 208:case 224:break;case 240:switch(t){case 0:n=-3;break;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:n=-1;break;case 15:n=-2;break}break;default:n=-1}return n}var R={noteOff:128,noteOn:144,polyPressure:160,controllerChange:176,programChange:192,channelPressure:208,pitchBend:224,systemExclusive:240,timecode:241,songPosition:242,songSelect:243,tuneRequest:246,clock:248,start:250,continue:251,stop:252,activeSensing:254,reset:255,sequenceNumber:0,text:1,copyright:2,trackName:3,instrumentName:4,lyric:5,marker:6,cuePoint:7,programName:8,midiChannelPrefix:32,midiPort:33,endOfTrack:47,setTempo:81,smpteOffset:84,timeSignature:88,keySignature:89,sequenceSpecific:127};function Zt(e){let A=e&240,t=e&15,n=-1,s=e;return A>=128&&A<=224&&(n=t,s=A),{status:s,channel:n}}var y={bankSelect:0,modulationWheel:1,breathController:2,footController:4,portamentoTime:5,dataEntryMsb:6,mainVolume:7,balance:8,pan:10,expressionController:11,effectControl1:12,effectControl2:13,generalPurposeController1:16,generalPurposeController2:17,generalPurposeController3:18,generalPurposeController4:19,lsbForControl0BankSelect:32,lsbForControl1ModulationWheel:33,lsbForControl2BreathController:34,lsbForControl4FootController:36,lsbForControl5PortamentoTime:37,lsbForControl6DataEntry:38,lsbForControl7MainVolume:39,lsbForControl8Balance:40,lsbForControl10Pan:42,lsbForControl11ExpressionController:43,lsbForControl12EffectControl1:44,lsbForControl13EffectControl2:45,sustainPedal:64,portamentoOnOff:65,sostenutoPedal:66,softPedal:67,legatoFootswitch:68,hold2Pedal:69,soundVariation:70,filterResonance:71,releaseTime:72,attackTime:73,brightness:74,decayTime:75,vibratoRate:76,vibratoDepth:77,vibratoDelay:78,soundController10:79,generalPurposeController5:80,generalPurposeController6:81,generalPurposeController7:82,generalPurposeController8:83,portamentoControl:84,reverbDepth:91,tremoloDepth:92,chorusDepth:93,detuneDepth:94,phaserDepth:95,dataIncrement:96,dataDecrement:97,NRPNLsb:98,NRPNMsb:99,RPNLsb:100,RPNMsb:101,allSoundOff:120,resetAllControllers:121,localControlOnOff:122,allNotesOff:123,omniModeOff:124,omniModeOn:125,monoModeOn:126,polyModeOn:127},Ms={8:2,9:2,10:2,11:2,12:1,13:1,14:2};var Ns=!1,bs=!0,Xt=!1,Ls=!0;function Us(e,A,t,n){Ns=e,bs=A,Xt=t,Ls=n}function p(...e){Ns&&console.info(...e)}function Y(...e){bs&&console.warn(...e)}function Ts(...e){Ls&&console.table(...e)}function se(...e){Xt&&console.group(...e)}function yA(...e){Xt&&console.groupCollapsed(...e)}function V(){Xt&&console.groupEnd()}function oe(e,A){let t=0;for(let n=8*(A-1);n>=0;n-=8)t|=e[e.currentIndex++]<<n;return t>>>0}function Ft(e,A){let t=new Array(A).fill(0);for(let n=A-1;n>=0;n--)t[n]=e&255,e>>=8;return t}function vs(e,A){if(this.sendMIDIMessages&&e.messageStatusByte>=128){this.sendMIDIMessage([e.messageStatusByte,...e.messageData]);return}let t=Zt(e.messageStatusByte),n=this.midiPortChannelOffsets[this.midiPorts[A]]||0;switch(t.channel+=n,t.status){case R.noteOn:let s=e.messageData[1];if(s>0)this.synth.noteOn(t.channel,e.messageData[0],s),this.playingNotes.push({midiNote:e.messageData[0],channel:t.channel,velocity:s});else{this.synth.noteOff(t.channel,e.messageData[0]);let E=this.playingNotes.findIndex(a=>a.midiNote===e.messageData[0]&&a.channel===t.channel);E!==-1&&this.playingNotes.splice(E,1)}break;case R.noteOff:this.synth.noteOff(t.channel,e.messageData[0]);let o=this.playingNotes.findIndex(E=>E.midiNote===e.messageData[0]&&E.channel===t.channel);o!==-1&&this.playingNotes.splice(o,1);break;case R.pitchBend:this.synth.pitchWheel(t.channel,e.messageData[1],e.messageData[0]);break;case R.controllerChange:if(this.midiData.isMultiPort&&this.midiData.usedChannelsOnTrack[A].size===0)return;this.synth.controllerChange(t.channel,e.messageData[0],e.messageData[1]);break;case R.programChange:if(this.midiData.isMultiPort&&this.midiData.usedChannelsOnTrack[A].size===0)return;this.synth.programChange(t.channel,e.messageData[0]);break;case R.polyPressure:this.synth.polyPressure(t.channel,e.messageData[0],e.messageData[1]);break;case R.channelPressure:this.synth.channelPressure(t.channel,e.messageData[0]);break;case R.systemExclusive:this.synth.systemExclusive(e.messageData,n);break;case R.setTempo:e.messageData.currentIndex=0;let r=6e7/oe(e.messageData,3);this.oneTickToSeconds=60/(r*this.midiData.timeDivision),this.oneTickToSeconds===0&&(this.oneTickToSeconds=60/(120*this.midiData.timeDivision),Y("invalid tempo! falling back to 120 BPM"),r=120);break;case R.timeSignature:case R.endOfTrack:case R.midiChannelPrefix:case R.songPosition:case R.activeSensing:case R.keySignature:case R.sequenceNumber:case R.sequenceSpecific:case R.text:case R.lyric:case R.copyright:case R.trackName:case R.marker:case R.cuePoint:case R.instrumentName:case R.programName:break;case R.midiPort:this.assignMIDIPort(A,e.messageData[0]);break;case R.reset:this.synth.stopAllChannels(),this.synth.resetAllControllers();break;default:Y(`%cUnrecognized Event: %c${e.messageStatusByte}%c status byte: %c${Object.keys(R).find(E=>R[E]===t.status)}`,I.warn,I.unrecognized,I.warn,I.value);break}t.status>=0&&t.status<128&&this.post(UA.metaEvent,[e,A])}function Hs(){for(let e=0;e<16;e++)this.synth.createWorkletChannel(!0)}function Ys(){if(!this.isActive)return;let e=this.currentTime;for(;this.playedTime<e;){let A=this._findFirstEventIndex(),t=this.tracks[A][this.eventIndex[A]];if(this._processEvent(t,A),this.eventIndex[A]++,A=this._findFirstEventIndex(),this.tracks[A].length<=this.eventIndex[A]){if(this.loop){this.setTimeTicks(this.midiData.loop.start);return}this.eventIndex[A]--,this.pause(!0),this.songs.length>1&&this.nextSong();return}let n=this.tracks[A][this.eventIndex[A]];this.playedTime+=this.oneTickToSeconds*(n.ticks-t.ticks);let s=this.loop&&(this.loopCount>0||this.loopCount===-1);if(this.midiData.loop.end<=t.ticks&&s){this.loopCount!==1/0&&(this.loopCount--,this.post(UA.loopCountChange,this.loopCount)),this.setTimeTicks(this.midiData.loop.start);return}else if(e>=this.duration){if(s){this.loopCount!==1/0&&(this.loopCount--,this.post(UA.loopCountChange,this.loopCount)),this.setTimeTicks(this.midiData.loop.start);return}this.eventIndex[A]--,this.pause(!0),this.songs.length>1&&this.nextSong();return}}}function Js(){let e=0,A=1/0;return this.tracks.forEach((t,n)=>{this.eventIndex[n]>=t.length||t[this.eventIndex[n]].ticks<A&&(e=n,A=t[this.eventIndex[n]].ticks)}),e}var at=class{timeDivision=0;duration=0;tempoChanges=[{ticks:0,tempo:120}];copyright="";tracksAmount=0;trackNames=[];lyrics=[];lyricsTicks=[];firstNoteOn=0;keyRange={min:0,max:127};lastVoiceEventTick=0;midiPorts=[0];midiPortChannelOffsets=[0];usedChannelsOnTrack=[];loop={start:0,end:0};midiName="";midiNameUsesFileName=!1;fileName="";rawMidiName;format=0;RMIDInfo={};bankOffset=0;isKaraokeFile=!1;isMultiPort=!1;MIDIticksToSeconds(A){let t=0;for(;A>0;){let n=this.tempoChanges.find(o=>o.ticks<A),s=A-n.ticks;t+=s*60/(n.tempo*this.timeDivision),A-=s}return t}_copyFromSequence(A){this.midiName=A.midiName,this.midiNameUsesFileName=A.midiNameUsesFileName,this.fileName=A.fileName,this.timeDivision=A.timeDivision,this.duration=A.duration,this.copyright=A.copyright,this.tracksAmount=A.tracksAmount,this.firstNoteOn=A.firstNoteOn,this.lastVoiceEventTick=A.lastVoiceEventTick,this.format=A.format,this.bankOffset=A.bankOffset,this.isKaraokeFile=A.isKaraokeFile,this.isMultiPort=A.isMultiPort,this.tempoChanges=[...A.tempoChanges],this.lyrics=A.lyrics.map(t=>new Uint8Array(t)),this.lyricsTicks=[...A.lyricsTicks],this.midiPorts=[...A.midiPorts],this.trackNames=[...A.trackNames],this.midiPortChannelOffsets=[...A.midiPortChannelOffsets],this.usedChannelsOnTrack=A.usedChannelsOnTrack.map(t=>new Set(t)),this.rawMidiName=A.rawMidiName?new Uint8Array(A.rawMidiName):void 0,this.loop={...A.loop},this.keyRange={...A.keyRange},this.RMIDInfo={...A.RMIDInfo}}};var Wt=class extends at{isEmbedded=!1;constructor(A){super(),this._copyFromSequence(A),this.isEmbedded=A.embeddedSoundFont!==void 0}},Qa={duration:99999,firstNoteOn:0,loop:{start:0,end:123456},lastVoiceEventTick:123456,lyrics:[],copyright:"",midiPorts:[],midiPortChannelOffsets:[],tracksAmount:0,tempoChanges:[{ticks:0,tempo:120}],fileName:"NOT_LOADED.mid",midiName:"Loading...",rawMidiName:new Uint8Array([76,111,97,100,105,110,103,46,46,46]),usedChannelsOnTrack:[],timeDivision:0,keyRange:{min:0,max:127},isEmbedded:!1,RMIDInfo:{},bankOffset:0,midiNameUsesFileName:!1,format:0};function N(e,A){let t=0;for(let n=0;n<A;n++)t|=e[e.currentIndex++]<<n*8;return t>>>0}function Xe(e,A,t){for(let n=0;n<t;n++)e[e.currentIndex++]=A>>n*8&255}function H(e,A){e[e.currentIndex++]=A&255,e[e.currentIndex++]=A>>8}function AA(e,A){Xe(e,A,4)}function Ne(e,A){let t=A<<8|e;return t>32767?t-65536:t}function Ks(e){return e>127?e-256:e}function eA(e,A,t=void 0,n=!0){if(t){let s=e.slice(e.currentIndex,e.currentIndex+A);return e.currentIndex+=A,new TextDecoder(t.replace(/[^\x20-\x7E]/g,"")).decode(s.buffer)}else{let s=!1,o="";for(let r=0;r<A;r++){let E=e[e.currentIndex++];if(!s){if((E<32||E>127)&&E!==10){if(n){s=!0;continue}else if(E===0){s=!0;continue}}o+=String.fromCharCode(E)}}return o}}function It(e,A=0){let t=e.length;A>0&&(t=A);let n=new b(t);return TA(n,e,A),n}function fe(e){return It(e,e.length+1)}function TA(e,A,t=0){t>0&&A.length>t&&(A=A.slice(0,t));for(let n=0;n<A.length;n++)e[e.currentIndex++]=A.charCodeAt(n);if(t>A.length)for(let n=0;n<t-A.length;n++)e[e.currentIndex++]=0;return e}var hA=class{constructor(A,t,n){this.header=A,this.size=t,this.chunkData=n}};function IA(e,A=!0,t=!1){let n=eA(e,4),s=N(e,4),o;return A&&(o=new b(e.buffer.slice(e.currentIndex,e.currentIndex+s))),(A||t)&&(e.currentIndex+=s),s%2!==0&&e[e.currentIndex]===0&&e.currentIndex++,new hA(n,s,o)}function uA(e,A=void 0){let t=8+e.size;e.size%2!==0&&t++,A&&(t+=A.length);let n=new b(t);return A&&(n.set(A,n.currentIndex),n.currentIndex+=A.length),TA(n,e.header),AA(n,t-8-(A?.length||0)),n.set(e.chunkData,n.currentIndex),n}function z(e,A,t=!1,n=!1){if(t){let C=new Uint8Array(A.length+1);C.set(A),A=C}let s=8,o=s+A.length,r=A.length;o%2!==0&&o++;let E=e;n&&(o+=4,r+=4,s+=4,E="LIST");let a=new b(o);return TA(a,E),AA(a,r),n&&TA(a,e),a.set(A,s),a}function ZA(e,A){return e.find(t=>t.header!=="LIST"?!1:(t.chunkData.currentIndex=0,eA(t.chunkData,4)===A))}function SA(e){let A=0;for(;e;){let t=e[e.currentIndex++];if(A=A<<7|t&127,t>>7!==1)break}return A}function _t(e){let A=[e&127];for(e>>=7;e>0;)A.unshift(e&127|128),e>>=7;return A}var i={INVALID:-1,startAddrsOffset:0,endAddrOffset:1,startloopAddrsOffset:2,endloopAddrsOffset:3,startAddrsCoarseOffset:4,modLfoToPitch:5,vibLfoToPitch:6,modEnvToPitch:7,initialFilterFc:8,initialFilterQ:9,modLfoToFilterFc:10,modEnvToFilterFc:11,endAddrsCoarseOffset:12,modLfoToVolume:13,unused1:14,chorusEffectsSend:15,reverbEffectsSend:16,pan:17,unused2:18,unused3:19,unused4:20,delayModLFO:21,freqModLFO:22,delayVibLFO:23,freqVibLFO:24,delayModEnv:25,attackModEnv:26,holdModEnv:27,decayModEnv:28,sustainModEnv:29,releaseModEnv:30,keyNumToModEnvHold:31,keyNumToModEnvDecay:32,delayVolEnv:33,attackVolEnv:34,holdVolEnv:35,decayVolEnv:36,sustainVolEnv:37,releaseVolEnv:38,keyNumToVolEnvHold:39,keyNumToVolEnvDecay:40,instrument:41,reserved1:42,keyRange:43,velRange:44,startloopAddrsCoarseOffset:45,keyNum:46,velocity:47,initialAttenuation:48,reserved2:49,endloopAddrsCoarseOffset:50,coarseTune:51,fineTune:52,sampleID:53,sampleModes:54,reserved3:55,scaleTuning:56,exclusiveClass:57,overridingRootKey:58,unused5:59,endOper:60},X=[];X[i.startAddrsOffset]={min:0,max:32768,def:0};X[i.endAddrOffset]={min:-32768,max:32768,def:0};X[i.startloopAddrsOffset]={min:-32768,max:32768,def:0};X[i.endloopAddrsOffset]={min:-32768,max:32768,def:0};X[i.startAddrsCoarseOffset]={min:0,max:32768,def:0};X[i.modLfoToPitch]={min:-12e3,max:12e3,def:0};X[i.vibLfoToPitch]={min:-12e3,max:12e3,def:0};X[i.modEnvToPitch]={min:-12e3,max:12e3,def:0};X[i.initialFilterFc]={min:1500,max:13500,def:13500};X[i.initialFilterQ]={min:0,max:960,def:0};X[i.modLfoToFilterFc]={min:-12e3,max:12e3,def:0};X[i.modEnvToFilterFc]={min:-12e3,max:12e3,def:0};X[i.endAddrsCoarseOffset]={min:-32768,max:32768,def:0};X[i.modLfoToVolume]={min:-960,max:960,def:0};X[i.chorusEffectsSend]={min:0,max:1e3,def:0};X[i.reverbEffectsSend]={min:0,max:1e3,def:0};X[i.pan]={min:-500,max:500,def:0};X[i.delayModLFO]={min:-12e3,max:5e3,def:-12e3};X[i.freqModLFO]={min:-16e3,max:4500,def:0};X[i.delayVibLFO]={min:-12e3,max:5e3,def:-12e3};X[i.freqVibLFO]={min:-16e3,max:4500,def:0};X[i.delayModEnv]={min:-32768,max:5e3,def:-32768};X[i.attackModEnv]={min:-32768,max:8e3,def:-32768};X[i.holdModEnv]={min:-12e3,max:5e3,def:-12e3};X[i.decayModEnv]={min:-12e3,max:8e3,def:-12e3};X[i.sustainModEnv]={min:0,max:1e3,def:0};X[i.releaseModEnv]={min:-7200,max:8e3,def:-12e3};X[i.keyNumToModEnvHold]={min:-1200,max:1200,def:0};X[i.keyNumToModEnvDecay]={min:-1200,max:1200,def:0};X[i.delayVolEnv]={min:-12e3,max:5e3,def:-12e3};X[i.attackVolEnv]={min:-12e3,max:8e3,def:-12e3};X[i.holdVolEnv]={min:-12e3,max:5e3,def:-12e3};X[i.decayVolEnv]={min:-12e3,max:8e3,def:-12e3};X[i.sustainVolEnv]={min:0,max:1440,def:0};X[i.releaseVolEnv]={min:-7200,max:8e3,def:-12e3};X[i.keyNumToVolEnvHold]={min:-1200,max:1200,def:0};X[i.keyNumToVolEnvDecay]={min:-1200,max:1200,def:0};X[i.startloopAddrsCoarseOffset]={min:-32768,max:32768,def:0};X[i.keyNum]={min:-1,max:127,def:-1};X[i.velocity]={min:-1,max:127,def:-1};X[i.initialAttenuation]={min:-250,max:1440,def:0};X[i.endloopAddrsCoarseOffset]={min:-32768,max:32768,def:0};X[i.coarseTune]={min:-120,max:120,def:0};X[i.fineTune]={min:-12700,max:12700,def:0};X[i.scaleTuning]={min:0,max:1200,def:100};X[i.exclusiveClass]={min:0,max:99999,def:0};X[i.overridingRootKey]={min:-1,max:127,def:-1};X[i.sampleModes]={min:0,max:3,def:0};var U=class{generatorType=i.INVALID;generatorValue=0;constructor(A=i.INVALID,t=0,n=!0){if(this.generatorType=A,t===void 0)throw new Error("No value provided.");if(this.generatorValue=Math.round(t),n){let s=X[A];s!==void 0&&(this.generatorValue=Math.max(s.min,Math.min(s.max,this.generatorValue)))}}};function Os(e,A,t){let n=X[e]||{min:0,max:32768,def:0},s=A.find(C=>C.generatorType===e),o=0;s&&(o=s.generatorValue);let r=t.find(C=>C.generatorType===e),E=n.def;r&&(E=r.generatorValue);let a=E+o;return e===i.initialAttenuation?a:Math.max(n.min,Math.min(n.max,a))}var j={noController:0,noteOnVelocity:2,noteOnKeyNum:3,polyPressure:10,channelPressure:13,pitchWheel:14,pitchWheelRange:16,link:127},GA={linear:0,concave:1,convex:2,switch:3},_=class e{currentValue=0;sourceEnum;secondarySourceEnum;modulatorDestination;transformAmount;transformType;constructor(A,t,n,s,o){this.sourceEnum=A,this.modulatorDestination=n,this.secondarySourceEnum=t,this.transformAmount=s,this.transformType=o,this.modulatorDestination>58&&(this.modulatorDestination=i.INVALID),this.sourcePolarity=this.sourceEnum>>9&1,this.sourceDirection=this.sourceEnum>>8&1,this.sourceUsesCC=this.sourceEnum>>7&1,this.sourceIndex=this.sourceEnum&127,this.sourceCurveType=this.sourceEnum>>10&3,this.secSrcPolarity=this.secondarySourceEnum>>9&1,this.secSrcDirection=this.secondarySourceEnum>>8&1,this.secSrcUsesCC=this.secondarySourceEnum>>7&1,this.secSrcIndex=this.secondarySourceEnum&127,this.secSrcCurveType=this.secondarySourceEnum>>10&3,this.isEffectModulator=(this.sourceEnum===219||this.sourceEnum===221)&&this.secondarySourceEnum===0&&(this.modulatorDestination===i.reverbEffectsSend||this.modulatorDestination===i.chorusEffectsSend)}static copy(A){return new e(A.sourceEnum,A.secondarySourceEnum,A.modulatorDestination,A.transformAmount,A.transformType)}static isIdentical(A,t,n=!1){return A.sourceEnum===t.sourceEnum&&A.modulatorDestination===t.modulatorDestination&&A.secondarySourceEnum===t.secondarySourceEnum&&A.transformType===t.transformType&&(!n||A.transformAmount===t.transformAmount)}static debugString(A){function t(o,r){return Object.keys(o).find(E=>o[E]===r)}let n=t(GA,A.sourceCurveType);n+=A.sourcePolarity===0?" unipolar ":" bipolar ",n+=A.sourceDirection===0?"forwards ":"backwards ",A.sourceUsesCC?n+=t(y,A.sourceIndex):n+=t(j,A.sourceIndex);let s=t(GA,A.secSrcCurveType);return s+=A.secSrcPolarity===0?" unipolar ":" bipolar ",s+=A.secSrcCurveType===0?"forwards ":"backwards ",A.secSrcUsesCC?s+=t(y,A.secSrcIndex):s+=t(j,A.secSrcIndex),`Modulator:
Source: ${n}
Secondary source: ${s}
Destination: ${t(i,A.modulatorDestination)}
Trasform amount: ${A.transformAmount}
Transform type: ${A.transformType}
`}sumTransform(A){return new e(this.sourceEnum,this.secondarySourceEnum,this.modulatorDestination,this.transformAmount+A.transformAmount,this.transformType)}},Yn=960,Jn=GA.concave;function re(e,A,t,n,s){return e<<10|A<<9|t<<8|n<<7|s}var Ei=[new _(re(Jn,0,1,0,j.noteOnVelocity),0,i.initialAttenuation,Yn,0),new _(129,0,i.vibLfoToPitch,50,0),new _(re(Jn,0,1,1,y.mainVolume),0,i.initialAttenuation,Yn,0),new _(13,0,i.vibLfoToPitch,50,0),new _(526,16,i.fineTune,12700,0),new _(650,0,i.pan,500,0),new _(re(Jn,0,1,1,y.expressionController),0,i.initialAttenuation,Yn,0),new _(219,0,i.reverbEffectsSend,200,0),new _(221,0,i.chorusEffectsSend,200,0)],Bi=[new _(re(GA.linear,0,0,0,j.polyPressure),0,i.vibLfoToPitch,50,0),new _(re(GA.linear,0,0,1,y.tremoloDepth),0,i.modLfoToVolume,24,0),new _(re(GA.convex,1,0,1,y.attackTime),0,i.attackVolEnv,6e3,0),new _(re(GA.linear,1,0,1,y.releaseTime),0,i.releaseVolEnv,3600,0),new _(re(GA.linear,1,0,1,y.brightness),0,i.initialFilterFc,6e3,0),new _(re(GA.linear,1,0,1,y.filterResonance),0,i.initialFilterQ,250,0)],qs=Ei.concat(Bi);var xA=128,zt=147,be=new Int16Array(zt).fill(0),MA=(e,A)=>be[e]=A<<7;MA(y.mainVolume,100);MA(y.balance,64);MA(y.expressionController,127);MA(y.pan,64);MA(y.portamentoOnOff,127);MA(y.filterResonance,64);MA(y.releaseTime,64);MA(y.attackTime,64);MA(y.brightness,64);MA(y.decayTime,64);MA(y.vibratoRate,64);MA(y.vibratoDepth,64);MA(y.vibratoDelay,64);MA(y.generalPurposeController6,64);MA(y.generalPurposeController8,64);MA(y.RPNLsb,127);MA(y.RPNMsb,127);MA(y.NRPNLsb,127);MA(y.NRPNMsb,127);var jt=1;be[y.portamentoControl]=jt;MA(xA+j.pitchWheel,64);MA(xA+j.pitchWheelRange,2);var cA={channelTuning:0,channelTransposeFine:1,modulationMultiplier:2,masterTuning:3,channelTuningSemitones:4},Kn=Object.keys(cA).length,On=new Float32Array(Kn);On[cA.modulationMultiplier]=1;var YA={Idle:0,RPCoarse:1,RPFine:2,NRPCoarse:3,NRPFine:4,DataCoarse:5,DataFine:6},Ps={velocityOverride:128};var Vs="spessasynth-worklet-system";var $t="gs";function gt(e){return e.messageData[0]===67&&e.messageData[2]===76&&e.messageData[5]===126&&e.messageData[6]===0}function An(e){return e.messageData[0]===65&&e.messageData[2]===66&&e.messageData[3]===18&&e.messageData[4]===64&&(e.messageData[5]&16)!==0&&e.messageData[6]===21}function en(e){return e.messageData[0]===65&&e.messageData[2]===66&&e.messageData[6]===127}function tn(e){return e.messageData[0]===126&&e.messageData[2]===9&&e.messageData[3]===1}function nn(e){return e.messageData[0]===126&&e.messageData[2]===9&&e.messageData[3]===3}var on=64,Zs=121;function Xs(e){return e==="gm2"?Zs:0}function jA(e){return e===120||e===126||e===127}function sn(e){return jA(e)||e===on||e===Zs}function Ct(e,A,t,n,s,o){let r=e,E=0;if(n)RA(t)?sn(A)||(r=A):t==="gm2"&&(r=A);else{let a=!0;switch(t){case"gm":p(`%cIgnoring the Bank Select (${A}), as the synth is in GM mode.`,I.info),a=!1;break;case"xg":a=sn(A),jA(A)?E=2:o%16!==9&&(E=1);break;case"gm2":A===120?E=2:o%16!==9&&(E=1)}s&&(A=128),A===128&&!s&&(A=e),a&&(r=A)}return{newBank:r,drumsStatus:E}}function Et(e,A,t,n){return n?t?jA(e)?e:128:sn(e)||A===0&&e!==0?e:sn(A)?0:A:t?128:e}function RA(e){return e==="gm2"||e==="xg"}function qn(e){return new VA(e,R.systemExclusive,new b([65,16,66,18,64,0,127,0,65,247]))}function Bt(e,A,t,n){return new VA(n,R.controllerChange|e%16,new b([A,t]))}function hi(e,A){let t=16|[1,2,3,4,5,6,7,8,0,9,10,11,12,13,14,15][e%16],n=[65,16,66,18,64,t,21,1],o=128-(64+t+21+1)%128;return new VA(A,R.systemExclusive,new b([...n,o,247]))}function Ws(e=[],A=[],t=[],n=[]){let s=this;yA("%cApplying changes to the MIDI file...",I.info),p("Desired program changes:",e),p("Desired CC changes:",A),p("Desired channels to clear:",t),p("Desired channels to transpose:",n);let o=new Set;e.forEach(M=>{o.add(M.channel)});let r="gs",E=!1,a=Array(s.tracks.length).fill(0),C=s.tracks.length;function c(){let M=0,L=1/0;return s.tracks.forEach((G,g)=>{a[g]>=G.length||G[a[g]].ticks<L&&(M=g,L=G[a[g]].ticks)}),M}let h=s.midiPorts.slice(),d={},B=0;function m(M,L){s.usedChannelsOnTrack[M].size!==0&&(B===0&&(B+=16,d[L]=0),d[L]===void 0&&(d[L]=B,B+=16),h[M]=L)}s.midiPorts.forEach((M,L)=>{m(L,M)});let u=B,S=Array(u).fill(!0),w=Array(u).fill(0),k=Array(u).fill(0);for(n.forEach(M=>{let L=Math.trunc(M.keyShift),G=M.keyShift-L;w[M.channel]=L,k[M.channel]=G});C>0;){let M=c(),L=s.tracks[M];if(a[M]>=L.length){C--;continue}let G=a[M]++,g=L[G],x=()=>{L.splice(G,1),a[M]--},O=(BA,sA=0)=>{L.splice(G+sA,0,BA),a[M]++},gA=d[h[M]]||0;if(g.messageStatusByte===R.midiPort){m(M,g.messageData[0]);continue}if(g.messageStatusByte<=R.sequenceSpecific&&g.messageStatusByte>=R.sequenceNumber)continue;let tA=g.messageStatusByte&240,T=g.messageStatusByte&15,$=T+gA;if(t.indexOf($)!==-1){x();continue}switch(tA){case R.noteOn:if(S[$]){S[$]=!1,A.filter(EA=>EA.channel===$).forEach(EA=>{let v=Bt(T,EA.controllerNumber,EA.controllerValue,g.ticks);O(v)});let oA=k[$];if(oA!==0){let EA=oA*64+64,v=Bt(T,y.RPNMsb,0,g.ticks),J=Bt(T,y.RPNLsb,1,g.ticks),W=Bt($,y.dataEntryMsb,EA,g.ticks),q=Bt(T,y.lsbForControl6DataEntry,0,g.ticks);O(q),O(W),O(J),O(v)}if(o.has($)){let EA=e.find(rA=>rA.channel===$),v=Math.max(0,Math.min(EA.bank,127)),J=EA.program;p(`%cSetting %c${EA.channel}%c to %c${v}:${J}%c. Track num: %c${M}`,I.info,I.recognized,I.info,I.recognized,I.info,I.recognized);let W=new VA(g.ticks,R.programChange|T,new b([J]));O(W);let q=(rA,KA)=>{let Ie=Bt(T,rA?y.lsbForControl0BankSelect:y.bankSelect,KA,g.ticks);O(Ie)};RA(r)?EA.isDrum?(p(`%cAdding XG Drum change on track %c${M}`,I.recognized,I.value),q(!1,jA(v)?v:127),q(!0,0)):v===on?(q(!1,on),q(!0,0)):(q(!1,0),q(!0,v)):(q(!1,v),EA.isDrum&&T!==9&&(p(`%cAdding GS Drum change on track %c${M}`,I.recognized,I.value),O(hi(T,g.ticks))))}}g.messageData[0]+=w[$];break;case R.noteOff:g.messageData[0]+=w[$];break;case R.programChange:if(o.has($)){x();continue}break;case R.controllerChange:let BA=g.messageData[0];if(A.find(oA=>oA.channel===$&&BA===oA.controllerNumber)!==void 0){x();continue}if((BA===y.bankSelect||BA===y.lsbForControl0BankSelect)&&o.has($)){x();continue}break;case R.systemExclusive:if(gt(g))p("%cXG system on detected",I.info),r="xg",E=!0;else if(g.messageData[0]===67&&g.messageData[2]===76&&g.messageData[3]===8&&g.messageData[5]===3)o.has(g.messageData[4]+gA)&&x();else if(en(g)){E=!0,p("%cGS on detected!",I.recognized);break}else(tn(g)||nn(g))&&(p("%cGM/2 on detected, removing!",I.info),x(),E=!1)}}if(!E&&e.length>0){let M=0;s.tracks[0][0].messageStatusByte===R.trackName&&M++,s.tracks[0].splice(M,0,qn(0)),p("%cGS on not detected. Adding it.",I.info)}this.flush(),V()}function _s(e){let A=[],t=[],n=[],s=[];e.channelSnapshots.forEach((o,r)=>{if(o.isMuted){t.push(r);return}let E=o.channelTransposeKeyShift+o.customControllers[cA.channelTransposeFine]/100;E!==0&&A.push({channel:r,keyShift:E}),o.lockPreset&&n.push({channel:r,program:o.program,bank:o.bank,isDrum:o.drumChannel}),o.lockedControllers.forEach((a,C)=>{if(!a||C>127||C===y.bankSelect)return;let c=o.midiControllers[C]>>7;s.push({channel:r,controllerNumber:C,controllerValue:c})})}),this.modifyMIDI(n,s,t,A)}var fA={name:"INAM",album:"IPRD",album2:"IALB",artist:"IART",genre:"IGNR",picture:"IPIC",copyright:"ICOP",creationDate:"ICRD",comment:"ICMT",engineer:"IENG",software:"ISFT",encoding:"IENC",midiEncoding:"MENC",bankOffset:"DBNK"},Le="utf-8",ci="Created using SpessaSynth";function zs(e,A,t=0,n="Shift_JIS",s={},o=!0){let r=this;if(se("%cWriting the RMIDI File...",I.info),p(`%cConfiguration: Bank offset: %c${t}%c, encoding: %c${n}`,I.info,I.value,I.info,I.value),p("metadata",s),p("Initial bank offset",r.bankOffset),o){let w=function(){let G=0,g=1/0;return r.tracks.forEach((x,O)=>{u[O]>=x.length||x[u[O]].ticks<g&&(G=O,g=x[u[O]].ticks)}),G},B="gm",m=[],u=Array(r.tracks.length).fill(0),S=r.tracks.length,k=Array(r.tracks.length).fill(0),M=16+r.midiPortChannelOffsets.reduce((G,g)=>g>G?g:G),L=[];for(let G=0;G<M;G++)L.push({program:0,drums:G%16===9,lastBank:void 0,lastBankLSB:void 0,hasBankSelect:!1});for(;S>0;){let G=w(),g=r.tracks[G];if(u[G]>=g.length){S--;continue}let x=g[u[G]];u[G]++;let O=r.midiPortChannelOffsets[k[G]];if(x.messageStatusByte===R.midiPort){k[G]=x.messageData[0];continue}let gA=x.messageStatusByte&240;if(gA!==R.controllerChange&&gA!==R.programChange&&gA!==R.systemExclusive)continue;if(gA===R.systemExclusive){if(!An(x)){gt(x)?B="xg":en(x)?B="gs":tn(x)?(B="gm",m.push({tNum:G,e:x})):nn(x)&&(B="gm2");continue}let oA=[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][x.messageData[5]&15]+O;L[oA].drums=!!(x.messageData[7]>0&&x.messageData[5]>>4);continue}let tA=(x.messageStatusByte&15)+O,T=L[tA];if(gA===R.programChange){let oA=RA(B),EA=x.messageData[0];T.drums?A.presets.findIndex(q=>q.program===EA&&q.isDrumPreset(oA,!0))===-1&&(x.messageData[0]=A.presets.find(q=>q.isDrumPreset(oA))?.program||0,p(`%cNo drum preset %c${EA}%c. Channel %c${tA}%c. Changing program to ${x.messageData[0]}.`,I.info,I.unrecognized,I.info,I.recognized,I.info)):A.presets.findIndex(q=>q.program===EA&&!q.isDrumPreset(oA))===-1&&(x.messageData[0]=A.presets.find(q=>!q.isDrumPreset(oA))?.program||0,p(`%cNo preset %c${EA}%c. Channel %c${tA}%c. Changing program to ${x.messageData[0]}.`,I.info,I.unrecognized,I.info,I.recognized,I.info)),T.program=x.messageData[0];let v=Math.max(0,T.lastBank?.messageData[1]-r.bankOffset),J=T?.lastBankLSB?.messageData[1]-r.bankOffset||0;if(T.lastBank===void 0)continue;let W=Et(v,J,T.drums,oA);if(A.presets.findIndex(q=>q.bank===W&&q.program===x.messageData[0])===-1){let q=A.presets.find(rA=>rA.program===x.messageData[0])?.bank+t||t;T.lastBank.messageData[1]=q,T?.lastBankLSB?.messageData&&(T.lastBankLSB.messageData[1]=q),p(`%cNo preset %c${W}:${x.messageData[0]}%c. Channel %c${tA}%c. Changing bank to ${q}.`,I.info,I.unrecognized,I.info,I.recognized,I.info)}else{let q=W;RA(B)&&W===128&&(W=127);let rA=(W===128?128:q)+t;T.lastBank.messageData[1]=rA,T?.lastBankLSB?.messageData&&!T.drums&&(T.lastBankLSB.messageData[1]=T.lastBankLSB.messageData[1]-r.bankOffset+t),p(`%cPreset %c${W}:${x.messageData[0]}%c exists. Channel %c${tA}%c. Changing bank to ${rA}.`,I.info,I.recognized,I.info,I.recognized,I.info)}continue}let $=x.messageData[0]===y.lsbForControl0BankSelect;if(x.messageData[0]!==y.bankSelect&&!$)continue;T.hasBankSelect=!0;let BA=x.messageData[1],sA=Ct(T?.lastBank?.messageData[1]||0,BA,B,$,T.drums,tA);sA.drumsStatus===2?T.drums=!0:sA.drumsStatus===1&&(T.drums=!1),$?T.lastBankLSB=x:T.lastBank=x}if(L.forEach((G,g)=>{if(G.hasBankSelect===!0)return;let x=g%16,O=R.programChange|x,gA=Math.floor(g/16)*16,tA=r.midiPortChannelOffsets.indexOf(gA),T=r.tracks.find((oA,EA)=>r.midiPorts[EA]===tA&&r.usedChannelsOnTrack[EA].has(x));if(T===void 0)return;let $=T.findIndex(oA=>oA.messageStatusByte===O);if($===-1){let oA=T.findIndex(J=>J.messageStatusByte>128&&J.messageStatusByte<240&&(J.messageStatusByte&15)===x);if(oA===-1)return;let EA=T[oA].ticks,v=A.getPreset(0,0).program;T.splice(oA,0,new VA(EA,R.programChange|x,new b([v]))),$=oA}p(`%cAdding bank select for %c${g}`,I.info,I.recognized);let BA=T[$].ticks,sA=A.getPreset(0,G.program,RA(B))?.bank+t||t;T.splice($,0,new VA(BA,R.controllerChange|x,new b([y.bankSelect,sA])))}),B!=="gs"&&!RA(B)){for(let g of m)r.tracks[g.tNum].splice(r.tracks[g.tNum].indexOf(g.e),1);let G=0;r.tracks[0][0].messageStatusByte===R.trackName&&G++,r.tracks[0].splice(G,0,qn(0))}}let E=new b(r.writeMIDI().buffer),a=[It("INFO")],C=new TextEncoder;if(a.push(z(fA.software,C.encode("SpessaSynth"),!0)),s.name!==void 0?(a.push(z(fA.name,C.encode(s.name),!0)),n=Le):a.push(z(fA.name,r.rawMidiName,!0)),s.creationDate!==void 0)n=Le,a.push(z(fA.creationDate,C.encode(s.creationDate),!0));else{let B=new Date().toLocaleString(void 0,{weekday:"long",year:"numeric",month:"long",day:"numeric",hour:"numeric",minute:"numeric"});a.push(z(fA.creationDate,fe(B),!0))}if(s.comment!==void 0&&(n=Le,a.push(z(fA.comment,C.encode(s.comment)))),s.engineer!==void 0&&a.push(z(fA.engineer,C.encode(s.engineer),!0)),s.album!==void 0&&(n=Le,a.push(z(fA.album,C.encode(s.album),!0)),a.push(z(fA.album2,C.encode(s.album),!0))),s.artist!==void 0&&(n=Le,a.push(z(fA.artist,C.encode(s.artist),!0))),s.genre!==void 0&&(n=Le,a.push(z(fA.genre,C.encode(s.genre),!0))),s.picture!==void 0&&a.push(z(fA.picture,new Uint8Array(s.picture))),s.copyright!==void 0)n=Le,a.push(z(fA.copyright,C.encode(s.copyright),!0));else{let B=r.copyright.length>0?r.copyright:ci;a.push(z(fA.copyright,fe(B)))}let c=new b(2);Xe(c,t,2),a.push(z(fA.bankOffset,c)),s.midiEncoding!==void 0&&(a.push(z(fA.midiEncoding,C.encode(s.midiEncoding))),n=Le),a.push(z(fA.encoding,fe(n)));let h=FA(a),d=FA([It("RMID"),z("data",E),z("LIST",h),e]);return p("%cFinished!",I.info),V(),z("RIFF",d)}function js(){let e=this;if(!e.tracks)throw new Error("MIDI has no tracks!");let A=[];for(let s of e.tracks){let o=[],r=0,E;for(let a of s){let C=a.ticks-r,c;a.messageStatusByte<=R.sequenceSpecific?c=[255,a.messageStatusByte,..._t(a.messageData.length),...a.messageData]:a.messageStatusByte===R.systemExclusive?c=[240,..._t(a.messageData.length),...a.messageData]:(c=[],E!==a.messageStatusByte&&(E=a.messageStatusByte,c.push(a.messageStatusByte)),c.push(...a.messageData)),o.push(..._t(C)),o.push(...c),r+=C}A.push(new Uint8Array(o))}function t(s,o){for(let r=0;r<s.length;r++)o.push(s.charCodeAt(r))}let n=[];t("MThd",n),n.push(...Ft(6,4)),n.push(0,e.format),n.push(...Ft(e.tracksAmount,2)),n.push(...Ft(e.timeDivision,2));for(let s of A)t("MTrk",n),n.push(...Ft(s.length,4)),n.push(...s);return new Uint8Array(n)}function $s(e){let A=this;yA("%cSearching for all used programs and keys...",I.info);let t=16+A.midiPortChannelOffsets.reduce((h,d)=>d>h?d:h),n=[];for(let h=0;h<t;h++){let d=h%16===9?128:0;n.push({program:0,bank:d,bankLSB:0,actualBank:d,drums:h%16===9,string:`${d}:0`})}let s="gs";function o(h){let d=Et(h.bank,h.bankLSB,h.drums,RA(s)),B=e.getPreset(d,h.program,RA(s));h.actualBank=B.bank,h.program=B.program,h.string=h.actualBank+":"+h.program,r[h.string]||(p(`%cDetected a new preset: %c${h.string}`,I.info,I.recognized),r[h.string]=new Set)}let r={},E=Array(A.tracks.length).fill(0),a=A.tracks.length;function C(){let h=0,d=1/0;return A.tracks.forEach((B,m)=>{E[m]>=B.length||B[E[m]].ticks<d&&(h=m,d=B[E[m]].ticks)}),h}let c=A.midiPorts.slice();for(n.forEach(h=>{o(h)});a>0;){let h=C(),d=A.tracks[h];if(E[h]>=d.length){a--;continue}let B=d[E[h]];if(E[h]++,B.messageStatusByte===R.midiPort){c[h]=B.messageData[0];continue}let m=B.messageStatusByte&240;if(m!==R.noteOn&&m!==R.controllerChange&&m!==R.programChange&&m!==R.systemExclusive)continue;let u=(B.messageStatusByte&15)+A.midiPortChannelOffsets[c[h]]||0,S=n[u];switch(m){case R.programChange:S.program=B.messageData[0],o(S);break;case R.controllerChange:let w=B.messageData[0]===y.lsbForControl0BankSelect;if(B.messageData[0]!==y.bankSelect&&!w||s==="gs"&&S.drums)continue;let k=B.messageData[1],M=Math.max(0,k-A.bankOffset);switch(w?S.bankLSB=M:S.bank=M,Ct(S.bank,M,s,w,S.drums,u).drumsStatus){case 0:break;case 1:S.drums=!1,o(S);break;case 2:S.drums=!0,o(S);break}break;case R.noteOn:if(B.messageData[1]===0)continue;r[S.string].add(`${B.messageData[0]}-${B.messageData[1]}`);break;case R.systemExclusive:if(!An(B)){gt(B)&&(s="xg",p("%cXG on detected!",I.recognized));continue}let G=[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][B.messageData[5]&15]+A.midiPortChannelOffsets[c[h]],g=!!(B.messageData[7]>0&&B.messageData[5]>>4);S=n[G],S.drums=g,o(S);break}}for(let h of Object.keys(r))r[h].size===0&&(p(`%cDetected change but no keys for %c${h}`,I.info,I.value),delete r[h]);return V(),r}var ge=class e extends at{embeddedSoundFont=void 0;tracks=[];isDLSRMIDI=!1;static copyFrom(A){let t=new e;return t._copyFromSequence(A),t.isDLSRMIDI=A.isDLSRMIDI,t.embeddedSoundFont=A.embeddedSoundFont?A.embeddedSoundFont.slice(0):void 0,t.tracks=A.tracks.map(n=>[...n]),t}_parseInternal(){se("%cInterpreting MIDI events...",I.info);let A=!1;this.keyRange={max:0,min:127};let t=[],n=!1;typeof this.RMIDInfo.ICOP<"u"&&(n=!0);let s=!1;typeof this.RMIDInfo.INAM<"u"&&(s=!0);let o=null,r=null;for(let c=0;c<this.tracks.length;c++){let h=this.tracks[c],d=new Set,B=!1;for(let u of h){if(u.messageStatusByte>=128&&u.messageStatusByte<240){B=!0;for(let w=0;w<u.messageData.length;w++)u.messageData[w]=Math.min(127,u.messageData[w]);switch(u.ticks>this.lastVoiceEventTick&&(this.lastVoiceEventTick=u.ticks),u.messageStatusByte&240){case R.controllerChange:switch(u.messageData[0]){case 2:case 116:o=u.ticks;break;case 4:case 117:r===null?r=u.ticks:r=0;break;case 0:this.isDLSRMIDI&&u.messageData[1]!==0&&u.messageData[1]!==127&&(p("%cDLS RMIDI with offset 1 detected!",I.recognized),this.bankOffset=1)}break;case R.noteOn:d.add(u.messageStatusByte&15);let w=u.messageData[0];this.keyRange.min=Math.min(this.keyRange.min,w),this.keyRange.max=Math.max(this.keyRange.max,w);break}}u.messageData.currentIndex=0;let S=eA(u.messageData,u.messageData.length);switch(u.messageData.currentIndex=0,u.messageStatusByte){case R.setTempo:u.messageData.currentIndex=0,this.tempoChanges.push({ticks:u.ticks,tempo:6e7/oe(u.messageData,3)}),u.messageData.currentIndex=0;break;case R.marker:switch(S.trim().toLowerCase()){default:break;case"start":case"loopstart":o=u.ticks;break;case"loopend":r=u.ticks}u.messageData.currentIndex=0;break;case R.copyright:n||(u.messageData.currentIndex=0,t.push(eA(u.messageData,u.messageData.length,void 0,!1)),u.messageData.currentIndex=0);break;case R.lyric:if(S.trim().startsWith("@KMIDI KARAOKE FILE")&&(this.isKaraokeFile=!0,p("%cKaraoke MIDI detected!",I.recognized)),this.isKaraokeFile)u.messageStatusByte=R.text;else{this.lyrics.push(u.messageData),this.lyricsTicks.push(u.ticks);break}case R.text:let k=S.trim();k.startsWith("@KMIDI KARAOKE FILE")?(this.isKaraokeFile=!0,p("%cKaraoke MIDI detected!",I.recognized)):this.isKaraokeFile&&(k.startsWith("@T")||k.startsWith("@A")?A?t.push(k.substring(2).trim()):(this.midiName=k.substring(2).trim(),A=!0,s=!0,this.rawMidiName=It(this.midiName)):k[0]!=="@"&&(this.lyrics.push(Gs(u.messageData)),this.lyricsTicks.push(u.ticks)));break;case R.trackName:break}}this.usedChannelsOnTrack.push(d),this.trackNames[c]="";let m=h.find(u=>u.messageStatusByte===R.trackName);if(m){m.messageData.currentIndex=0;let u=eA(m.messageData,m.messageData.length);this.trackNames[c]=u,B||t.push(u)}}this.tempoChanges.reverse(),p("%cCorrecting loops, ports and detecting notes...",I.info);let E=[];for(let c of this.tracks){let h=c.find(d=>(d.messageStatusByte&240)===R.noteOn);h&&E.push(h.ticks)}this.firstNoteOn=Math.min(...E),p(`%cFirst note-on detected at: %c${this.firstNoteOn}%c ticks!`,I.info,I.recognized,I.info),o!==null&&r===null?(o=this.firstNoteOn,r=this.lastVoiceEventTick):(o===null&&(o=this.firstNoteOn),(r===null||r===0)&&(r=this.lastVoiceEventTick)),this.loop={start:o,end:r},p(`%cLoop points: start: %c${this.loop.start}%c end: %c${this.loop.end}`,I.info,I.recognized,I.info,I.recognized);let a=0;this.midiPorts=[],this.midiPortChannelOffsets=[];for(let c=0;c<this.tracks.length;c++)if(this.midiPorts.push(-1),this.usedChannelsOnTrack[c].size!==0)for(let h of this.tracks[c]){if(h.messageStatusByte!==R.midiPort)continue;let d=h.messageData[0];this.midiPorts[c]=d,this.midiPortChannelOffsets[d]===void 0&&(this.midiPortChannelOffsets[d]=a,a+=16)}let C=1/0;for(let c of this.midiPorts)c!==-1&&C>c&&(C=c);if(C===1/0&&(C=0),this.midiPorts=this.midiPorts.map(c=>c===-1?C:c),this.midiPortChannelOffsets.length===0&&(this.midiPortChannelOffsets=[0]),this.midiPortChannelOffsets.length<2?p("%cNo additional MIDI Ports detected.",I.info):(this.isMultiPort=!0,p("%cMIDI Ports detected!",I.recognized)),!s)if(this.tracks.length>1){if(this.tracks[0].find(c=>c.messageStatusByte>=R.noteOn&&c.messageStatusByte<R.polyPressure)===void 0){let c=this.tracks[0].find(h=>h.messageStatusByte===R.trackName);c&&(this.rawMidiName=c.messageData,c.messageData.currentIndex=0,this.midiName=eA(c.messageData,c.messageData.length,void 0,!1))}}else{let c=this.tracks[0].find(h=>h.messageStatusByte===R.trackName);c&&(this.rawMidiName=c.messageData,c.messageData.currentIndex=0,this.midiName=eA(c.messageData,c.messageData.length,void 0,!1))}if(n||(this.copyright=t.map(c=>c.trim().replace(/(\r?\n)+/g,`
`)).filter(c=>c.length>0).join(`
`)||""),this.midiName=this.midiName.trim(),this.midiNameUsesFileName=!1,this.midiName.length===0){p("%cNo name detected. Using the alt name!",I.info),this.midiName=Rs(this.fileName),this.midiNameUsesFileName=!0,this.rawMidiName=new Uint8Array(this.midiName.length);for(let c=0;c<this.midiName.length;c++)this.rawMidiName[c]=this.midiName.charCodeAt(c)}else p(`%cMIDI Name detected! %c"${this.midiName}"`,I.info,I.recognized);this.tracks.some(c=>c[0].ticks===0)||this.tracks[0].unshift(new VA(0,R.trackName,new b(this.rawMidiName.buffer))),this.duration=this.MIDIticksToSeconds(this.lastVoiceEventTick),p("%cSuccess!",I.recognized),V()}flush(){for(let A of this.tracks)A.sort((t,n)=>t.ticks-n.ticks);this._parseInternal()}};ge.prototype.writeMIDI=js;ge.prototype.modifyMIDI=Ws;ge.prototype.applySnapshotToMIDI=_s;ge.prototype.writeRMIDI=zs;ge.prototype.getUsedProgramsAndKeys=$s;var Pn;(()=>{var e=Uint8Array,A=Uint16Array,t=Int32Array,n=new e([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),s=new e([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),o=new e([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),r=function(v,J){for(var W=new A(31),q=0;q<31;++q)W[q]=J+=1<<v[q-1];for(var rA=new t(W[30]),q=1;q<30;++q)for(var KA=W[q];KA<W[q+1];++KA)rA[KA]=KA-W[q]<<5|q;return{b:W,r:rA}},E=r(n,2),a=E.b,C=E.r;a[28]=258,C[258]=28;var c=r(s,0),h=c.b,d=c.r,B=new A(32768);for(k=0;k<32768;++k)m=(k&43690)>>1|(k&21845)<<1,m=(m&52428)>>2|(m&13107)<<2,m=(m&61680)>>4|(m&3855)<<4,B[k]=((m&65280)>>8|(m&255)<<8)>>1;var m,k,u=function(v,J,W){for(var q=v.length,rA=0,KA=new A(J);rA<q;++rA)v[rA]&&++KA[v[rA]-1];var Ie=new A(J);for(rA=1;rA<J;++rA)Ie[rA]=Ie[rA-1]+KA[rA-1]<<1;var ce;if(W){ce=new A(1<<J);var le=15-J;for(rA=0;rA<q;++rA)if(v[rA])for(var $e=rA<<4|v[rA],pe=J-v[rA],aA=Ie[v[rA]-1]++<<pe,QA=aA|(1<<pe)-1;aA<=QA;++aA)ce[B[aA]>>le]=$e}else for(ce=new A(q),rA=0;rA<q;++rA)v[rA]&&(ce[rA]=B[Ie[v[rA]-1]++]>>15-v[rA]);return ce},S=new e(288);for(k=0;k<144;++k)S[k]=8;var k;for(k=144;k<256;++k)S[k]=9;var k;for(k=256;k<280;++k)S[k]=7;var k;for(k=280;k<288;++k)S[k]=8;var k,w=new e(32);for(k=0;k<32;++k)w[k]=5;var k,M=u(S,9,1),L=u(w,5,1),G=function(v){for(var J=v[0],W=1;W<v.length;++W)v[W]>J&&(J=v[W]);return J},g=function(v,J,W){var q=J/8|0;return(v[q]|v[q+1]<<8)>>(J&7)&W},x=function(v,J){var W=J/8|0;return(v[W]|v[W+1]<<8|v[W+2]<<16)>>(J&7)},O=function(v){return(v+7)/8|0},gA=function(v,J,W){return(J==null||J<0)&&(J=0),(W==null||W>v.length)&&(W=v.length),new e(v.subarray(J,W))},tA=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],T=function(v,J,W){var q=new Error(J||tA[v]);if(q.code=v,Error.captureStackTrace&&Error.captureStackTrace(q,T),!W)throw q;return q},$=function(v,J,W,q){var rA=v.length,KA=q?q.length:0;if(!rA||J.f&&!J.l)return W||new e(0);var Ie=!W,ce=Ie||J.i!=2,le=J.i;Ie&&(W=new e(rA*3));var $e=function(Kt){var Me=W.length;if(Kt>Me){var yt=new e(Math.max(Me*2,Kt));yt.set(W),W=yt}},pe=J.f||0,aA=J.p||0,QA=J.b||0,Qe=J.l,XA=J.d,Re=J.m,Ge=J.n,dt=rA*8;do{if(!Qe){pe=g(v,aA,1);var At=g(v,aA+1,3);if(aA+=3,At)if(At==1)Qe=M,XA=L,Re=9,Ge=5;else if(At==2){var ut=g(v,aA,31)+257,kn=g(v,aA+10,15)+4,wn=ut+g(v,aA+5,31)+1;aA+=14;for(var et=new e(wn),xe=new e(19),WA=0;WA<kn;++WA)xe[o[WA]]=g(v,aA+WA*3,7);aA+=kn*3;for(var Fn=G(xe),vt=(1<<Fn)-1,tt=u(xe,Fn,1),WA=0;WA<wn;){var ft=tt[g(v,aA,vt)];aA+=ft&15;var OA=ft>>4;if(OA<16)et[WA++]=OA;else{var ye=0,mt=0;for(OA==16?(mt=3+g(v,aA,3),aA+=2,ye=et[WA-1]):OA==17?(mt=3+g(v,aA,7),aA+=3):OA==18&&(mt=11+g(v,aA,127),aA+=7);mt--;)et[WA++]=ye}}var Rn=et.subarray(0,ut),Se=et.subarray(ut);Re=G(Rn),Ge=G(Se),Qe=u(Rn,Re,1),XA=u(Se,Ge,1)}else T(1);else{var OA=O(aA)+4,Ht=v[OA-4]|v[OA-3]<<8,Yt=OA+Ht;if(Yt>rA){le&&T(0);break}ce&&$e(QA+Ht),W.set(v.subarray(OA,Yt),QA),J.b=QA+=Ht,J.p=aA=Yt*8,J.f=pe;continue}if(aA>dt){le&&T(0);break}}ce&&$e(QA+131072);for(var ds=(1<<Re)-1,us=(1<<Ge)-1,Jt=aA;;Jt=aA){var ye=Qe[x(v,aA)&ds],qe=ye>>4;if(aA+=ye&15,aA>dt){le&&T(0);break}if(ye||T(2),qe<256)W[QA++]=qe;else if(qe==256){Jt=aA,Qe=null;break}else{var Gn=qe-254;if(qe>264){var WA=qe-257,De=n[WA];Gn=g(v,aA,(1<<De)-1)+a[WA],aA+=De}var nt=XA[x(v,aA)&us],Pe=nt>>4;nt||T(3),aA+=nt&15;var Se=h[Pe];if(Pe>3){var De=s[Pe];Se+=x(v,aA)&(1<<De)-1,aA+=De}if(aA>dt){le&&T(0);break}ce&&$e(QA+131072);var pt=QA+Gn;if(QA<Se){var st=KA-Se,NA=Math.min(Se,pt);for(st+QA<0&&T(3);QA<NA;++QA)W[QA]=q[st+QA]}for(;QA<pt;++QA)W[QA]=W[QA-Se]}}J.l=Qe,J.p=Jt,J.b=QA,J.f=pe,Qe&&(pe=1,J.m=Re,J.d=XA,J.n=Ge)}while(!pe);return QA!=W.length&&Ie?gA(W,0,QA):W.subarray(0,QA)},BA=new e(0);function sA(v,J){return $(v,{i:2},J&&J.out,J&&J.dictionary)}var oA=typeof TextDecoder<"u"&&new TextDecoder,EA=0;try{oA.decode(BA,{stream:!0}),EA=1}catch{}Pn=sA})();var Vn={XMFFileType:0,nodeName:1,nodeIDNumber:2,resourceFormat:3,filenameOnDisk:4,filenameExtensionOnDisk:5,macOSFileTypeAndCreator:6,mimeType:7,title:8,copyrightNotice:9,comment:10,autoStart:11,preload:12,contentDescription:13,ID3Metadata:14},ht={inLineResource:1,inFileResource:2,inFileNode:3,externalFile:4,externalXMF:5,XMFFileURIandNodeID:6},Zn={StandardMIDIFile:0,StandardMIDIFileType1:1,DLS1:2,DLS2:3,DLS22:4,mobileDLS:5},li={standard:0,MMA:1,registered:2,nonRegistered:3},rn={none:0,MMAUnpacker:1,registered:2,nonRegistered:3},Xn=class e{length;itemCount;metadataLength;metadata={};nodeData;innerNodes=[];packedContent=!1;nodeUnpackers=[];resourceFormat="unknown";constructor(A){let t=A.currentIndex;this.length=SA(A),this.itemCount=SA(A);let n=SA(A),s=A.currentIndex-t,o=n-s,r=A.slice(A.currentIndex,A.currentIndex+o);A.currentIndex+=o,this.metadataLength=SA(r);let E=r.slice(r.currentIndex,r.currentIndex+this.metadataLength);r.currentIndex+=this.metadataLength;let a,C;for(;E.currentIndex<E.length;){if(E[E.currentIndex]===0)E.currentIndex++,a=SA(E),Object.values(Vn).indexOf(a)===-1?(Y(`Unknown field specifier: ${a}`),C=`unknown_${a}`):C=Object.keys(Vn).find(u=>Vn[u]===a);else{let u=SA(E);a=eA(E,u),C=a}let m=SA(E);if(m===0){let u=SA(E),S=E.slice(E.currentIndex,E.currentIndex+u);E.currentIndex+=u,SA(S)<4?this.metadata[C]=eA(S,u-1):this.metadata[C]=S.slice(S.currentIndex)}else Y(`International content: ${m}`),E.currentIndex+=SA(E)}let c=r.currentIndex,h=SA(r),d=r.slice(r.currentIndex,c+h);if(r.currentIndex=c+h,h>0)for(this.packedContent=!0;d.currentIndex<h;){let B={};switch(B.id=SA(d),B.id){case rn.nonRegistered:case rn.registered:throw V(),new Error(`Unsupported unpacker ID: ${B.id}`);default:throw V(),new Error(`Unknown unpacker ID: ${B.id}`);case rn.none:B.standardID=SA(d);break;case rn.MMAUnpacker:let m=d[d.currentIndex++];m===0&&(m<<=8,m|=d[d.currentIndex++],m<<=8,m|=d[d.currentIndex++]);let u=SA(d);B.manufacturerID=m,B.manufacturerInternalID=u;break}B.decodedSize=SA(d),this.nodeUnpackers.push(B)}switch(A.currentIndex=t+n,this.referenceTypeID=SA(A),this.nodeData=A.slice(A.currentIndex,t+this.length),A.currentIndex=t+this.length,this.referenceTypeID){case ht.inLineResource:break;case ht.externalXMF:case ht.inFileNode:case ht.XMFFileURIandNodeID:case ht.externalFile:case ht.inFileResource:throw V(),new Error(`Unsupported reference type: ${this.referenceTypeID}`);default:throw V(),new Error(`Unknown reference type: ${this.referenceTypeID}`)}if(this.isFile){if(this.packedContent){let m=this.nodeData.slice(2,this.nodeData.length);p(`%cPacked content. Attemting to deflate. Target size: %c${this.nodeUnpackers[0].decodedSize}`,I.warn,I.value);try{this.nodeData=new b(Pn(m).buffer)}catch(u){throw V(),new Error(`Error unpacking XMF file contents: ${u.message}.`)}}let B=this.metadata.resourceFormat;if(B===void 0)Y("No resource format for this file node!");else{B[0]!==li.standard&&(Y(`Non-standard formatTypeID: ${B}`),this.resourceFormat=B.toString());let u=B[1];Object.values(Zn).indexOf(u)===-1?Y(`Unrecognized resource format: ${u}`):this.resourceFormat=Object.keys(Zn).find(S=>Zn[S]===u)}}else for(this.resourceFormat="folder";this.nodeData.currentIndex<this.nodeData.length;){let B=this.nodeData.currentIndex,m=SA(this.nodeData),u=this.nodeData.slice(B,B+m);this.nodeData.currentIndex=B+m,this.innerNodes.push(new e(u))}}get isFile(){return this.itemCount===0}};function Ao(e,A){e.bankOffset=0;let t=eA(A,4);if(t!=="XMF_")throw V(),new SyntaxError(`Invalid XMF Header! Expected "_XMF", got "${t}"`);se("%cParsing XMF file...",I.info);let n=eA(A,4);if(p(`%cXMF version: %c${n}`,I.info,I.recognized),n==="2.00"){let a=oe(A,4),C=oe(A,4);p(`%cFile Type ID: %c${a}%c, File Type Revision ID: %c${C}`,I.info,I.recognized,I.info,I.recognized)}SA(A);let s=SA(A);A.currentIndex+=s,A.currentIndex=SA(A);let o=new Xn(A),r,E=a=>{let C=(c,h)=>{a.metadata[c]!==void 0&&typeof a.metadata[c]=="string"&&(e.RMIDInfo[h]=a.metadata[c])};if(C("nodeName",fA.name),C("title",fA.name),C("copyrightNotice",fA.copyright),C("comment",fA.comment),a.isFile)switch(a.resourceFormat){default:return;case"DLS1":case"DLS2":case"DLS22":case"mobileDLS":p("%cFound embedded DLS!",I.recognized),e.embeddedSoundFont=a.nodeData.buffer;break;case"StandardMIDIFile":case"StandardMIDIFileType1":p("%cFound embedded MIDI!",I.recognized),r=a.nodeData;break}else for(let c of a.innerNodes)E(c)};return E(o),V(),r}var an=class extends ge{constructor(A,t=""){super(),yA("%cParsing MIDI File...",I.info),this.fileName=t;let n=new b(A),s,o=eA(n,4);if(n.currentIndex-=4,o==="RIFF"){n.currentIndex+=8;let E=eA(n,4,void 0,!1);if(E!=="RMID")throw V(),new SyntaxError(`Invalid RMIDI Header! Expected "RMID", got "${E}"`);let a=IA(n);if(a.header!=="data")throw V(),new SyntaxError(`Invalid RMIDI Chunk header! Expected "data", got "${E}"`);for(s=a.chunkData;n.currentIndex<=n.length;){let C=n.currentIndex,c=IA(n,!0);if(c.header==="RIFF"){let h=eA(c.chunkData,4).toLowerCase();h==="sfbk"||h==="sfpk"||h==="dls "?(p("%cFound embedded soundfont!",I.recognized),this.embeddedSoundFont=n.slice(C,C+c.size).buffer):Y(`Unknown RIFF chunk: "${h}"`),h==="dls "&&(this.isDLSRMIDI=!0)}else if(c.header==="LIST"&&eA(c.chunkData,4)==="INFO"){for(p("%cFound RMIDI INFO chunk!",I.recognized),this.RMIDInfo={};c.chunkData.currentIndex<=c.size;){let d=IA(c.chunkData,!0);this.RMIDInfo[d.header]=d.chunkData}this.RMIDInfo.ICOP&&(this.copyright=eA(this.RMIDInfo.ICOP,this.RMIDInfo.ICOP.length,void 0,!1).replaceAll(`
`," ")),this.RMIDInfo.INAM&&(this.rawMidiName=this.RMIDInfo[fA.name],this.midiName=eA(this.rawMidiName,this.rawMidiName.length,void 0,!1).replaceAll(`
`," ")),this.RMIDInfo.IALB&&!this.RMIDInfo.IPRD&&(this.RMIDInfo.IPRD=this.RMIDInfo.IALB),this.RMIDInfo.IPRD&&!this.RMIDInfo.IALB&&(this.RMIDInfo.IALB=this.RMIDInfo.IPRD),this.bankOffset=1,this.RMIDInfo[fA.bankOffset]&&(this.bankOffset=N(this.RMIDInfo[fA.bankOffset],2))}}this.isDLSRMIDI&&(this.bankOffset=0),this.embeddedSoundFont===void 0&&(this.bankOffset=0)}else o==="XMF_"?s=Ao(this,n):s=n;let r=this._readMIDIChunk(s);if(r.type!=="MThd")throw V(),new SyntaxError(`Invalid MIDI Header! Expected "MThd", got "${r.type}"`);if(r.size!==6)throw V(),new RangeError(`Invalid MIDI header chunk size! Expected 6, got ${r.size}`);this.format=oe(r.data,2),this.tracksAmount=oe(r.data,2),this.timeDivision=oe(r.data,2);for(let E=0;E<this.tracksAmount;E++){let a=[],C=this._readMIDIChunk(s);if(C.type!=="MTrk")throw V(),new SyntaxError(`Invalid track header! Expected "MTrk" got "${C.type}"`);let c,h=0;for(this.format===2&&E>0&&(h+=this.tracks[E-1][this.tracks[E-1].length-1].ticks);C.data.currentIndex