spessasynth_lib
Version:
MIDI and SoundFont2/DLS library for the browsers with no compromises
1 lines • 316 kB
JavaScript
var Ge=(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')});var Ya=(e=>typeof Ge<"u"?Ge:typeof Proxy<"u"?new Proxy(e,{get:(A,t)=>(typeof Ge<"u"?Ge:A)[t]}):e)(function(e){if(typeof Ge<"u")return Ge.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),q=class extends Uint8Array{currentIndex=0;slice(e,A){let t=super.slice(e,A);return t.currentIndex=0,t}};function se(e,A=e.length,t=0){let n="";for(let s=0;s<A;s++){let a=e[t+s];if(a===0)return n;n+=String.fromCharCode(a)}return n}function lA(e,A){let t=e.currentIndex;return e.currentIndex+=A,se(e,A,t)}function oe(e,A=!1,t=!1){let n=e.length;A&&n++,t&&n%2!==0&&n++;let s=new q(n);return kA(s,e),s}function kA(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}function L(e,A){let t=Hs(e,A,e.currentIndex);return e.currentIndex+=A,t}function Hs(e,A,t=0){let n=0;for(let s=0;s<A;s++)n|=e[t+s]<<s*8;return n>>>0}function lt(e,A,t){for(let n=0;n<t;n++)e[e.currentIndex++]=A>>n*8&255}function _(e,A){e[e.currentIndex++]=A&255,e[e.currentIndex++]=A>>8}function rA(e,A){lt(e,A,4)}function _n(e,A){let t=A<<8|e;return t>32767?t-65536:t}function Ja(e){return e>127?e-256:e}var Ys=class{header;size;data;constructor(e,A,t){this.header=e,this.size=A,this.data=t}};function aA(e,A=!0,t=!1){let n=lA(e,4),s=L(e,4);n===""&&(s=0);let a;return A?a=e.slice(e.currentIndex,e.currentIndex+s):a=new q(0),(A||t)&&(e.currentIndex+=s,s%2!==0&&e.currentIndex++),new Ys(n,s,a)}function IA(e,A,t=!1,n=!1){if(e.length!==4)throw new Error(`Invalid header length: ${e}`);let s=8,a=e,o=A.length;t&&o++;let I=o;n&&(s+=4,I+=4,a="LIST");let r=s+o;r%2!==0&&r++;let g=new q(r);return kA(g,a),rA(g,I),n&&kA(g,e),g.set(A,s),g}function MA(e,A,t=!1){let n=8,s=e,a=A.reduce((g,c)=>c.length+g,0),o=a;t&&(n+=4,o+=4,s="LIST");let I=n+a;I%2!==0&&I++;let r=new q(I);return kA(r,s),rA(r,o),t&&kA(r,e),A.forEach(g=>{r.set(g,n),n+=g.length}),r}function pe(e,A){return e.find(t=>t.header!=="LIST"?!1:(t.data.currentIndex=4,se(t.data,4)===A))}function jn(e,A){return{...A,...e??{}}}function je(e,A,t=0){let n=0;for(let s=0;s<A;s++)n=n<<8|e[t+s];return n>>>0}function Xe(e,A){let t=je(e,A,e.currentIndex);return e.currentIndex+=A,t}function Rt(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 uA(e){let A=0;for(;e;){let t=e[e.currentIndex++];if(A=A<<7|t&127,t>>7!==1)break}return A}function Cn(e){let A=[e&127];for(e>>=7;e>0;)A.unshift(e&127|128),e>>=7;return A}function Rn(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 ne(e){let A="";for(let t of e){let n=t.toString(16).padStart(2,"0").toUpperCase();A+=n,A+=" "}return A}var E={warn:"color: orange;",unrecognized:"color: red;",info:"color: aqua;",recognized:"color: lime",value:"color: yellow; background-color: black;"},Js;(()=>{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]),a=new e([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),o=function(F,v){for(var Z=new A(31),nA=0;nA<31;++nA)Z[nA]=v+=1<<F[nA-1];for(var oA=new t(Z[30]),nA=1;nA<30;++nA)for(var LA=Z[nA];LA<Z[nA+1];++LA)oA[LA]=LA-Z[nA]<<5|nA;return{b:Z,r:oA}},I=o(n,2),r=I.b,g=I.r;r[28]=258,g[258]=28;var c=o(s,0),h=c.b,C=c.r,u=new A(32768);for(w=0;w<32768;++w)d=(w&43690)>>1|(w&21845)<<1,d=(d&52428)>>2|(d&13107)<<2,d=(d&61680)>>4|(d&3855)<<4,u[w]=((d&65280)>>8|(d&255)<<8)>>1;var d,w,S=function(F,v,Z){for(var nA=F.length,oA=0,LA=new A(v);oA<nA;++oA)F[oA]&&++LA[F[oA]-1];var ie=new A(v);for(oA=1;oA<v;++oA)ie[oA]=ie[oA-1]+LA[oA-1]<<1;var _A;if(Z){_A=new A(1<<v);var jA=15-v;for(oA=0;oA<nA;++oA)if(F[oA])for(var Ne=oA<<4|F[oA],re=v-F[oA],eA=ie[F[oA]-1]++<<re,EA=eA|(1<<re)-1;eA<=EA;++eA)_A[u[eA]>>jA]=Ne}else for(_A=new A(nA),oA=0;oA<nA;++oA)F[oA]&&(_A[oA]=u[ie[F[oA]-1]++]>>15-F[oA]);return _A},p=new e(288);for(w=0;w<144;++w)p[w]=8;var w;for(w=144;w<256;++w)p[w]=9;var w;for(w=256;w<280;++w)p[w]=7;var w;for(w=280;w<288;++w)p[w]=8;var w,k=new e(32);for(w=0;w<32;++w)k[w]=5;var w,M=S(p,9,1),H=S(k,5,1),b=function(F){for(var v=F[0],Z=1;Z<F.length;++Z)F[Z]>v&&(v=F[Z]);return v},B=function(F,v,Z){var nA=v/8|0;return(F[nA]|F[nA+1]<<8)>>(v&7)&Z},O=function(F,v){var Z=v/8|0;return(F[Z]|F[Z+1]<<8|F[Z+2]<<16)>>(v&7)},X=function(F){return(F+7)/8|0},J=function(F,v,Z){return(v==null||v<0)&&(v=0),(Z==null||Z>F.length)&&(Z=F.length),new e(F.subarray(v,Z))},Y=["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"],K=function(F,v,Z){var nA=new Error(v||Y[F]);if(nA.code=F,Error.captureStackTrace&&Error.captureStackTrace(nA,K),!Z)throw nA;return nA},P=function(F,v,Z,nA){var oA=F.length,LA=nA?nA.length:0;if(!oA||v.f&&!v.l)return Z||new e(0);var ie=!Z,_A=ie||v.i!=2,jA=v.i;ie&&(Z=new e(oA*3));var Ne=function(kt){var ue=Z.length;if(kt>ue){var at=new e(Math.max(ue*2,kt));at.set(Z),Z=at}},re=v.f||0,eA=v.p||0,EA=v.b||0,$A=v.l,NA=v.d,le=v.m,de=v.n,At=oA*8;do{if(!$A){re=B(F,eA,1);var Ue=B(F,eA+1,3);if(eA+=3,Ue)if(Ue==1)$A=M,NA=H,le=9,de=5;else if(Ue==2){var et=B(F,eA,31)+257,An=B(F,eA+10,15)+4,en=et+B(F,eA+5,31)+1;eA+=14;for(var Te=new e(en),Qe=new e(19),UA=0;UA<An;++UA)Qe[a[UA]]=B(F,eA+UA*3,7);eA+=An*3;for(var tn=b(Qe),mt=(1<<tn)-1,xe=S(Qe,tn,1),UA=0;UA<en;){var tt=xe[B(F,eA,mt)];eA+=tt&15;var GA=tt>>4;if(GA<16)Te[UA++]=GA;else{var Ie=0,nt=0;for(GA==16?(nt=3+B(F,eA,3),eA+=2,Ie=Te[UA-1]):GA==17?(nt=3+B(F,eA,7),eA+=3):GA==18&&(nt=11+B(F,eA,127),eA+=7);nt--;)Te[UA++]=Ie}}var nn=Te.subarray(0,et),ge=Te.subarray(et);le=b(nn),de=b(ge),$A=S(nn,le,1),NA=S(ge,de,1)}else K(1);else{var GA=X(eA)+4,St=F[GA-4]|F[GA-3]<<8,pt=GA+St;if(pt>oA){jA&&K(0);break}_A&&Ne(EA+St),Z.set(F.subarray(GA,pt),EA),v.b=EA+=St,v.p=eA=pt*8,v.f=re;continue}if(eA>At){jA&&K(0);break}}_A&&Ne(EA+131072);for(var cs=(1<<le)-1,Es=(1<<de)-1,yt=eA;;yt=eA){var Ie=$A[O(F,eA)&cs],ke=Ie>>4;if(eA+=Ie&15,eA>At){jA&&K(0);break}if(Ie||K(2),ke<256)Z[EA++]=ke;else if(ke==256){yt=eA,$A=null;break}else{var sn=ke-254;if(ke>264){var UA=ke-257,ce=n[UA];sn=B(F,eA,(1<<ce)-1)+r[UA],eA+=ce}var He=NA[O(F,eA)&Es],De=He>>4;He||K(3),eA+=He&15;var ge=h[De];if(De>3){var ce=s[De];ge+=O(F,eA)&(1<<ce)-1,eA+=ce}if(eA>At){jA&&K(0);break}_A&&Ne(EA+131072);var st=EA+sn;if(EA<ge){var Ye=LA-ge,yA=Math.min(ge,st);for(Ye+EA<0&&K(3);EA<yA;++EA)Z[EA]=nA[Ye+EA]}for(;EA<st;++EA)Z[EA]=Z[EA-ge]}}v.l=$A,v.p=yt,v.b=EA,v.f=re,$A&&(re=1,v.m=le,v.d=NA,v.n=de)}while(!re);return EA!=Z.length&&ie?J(Z,0,EA):Z.subarray(0,EA)},z=new e(0);function hA(F,v){return P(F,{i:2},v&&v.out,v&&v.dictionary)}var gA=typeof TextDecoder<"u"&&new TextDecoder,V=0;try{gA.decode(z,{stream:!0}),V=1}catch{}Js=hA})();var Ps=Js,qs=!1,Os=!0,qt=!1;function Ks(e,A,t){qs=e,Os=A,qt=t}function y(...e){qs&&console.info(...e)}function tA(...e){Os&&console.warn(...e)}function YA(...e){qt&&console.group(...e)}function RA(...e){qt&&console.groupCollapsed(...e)}function W(){qt&&console.groupEnd()}var Ce={consoleColors:E,SpessaSynthInfo:y,SpessaSynthWarn:tA,SpessaSynthGroupCollapsed:RA,SpessaSynthGroup:YA,SpessaSynthGroupEnd:W,readBytesAsUintBigEndian:je,readLittleEndian:L,readBytesAsString:lA,readVariableLengthQuantity:uA,inflateSync:Ps};var zA=class{ticks;statusByte;data;constructor(e,A,t){this.ticks=e,this.statusByte=A,this.data=t}};function Pa(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}function $n(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 qa={8:2,9:2,10:2,11:2,12:1,13:1,14:2},R={noteOff:128,noteOn:144,polyPressure:160,controllerChange:176,programChange:192,channelPressure:208,pitchWheel: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},m={bankSelect:0,modulationWheel:1,breathController:2,undefinedCC3:3,footController:4,portamentoTime:5,dataEntryMSB:6,mainVolume:7,balance:8,undefinedCC9:9,pan:10,expressionController:11,effectControl1:12,effectControl2:13,undefinedCC14:14,undefinedCC15:15,generalPurposeController1:16,generalPurposeController2:17,generalPurposeController3:18,generalPurposeController4:19,undefinedCC20:20,undefinedCC21:21,undefinedCC22:22,undefinedCC23:23,undefinedCC24:24,undefinedCC25:25,undefinedCC26:26,undefinedCC27:27,undefinedCC28:28,undefinedCC29:29,undefinedCC30:30,undefinedCC31:31,bankSelectLSB:32,modulationWheelLSB:33,breathControllerLSB:34,undefinedCC3LSB:35,footControllerLSB:36,portamentoTimeLSB:37,dataEntryLSB:38,mainVolumeLSB:39,balanceLSB:40,undefinedCC9LSB:41,panLSB:42,expressionControllerLSB:43,effectControl1LSB:44,effectControl2LSB:45,undefinedCC14LSB:46,undefinedCC15LSB:47,undefinedCC16LSB:48,undefinedCC17LSB:49,undefinedCC18LSB:50,undefinedCC19LSB:51,undefinedCC20LSB:52,undefinedCC21LSB:53,undefinedCC22LSB:54,undefinedCC23LSB:55,undefinedCC24LSB:56,undefinedCC25LSB:57,undefinedCC26LSB:58,undefinedCC27LSB:59,undefinedCC28LSB:60,undefinedCC29LSB:61,undefinedCC30LSB:62,undefinedCC31LSB:63,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,undefinedCC85:85,undefinedCC86:86,undefinedCC87:87,undefinedCC88:88,undefinedCC89:89,undefinedCC90:90,reverbDepth:91,tremoloDepth:92,chorusDepth:93,detuneDepth:94,phaserDepth:95,dataIncrement:96,dataDecrement:97,nonRegisteredParameterLSB:98,nonRegisteredParameterMSB:99,registeredParameterLSB:100,registeredParameterMSB:101,undefinedCC102LSB:102,undefinedCC103LSB:103,undefinedCC104LSB:104,undefinedCC105LSB:105,undefinedCC106LSB:106,undefinedCC107LSB:107,undefinedCC108LSB:108,undefinedCC109LSB:109,undefinedCC110LSB:110,undefinedCC111LSB:111,undefinedCC112LSB:112,undefinedCC113LSB:113,undefinedCC114LSB:114,undefinedCC115LSB:115,undefinedCC116LSB:116,undefinedCC117LSB:117,undefinedCC118LSB:118,undefinedCC119LSB:119,allSoundOff:120,resetAllControllers:121,localControlOnOff:122,allNotesOff:123,omniModeOff:124,omniModeOn:125,monoModeOn:126,polyModeOn:127};function Oa(e){if(!e.tracks)throw new Error("MIDI has no tracks!");let A=[];for(let s of e.tracks){let a=[],o=0,I;for(let r of s.events){let g=Math.max(0,r.ticks-o);if(r.statusByte===R.endOfTrack){o+=g;continue}let c;r.statusByte<=R.sequenceSpecific?(c=[255,r.statusByte,...Cn(r.data.length),...r.data],I=void 0):r.statusByte===R.systemExclusive?(c=[240,...Cn(r.data.length),...r.data],I=void 0):(c=[],I!==r.statusByte&&(I=r.statusByte,c.push(r.statusByte)),c.push(...r.data)),a.push(...Cn(g)),a.push(...c),o+=g}a.push(0),a.push(255),a.push(R.endOfTrack),a.push(0),A.push(new Uint8Array(a))}let t=(s,a)=>{for(let o=0;o<s.length;o++)a.push(s.charCodeAt(o))},n=[];t("MThd",n),n.push(...Rt(6,4)),n.push(0,e.format),n.push(...Rt(e.tracks.length,2)),n.push(...Rt(e.timeDivision,2));for(let s of A)t("MTrk",n),n.push(...Rt(s.length,4)),n.push(...s);return new Uint8Array(n).buffer}var Ka=350,ye=9,Vs=16,Xs="gs",he=-1,Mt=`SPESSASYNTH_EMBEDDED_BANK_${Math.random()}_DO_NOT_DELETE`,Zs=32767,Va={time:0},Xa=.03,Za=.07,Wa=1,za=64,ms=121,mA=class{static getDefaultBank(e){return e==="gm2"?ms:0}static getDrumBank(e){switch(e){default:throw new Error(`${e} doesn't have a bank MSB for drums.`);case"gm2":return 120;case"xg":return 127}}static isXGDrums(e){return e===120||e===127}static isValidXGMSB(e){return this.isXGDrums(e)||e===za||e===ms}static isSystemXG(e){return e==="gm2"||e==="xg"}static addBankOffset(e,A,t=!0){return this.isXGDrums(e)&&t?e:Math.min(e+A,127)}static subtrackBankOffset(e,A,t=!0){return this.isXGDrums(e)&&t?e:Math.max(0,e-A)}};function As(e){return e.data[0]===67&&e.data[2]===76&&e.data[5]===126&&e.data[6]===0}function Ws(e){return e.data[0]===65&&e.data[2]===66&&e.data[3]===18&&e.data[4]===64&&(e.data[5]&16)!==0&&e.data[6]===21}function es(e){return e.data[0]===65&&e.data[2]===66&&e.data[6]===127}function ts(e){return e.data[0]===126&&e.data[2]===9&&e.data[3]===1}function ns(e){return e.data[0]===126&&e.data[2]===9&&e.data[3]===3}function zs(e){return new zA(e,R.systemExclusive,new q([65,16,66,18,64,0,127,0,65,247]))}var ae=class _s{static toMIDIString(A){return A.isGMGSDrum?`DRUM:${A.program}`:`${A.bankLSB}:${A.bankMSB}:${A.program}`}static fromMIDIString(A){let t=A.split(":");if(t.length>3||t.length<2)throw new Error("Invalid MIDI string:");return A.startsWith("DRUM")?{bankMSB:0,bankLSB:0,program:parseInt(t[1]),isGMGSDrum:!0}:{bankLSB:parseInt(t[0]),bankMSB:parseInt(t[1]),program:parseInt(t[2]),isGMGSDrum:!1}}static toNamedMIDIString(A){return`${_s.toMIDIString(A)} ${A.name}`}static matches(A,t){return A.isGMGSDrum||t.isGMGSDrum?A.isGMGSDrum===t.isGMGSDrum&&A.program===t.program:A.program===t.program&&A.bankLSB===t.bankLSB&&A.bankMSB===t.bankMSB}static fromNamedMIDIString(A){let t=A.indexOf(" ");if(t<0)throw new Error(`Invalid named MIDI string: ${A}`);let n=this.fromMIDIString(A.substring(0,t)),s=A.substring(t+1);return{...n,name:s}}static sorter(A,t){return A.program!==t.program?A.program-t.program:A.isGMGSDrum&&!t.isGMGSDrum?1:!A.isGMGSDrum&&t.isGMGSDrum?-1:A.bankMSB!==t.bankMSB?A.bankMSB-t.bankMSB:A.bankLSB-t.bankLSB}},_a="Created using SpessaSynth";function ja(e,A,t){let n="gm",s=[],a=Array(e.tracks.length).fill(0),o=16+Math.max(...e.portChannelOffsetMap),I=[];for(let r=0;r<o;r++)I.push({program:0,drums:r%16===ye,lastBank:void 0,lastBankLSB:void 0,hasBankSelect:!1});if(e.iterate((r,g)=>{let c=e.portChannelOffsetMap[a[g]];if(r.statusByte===R.midiPort){a[g]=r.data[0];return}let h=r.statusByte&240;if(h!==R.controllerChange&&h!==R.programChange&&h!==R.systemExclusive)return;if(h===R.systemExclusive){if(!Ws(r)){As(r)?n="xg":es(r)?n="gs":ts(r)?(n="gm",s.push({tNum:g,e:r})):ns(r)&&(n="gm2");return}let S=[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][r.data[5]&15]+c;I[S].drums=!!(r.data[7]>0&&r.data[5]>>4);return}let C=(r.statusByte&15)+c,u=I[C];if(h===R.programChange){let p={program:r.data[0],bankLSB:u.lastBankLSB?.data?.[1]??0,bankMSB:mA.subtrackBankOffset(u.lastBank?.data?.[1]??0,e.bankOffset),isGMGSDrum:u.drums},k=t.getPreset(p,n);if(y(`%cInput patch: %c${ae.toMIDIString(p)}%c. Channel %c${C}%c. Changing patch to ${k.toString()}.`,E.info,E.unrecognized,E.info,E.recognized,E.info),r.data[0]=k.program,k.isGMGSDrum&&mA.isSystemXG(n)||u.lastBank===void 0||(u.lastBank.data[1]=mA.addBankOffset(k.bankMSB,A,k.isXGDrums),u.lastBankLSB===void 0))return;u.lastBankLSB.data[1]=k.bankLSB;return}let d=r.data[0]===m.bankSelectLSB;r.data[0]!==m.bankSelect&&!d||(u.hasBankSelect=!0,d?u.lastBankLSB=r:u.lastBank=r)}),I.forEach((r,g)=>{if(r.hasBankSelect)return;let c=g%16,h=R.programChange|c,C=Math.floor(g/16)*16,u=e.portChannelOffsetMap.indexOf(C),d=e.tracks.find(M=>M.port===u&&M.channels.has(c));if(d===void 0)return;let S=d.events.findIndex(M=>M.statusByte===h);if(S===-1){let M=d.events.findIndex(B=>B.statusByte>128&&B.statusByte<240&&(B.statusByte&15)===c);if(M===-1)return;let H=d.events[M].ticks,b=t.getPreset({bankMSB:0,bankLSB:0,program:0,isGMGSDrum:!1},n).program;d.addEvent(new zA(H,R.programChange|c,new q([b])),M),S=M}y(`%cAdding bank select for %c${g}`,E.info,E.recognized);let p=d.events[S].ticks,k=t.getPreset({bankLSB:0,bankMSB:0,program:r.program,isGMGSDrum:r.drums},n),w=mA.addBankOffset(k.bankMSB,A,k.isXGDrums);d.addEvent(new zA(p,R.controllerChange|c,new q([m.bankSelect,w])),S)}),n==="gm"&&!mA.isSystemXG(n)){for(let g of s){let c=e.tracks[g.tNum];c.deleteEvent(c.events.indexOf(g.e))}let r=0;e.tracks[0].events[0].statusByte===R.trackName&&r++,e.tracks[0].addEvent(zs(0),r)}}var Ss={bankOffset:0,metadata:{},correctBankOffset:!0,soundBank:void 0};function $a(e,A,t){let n=t.metadata;if(YA("%cWriting the RMIDI File...",E.info),y("metadata",n),y("Initial bank offset",e.bankOffset),t.correctBankOffset){if(!t.soundBank)throw new Error("Sound bank must be provided if correcting bank offset.");ja(e,t.bankOffset,t.soundBank)}let s=new q(e.writeMIDI());n.name??=e.getName(),n.creationDate??=new Date,n.copyright??=_a,n.software??="SpessaSynth",Object.entries(n).forEach(I=>{let r=I;r[1]&&e.setRMIDInfo(r[0],r[1])});let a=[];Object.entries(e.rmidiInfo).forEach(I=>{let r=I[0],g=I[1],c=h=>{a.push(IA(h,g))};switch(r){case"album":c("IALB"),c("IPRD");break;case"software":c("ISFT");break;case"infoEncoding":c("IENC");break;case"creationDate":c("ICRD");break;case"picture":c("IPIC");break;case"name":c("INAM");break;case"artist":c("IART");break;case"genre":c("IGNR");break;case"copyright":c("ICOP");break;case"comment":c("ICMT");break;case"engineer":c("IENG");break;case"subject":c("ISBJ");break;case"midiEncoding":c("MENC");break}});let o=new q(2);return lt(o,t.bankOffset,2),a.push(IA("DBNK",o)),y("%cFinished!",E.info),W(),MA("RIFF",[oe("RMID"),IA("data",s),MA("INFO",a,!0),new q(A)]).buffer}function Ao(e,A){RA("%cSearching for all used programs and keys...",E.info);let t=16+Math.max(...e.portChannelOffsetMap),n=[],s="gs";for(let I=0;I<t;I++){let r=I%16===ye;n.push({preset:A.getPreset({bankLSB:0,bankMSB:0,isGMGSDrum:r,program:0},s),bankMSB:0,bankLSB:0,isDrum:r})}let a=new Map,o=e.tracks.map(I=>I.port);return e.iterate((I,r)=>{if(I.statusByte===R.midiPort){o[r]=I.data[0];return}let g=I.statusByte&240;if(g!==R.noteOn&&g!==R.controllerChange&&g!==R.programChange&&g!==R.systemExclusive)return;let c=(I.statusByte&15)+e.portChannelOffsetMap[o[r]]||0,h=n[c];switch(g){case R.programChange:h.preset=A.getPreset({bankMSB:h.bankMSB,bankLSB:h.bankLSB,program:I.data[0],isGMGSDrum:h.isDrum},s);break;case R.controllerChange:switch(I.data[0]){default:return;case m.bankSelectLSB:h.bankLSB=I.data[1];break;case m.bankSelect:h.bankMSB=I.data[1]}break;case R.noteOn:if(I.data[1]===0)return;let C=a.get(h.preset);C||(C=new Set,a.set(h.preset,C)),C.add(`${I.data[0]}-${I.data[1]}`);break;case R.systemExclusive:{if(!Ws(I)){As(I)?(s="xg",y("%cXG on detected!",E.recognized)):ns(I)?(s="gm2",y("%cGM2 on detected!",E.recognized)):ts(I)?(s="gm",y("%cGM on detected!",E.recognized)):es(I)&&(s="gs",y("%cGS on detected!",E.recognized));return}let u=[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][I.data[5]&15]+e.portChannelOffsetMap[o[r]],d=!!(I.data[7]>0&&I.data[5]>>4);h=n[u],h.isDrum=d}break}}),a.forEach((I,r)=>{I.size===0&&(y(`%cDetected change but no keys for %c${r.name}`,E.info,E.value),a.delete(r))}),W(),a}function eo(e,A=0){let t=C=>(C.data=new q(C.data.buffer),6e7/je(C.data,3)),n=[],a=e.tracks.map(C=>C.events).flat();a.sort((C,u)=>C.ticks-u.ticks);for(let C=0;C<16;C++)n.push([]);let o=0,I=60/(120*e.timeDivision),r=0,g=0,c=[];for(let C=0;C<16;C++)c.push([]);let h=(C,u)=>{let d=c[u].findIndex(p=>p.midiNote===C),S=c[u][d];if(S){let p=o-S.start;S.length=p,u===ye&&(S.length=p<A?A:p),c[u].splice(d,1)}g--};for(;r<a.length;){let C=a[r],u=C.statusByte>>4,d=C.statusByte&15;if(u===8)h(C.data[0],d);else if(u===9)if(C.data[1]===0)h(C.data[0],d);else{h(C.data[0],d);let S={midiNote:C.data[0],start:o,length:-1,velocity:C.data[1]/127};n[d].push(S),c[d].push(S),g++}else C.statusByte===81&&(I=60/(t(C)*e.timeDivision));if(++r>=a.length)break;o+=I*(a[r].ticks-C.ticks)}return g>0&&c.forEach((C,u)=>{C.forEach(d=>{let S=o-d.start;d.length=S,u===ye&&(d.length=S<A?A:S)})}),n}var Lt={linear:0,nearestNeighbor:1,hermite:2},HA={Idle:0,RPCoarse:1,RPFine:2,NRPCoarse:3,NRPFine:4,DataCoarse:5,DataFine:6},iA={channelTuning:0,channelTransposeFine:1,modulationMultiplier:2,masterTuning:3,channelTuningSemitones:4,channelKeyShift:5,sf2NPRNGeneratorLSB:6};function qe(e,A,t,n){return new zA(n,R.controllerChange|e%16,new q([A,t]))}function to(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],a=128-(64+t+21+1)%128;return new zA(A,R.systemExclusive,new q([...n,a,247]))}function no(e,A=[],t=[],n=[],s=[]){RA("%cApplying changes to the MIDI file...",E.info),y("Desired program changes:",A),y("Desired CC changes:",t),y("Desired channels to clear:",n),y("Desired channels to transpose:",s);let a=new Set;A.forEach(p=>{a.add(p.channel)});let o="gs",I=!1,r=e.tracks.map(p=>p.port),g={},c=0,h=(p,k)=>{e.tracks[p].channels.size!==0&&(c===0&&(c+=16,g[k]=0),g[k]===void 0&&(g[k]=c,c+=16),r[p]=k)};e.tracks.forEach((p,k)=>{h(k,p.port)});let C=c,u=Array(C).fill(!0),d=Array(C).fill(0),S=Array(C).fill(0);if(s.forEach(p=>{let k=Math.trunc(p.keyShift),w=p.keyShift-k;d[p.channel]=k,S[p.channel]=w}),e.iterate((p,k,w)=>{let M=e.tracks[k],H=w[k],b=()=>{M.deleteEvent(H),w[k]--},B=(K,P=0)=>{M.addEvent(K,H+P),w[k]++},O=g[r[k]]||0;if(p.statusByte===R.midiPort){h(k,p.data[0]);return}if(p.statusByte<=R.sequenceSpecific&&p.statusByte>=R.sequenceNumber)return;let X=p.statusByte&240,J=p.statusByte&15,Y=J+O;if(n.includes(Y)){b();return}switch(X){case R.noteOn:if(u[Y]){u[Y]=!1,t.filter(P=>P.channel===Y).forEach(P=>{let z=qe(J,P.controllerNumber,P.controllerValue,p.ticks);B(z)});let K=S[Y];if(K!==0){let P=K*64+64,z=qe(J,m.registeredParameterMSB,0,p.ticks),hA=qe(J,m.registeredParameterLSB,1,p.ticks),gA=qe(Y,m.dataEntryMSB,P,p.ticks),V=qe(J,m.dataEntryLSB,0,p.ticks);B(V),B(gA),B(hA),B(z)}if(a.has(Y)){let P=A.find(v=>v.channel===Y);if(!P)return;y(`%cSetting %c${P.channel}%c to %c${ae.toMIDIString(P)}%c. Track num: %c${k}`,E.info,E.recognized,E.info,E.recognized,E.info,E.recognized);let z=P.bankMSB,hA=P.bankLSB,gA=P.program,V=new zA(p.ticks,R.programChange|J,new q([gA]));B(V);let F=(v,Z)=>{let nA=qe(J,v?m.bankSelectLSB:m.bankSelect,Z,p.ticks);B(nA)};mA.isSystemXG(o)&&P.isGMGSDrum&&(y(`%cAdding XG Drum change on track %c${k}`,E.recognized,E.value),z=mA.getDrumBank(o),hA=0),F(!1,z),F(!0,hA),P.isGMGSDrum&&!mA.isSystemXG(o)&&J!==ye&&(y(`%cAdding GS Drum change on track %c${k}`,E.recognized,E.value),B(to(J,p.ticks)))}}p.data[0]+=d[Y];break;case R.noteOff:p.data[0]+=d[Y];break;case R.programChange:if(a.has(Y)){b();return}break;case R.controllerChange:{let K=p.data[0];if(t.find(z=>z.channel===Y&&K===z.controllerNumber)!==void 0){b();return}(K===m.bankSelect||K===m.bankSelectLSB)&&a.has(Y)&&b()}break;case R.systemExclusive:if(As(p))y("%cXG system on detected",E.info),o="xg",I=!0;else if(p.data[0]===67&&p.data[2]===76&&p.data[3]===8&&p.data[5]===3)a.has(p.data[4]+O)&&b();else if(ns(p))y("%cGM2 system on detected",E.info),o="gm2",I=!0;else if(es(p)){I=!0,y("%cGS on detected!",E.recognized);break}else ts(p)&&(y("%cGM on detected, removing!",E.info),b(),I=!1)}}),!I&&A.length>0){let p=0;e.tracks[0].events[0].statusByte===R.trackName&&p++,e.tracks[0].addEvent(zs(0),p),y("%cGS on not detected. Adding it.",E.info)}e.flush(),W()}function so(e,A){let t=[],n=[],s=[],a=[];A.channelSnapshots.forEach((o,I)=>{if(o.isMuted){n.push(I);return}let r=o.channelTransposeKeyShift+o.customControllers[iA.channelTransposeFine]/100;r!==0&&t.push({channel:I,keyShift:r}),o.lockPreset&&s.push({channel:I,...o.patch}),o.lockedControllers.forEach((g,c)=>{if(!g||c>127||c===m.bankSelect)return;let h=o.midiControllers[c]>>7;a.push({channel:I,controllerNumber:c,controllerValue:h})})}),e.modify(s,a,n,t)}var hn={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},Oe={inLineResource:1,inFileResource:2,inFileNode:3,externalFile:4,externalXMF:5,XMFFileURIandNodeID:6},ln={StandardMIDIFile:0,StandardMIDIFileType1:1,DLS1:2,DLS2:3,DLS22:4,mobileDLS:5,unknown:-1,folder:-2},ao={standard:0,MMA:1,registered:2,nonRegistered:3},bt={none:0,MMAUnpacker:1,registered:2,nonRegistered:3},oo=class js{length;itemCount;metadataLength;metadata={};nodeData;innerNodes=[];packedContent=!1;nodeUnpackers=[];resourceFormat="unknown";referenceTypeID;constructor(A){let t=A.currentIndex;this.length=uA(A),this.itemCount=uA(A);let n=uA(A),s=A.currentIndex-t,a=n-s,o=A.slice(A.currentIndex,A.currentIndex+a);A.currentIndex+=a,this.metadataLength=uA(o);let I=o.slice(o.currentIndex,o.currentIndex+this.metadataLength);o.currentIndex+=this.metadataLength;let r,g;for(;I.currentIndex<I.length;){if(I[I.currentIndex]===0)I.currentIndex++,r=uA(I),Object.values(hn).includes(r)?g=Object.keys(hn).find(S=>hn[S]===r)??"":(y(`Unknown field specifier: ${r}`),g=`unknown_${r}`);else{let S=uA(I);r=lA(I,S),g=r}let d=uA(I);if(d===0){let S=uA(I),p=I.slice(I.currentIndex,I.currentIndex+S);I.currentIndex+=S,uA(p)<4?this.metadata[g]=lA(p,S-1):this.metadata[g]=p.slice(p.currentIndex)}else y(`International content: ${d}`),I.currentIndex+=uA(I)}let c=o.currentIndex,h=uA(o),C=o.slice(o.currentIndex,c+h);if(o.currentIndex=c+h,h>0)for(this.packedContent=!0;C.currentIndex<h;){let u={};switch(u.id=uA(C),u.id){case bt.nonRegistered:case bt.registered:throw W(),new Error(`Unsupported unpacker ID: ${u.id}`);default:throw W(),new Error(`Unknown unpacker ID: ${u.id}`);case bt.none:u.standardID=uA(C);break;case bt.MMAUnpacker:{let d=C[C.currentIndex++];d===0&&(d<<=8,d|=C[C.currentIndex++],d<<=8,d|=C[C.currentIndex++]);let S=uA(C);u.manufacturerID=d,u.manufacturerInternalID=S}break}u.decodedSize=uA(C),this.nodeUnpackers.push(u)}switch(A.currentIndex=t+n,this.referenceTypeID=uA(A),this.nodeData=A.slice(A.currentIndex,t+this.length),A.currentIndex=t+this.length,this.referenceTypeID){case Oe.inLineResource:break;case Oe.externalXMF:case Oe.inFileNode:case Oe.XMFFileURIandNodeID:case Oe.externalFile:case Oe.inFileResource:throw W(),new Error(`Unsupported reference type: ${this.referenceTypeID}`);default:throw W(),new Error(`Unknown reference type: ${this.referenceTypeID}`)}if(this.isFile){if(this.packedContent){let d=this.nodeData.slice(2,this.nodeData.length);y(`%cPacked content. Attempting to deflate. Target size: %c${this.nodeUnpackers[0].decodedSize}`,E.warn,E.value);try{this.nodeData=new q(Ps(d).buffer)}catch(S){if(W(),S instanceof Error)throw new Error(`Error unpacking XMF file contents: ${S.message}.`)}}let u=this.metadata.resourceFormat;if(u===void 0)tA("No resource format for this file node!");else{u[0]!==ao.standard&&(y(`Non-standard formatTypeID: ${u.toString()}`),this.resourceFormat=u.toString());let S=u[1];Object.values(ln).includes(S)?this.resourceFormat=Object.keys(ln).find(p=>ln[p]===S):y(`Unrecognized resource format: ${S}`)}}else for(this.resourceFormat="folder";this.nodeData.currentIndex<this.nodeData.length;){let u=this.nodeData.currentIndex,d=uA(this.nodeData),S=this.nodeData.slice(u,u+d);this.nodeData.currentIndex=u+d,this.innerNodes.push(new js(S))}}get isFile(){return this.itemCount===0}};function io(e,A){e.bankOffset=0;let t=lA(A,4);if(t!=="XMF_")throw W(),new SyntaxError(`Invalid XMF Header! Expected "_XMF", got "${t}"`);YA("%cParsing XMF file...",E.info);let n=lA(A,4);if(y(`%cXMF version: %c${n}`,E.info,E.recognized),n==="2.00"){let r=Xe(A,4),g=Xe(A,4);y(`%cFile Type ID: %c${r}%c, File Type Revision ID: %c${g}`,E.info,E.recognized,E.info,E.recognized)}uA(A);let s=uA(A);A.currentIndex+=s,A.currentIndex=uA(A);let a=new oo(A),o,I=r=>{let g=(c,h)=>{r.metadata[c]!==void 0&&typeof r.metadata[c]=="string"&&(e.rmidiInfo[h]=oe(r.metadata[c]))};if(g("nodeName","name"),g("title","name"),g("copyrightNotice","copyright"),g("comment","comment"),r.isFile)switch(r.resourceFormat){default:return;case"DLS1":case"DLS2":case"DLS22":case"mobileDLS":y("%cFound embedded DLS!",E.recognized),e.embeddedSoundBank=r.nodeData.buffer;break;case"StandardMIDIFile":case"StandardMIDIFileType1":y("%cFound embedded MIDI!",E.recognized),o=r.nodeData;break}else for(let c of r.innerNodes)I(c)};if(I(a),W(),!o)throw new Error("No MIDI data in the XMF file!");return o}var Ot=class $s{name="";port=0;channels=new Set;events=[];static copyFrom(A){let t=new $s;return t.copyFrom(A),t}copyFrom(A){this.name=A.name,this.port=A.port,this.channels=new Set(A.channels),this.events=A.events.map(t=>new zA(t.ticks,t.statusByte,new q(t.data)))}addEvent(A,t){this.events.splice(t,0,A)}deleteEvent(A){this.events.splice(A,1)}pushEvent(A){this.events.push(A)}};function ps(e,A,t){RA("%cParsing MIDI File...",E.info),e.fileName=t;let n=new q(A),s=n,a=g=>{let c=lA(g,4),h=Xe(g,4),C=new q(h),u={type:c,size:h,data:C},d=g.slice(g.currentIndex,g.currentIndex+u.size);return u.data.set(d,0),g.currentIndex+=u.size,u},o=se(n,4);if(o==="RIFF"){n.currentIndex+=8;let g=lA(n,4);if(g!=="RMID")throw W(),new SyntaxError(`Invalid RMIDI Header! Expected "RMID", got "${g}"`);let c=aA(n);if(c.header!=="data")throw W(),new SyntaxError(`Invalid RMIDI Chunk header! Expected "data", got "${g}"`);s=c.data;let h=!1,C=!1;for(;n.currentIndex<=n.length;){let u=n.currentIndex,d=aA(n,!0);if(d.header==="RIFF"){let S=lA(d.data,4).toLowerCase();S==="sfbk"||S==="sfpk"||S==="dls "?(y("%cFound embedded soundbank!",E.recognized),e.embeddedSoundBank=n.slice(u,u+d.size).buffer):tA(`Unknown RIFF chunk: "${S}"`),S==="dls "?e.isDLSRMIDI=!0:h=!0}else if(d.header==="LIST"&&lA(d.data,4)==="INFO")for(y("%cFound RMIDI INFO chunk!",E.recognized);d.data.currentIndex<=d.size;){let p=aA(d.data,!0),k=p.header,w=p.data;switch(k){default:tA(`Unknown RMIDI Info: ${k}`);break;case"INAM":e.rmidiInfo.name=w;break;case"IALB":case"IPRD":e.rmidiInfo.album=w;break;case"ICRT":case"ICRD":e.rmidiInfo.creationDate=w;break;case"IART":e.rmidiInfo.artist=w;break;case"IGNR":e.rmidiInfo.genre=w;break;case"IPIC":e.rmidiInfo.picture=w;break;case"ICOP":e.rmidiInfo.copyright=w;break;case"ICMT":e.rmidiInfo.comment=w;break;case"IENG":e.rmidiInfo.engineer=w;break;case"ISFT":e.rmidiInfo.software=w;break;case"ISBJ":e.rmidiInfo.subject=w;break;case"IENC":e.rmidiInfo.infoEncoding=w;break;case"MENC":e.rmidiInfo.midiEncoding=w;break;case"DBNK":e.bankOffset=Hs(w,2),C=!0;break}}}h&&!C&&(e.bankOffset=1),e.isDLSRMIDI&&(e.bankOffset=0),e.embeddedSoundBank===void 0&&(e.bankOffset=0)}else o==="XMF_"?s=io(e,n):s=n;let I=a(s);if(I.type!=="MThd")throw W(),new SyntaxError(`Invalid MIDI Header! Expected "MThd", got "${I.type}"`);if(I.size!==6)throw W(),new RangeError(`Invalid MIDI header chunk size! Expected 6, got ${I.size}`);e.format=Xe(I.data,2);let r=Xe(I.data,2);e.timeDivision=Xe(I.data,2);for(let g=0;g<r;g++){let c=new Ot,h=a(s);if(h.type!=="MTrk")throw W(),new SyntaxError(`Invalid track header! Expected "MTrk" got "${h.type}"`);let C,u=0;for(e.format===2&&g>0&&(u+=e.tracks[g-1].events[e.tracks[g-1].events.length-1].ticks);h.data.currentIndex<h.size;){u+=uA(h.data);let d=h.data[h.data.currentIndex],S;if(C!==void 0&&d<128)S=C;else{if(d<128)throw W(),new SyntaxError(`Unexpected byte with no running byte. (${d})`);S=h.data[h.data.currentIndex++]}let p=Pa(S),k;switch(p){case-1:k=0;break;case-2:S=h.data[h.data.currentIndex++],k=uA(h.data);break;case-3:k=uA(h.data);break;default:k=qa[S>>4],C=S;break}let w=new q(k);w.set(h.data.slice(h.data.currentIndex,h.data.currentIndex+k),0);let M=new zA(u,S,w);c.pushEvent(M),h.data.currentIndex+=k}e.tracks.push(c),y(`%cParsed %c${e.tracks.length}%c / %c${e.tracks.length}`,E.info,E.value,E.info,E.value)}y("%cAll tracks parsed correctly!",E.recognized),e.flush(!1),W()}var ro=new Map([["domingo","Sunday"],["segunda-feira","Monday"],["ter\xE7a-feira","Tuesday"],["quarta-feira","Wednesday"],["quinta-feira","Thursday"],["sexta-feira","Friday"],["s\xE1bado","Saturday"],["janeiro","January"],["fevereiro","February"],["mar\xE7o","March"],["abril","April"],["maio","May"],["junho","June"],["julho","July"],["agosto","August"],["setembro","September"],["outubro","October"],["novembro","November"],["dezembro","December"]]),Io=[ro];function go(e){for(let A of Io){let t=e;A.forEach((s,a)=>{let o=new RegExp(a,"gi");t=t.replace(o,s)});let n=new Date(t);if(!isNaN(n.getTime()))return n}}function co(e){let A=/^(\d{2})\.(\d{2})\.(\d{4})$/.exec(e);if(A){let t=parseInt(A[1]),n=parseInt(A[2])-1,s=parseInt(A[3]),a=new Date(s,n,t);if(!isNaN(a.getTime()))return a}}function Eo(e){let A=/^(\d{1,2})\s{1,2}(\d{1,2})\s{1,2}(\d{2})$/.exec(e);if(A){let t=A[1],n=(parseInt(A[2])+1).toString(),s=A[3],a=new Date(`${n}/${t}/${s}`);if(!isNaN(a.getTime()))return a}}function Bo(e){let t=/\b\d{4}\b/.exec(e);return t?new Date(t[0]):void 0}function ss(e){if(e=e.trim(),e.length<1)return new Date;let A=e.replace(/\b(\d+)(st|nd|rd|th)\b/g,"$1"),t=new Date(A);if(isNaN(t.getTime())){let n=go(e);if(n)return n;let s=co(e);if(s)return s;let a=Eo(e);if(a)return a;let o=Bo(e);return o||(tA(`Invalid date: "${e}". Replacing with the current date!`),new Date)}return t}var Le=class Nt{tracks=[];timeDivision=0;duration=0;tempoChanges=[{ticks:0,tempo:120}];extraMetadata=[];lyrics=[];firstNoteOn=0;keyRange={min:0,max:127};lastVoiceEventTick=0;portChannelOffsetMap=[0];loop={start:0,end:0,type:"hard"};fileName;format=0;rmidiInfo={};bankOffset=0;isKaraokeFile=!1;isMultiPort=!1;isDLSRMIDI=!1;embeddedSoundBank;binaryName;get infoEncoding(){let A=this.rmidiInfo.infoEncoding;if(!A)return;let t=A.byteLength;return A[A.byteLength-1]===0&&t--,se(A,t)}static fromArrayBuffer(A,t=""){let n=new Nt;return ps(n,A,t),n}static async fromFile(A){let t=new Nt;return ps(t,await A.arrayBuffer(),A.name),t}static copyFrom(A){let t=new Nt;return t.copyFrom(A),t}copyFrom(A){this.copyMetadataFrom(A),this.embeddedSoundBank=A?.embeddedSoundBank?.slice(0)??void 0,this.tracks=A.tracks.map(t=>Ot.copyFrom(t))}midiTicksToSeconds(A){if(A=Math.max(A,0),this.tempoChanges.length<1)throw new Error("There are no tempo changes in the sequence. At least one is needed.");if(this.tempoChanges[this.tempoChanges.length-1].ticks!==0)throw new Error(`The last tempo change is not at 0 ticks. Got ${this.tempoChanges[this.tempoChanges.length-1].ticks} ticks.`);let t=this.tempoChanges.findIndex(s=>s.ticks<=A),n=0;for(;t<this.tempoChanges.length;){let s=this.tempoChanges[t++],a=A-s.ticks;n+=a*60/(s.tempo*this.timeDivision),A=s.ticks}return n}getUsedProgramsAndKeys(A){return Ao(this,A)}preloadSynth(A){RA("%cPreloading samples...",E.info),this.getUsedProgramsAndKeys(A.soundBankManager).forEach((n,s)=>{y(`%cPreloading used samples on %c${s.name}%c...`,E.info,E.recognized,E.info);for(let a of n){let[o,I]=a.split("-").map(Number);A.getVoicesForPreset(s,o,I,o)}}),W()}flush(A=!0){if(A)for(let t of this.tracks)t.events.sort((n,s)=>n.ticks-s.ticks);this.parseInternal()}getNoteTimes(A=0){return eo(this,A)}writeMIDI(){return Oa(this)}writeRMIDI(A,t=Ss){return $a(this,A,jn(t,Ss))}modify(A=[],t=[],n=[],s=[]){no(this,A,t,n,s)}applySnapshot(A){so(this,A)}getName(A="Shift_JIS"){let t="",n=this.getRMIDInfo("name");if(n)return n.trim();if(this.binaryName){A=this.getRMIDInfo("midiEncoding")??A;try{t=new TextDecoder(A).decode(this.binaryName).trim()}catch(s){tA(`Failed to decode MIDI name: ${s}`)}}return t||this.fileName}getExtraMetadata(A="Shift_JIS"){A=this.infoEncoding??A;let t=new TextDecoder(A);return this.extraMetadata.map(n=>t.decode(n.data).replace(/@T|@A/g,"").trim())}setRMIDInfo(A,t){if(this.rmidiInfo.infoEncoding=oe("utf-8",!0),A==="picture")this.rmidiInfo.picture=new Uint8Array(t);else if(A==="creationDate")this.rmidiInfo.creationDate=oe(t.toISOString(),!0);else{let n=new TextEncoder().encode(t);this.rmidiInfo[A]=new Uint8Array([...n,0])}}getRMIDInfo(A){if(!this.rmidiInfo[A])return;let t=this.infoEncoding??"UTF-8";if(A==="picture")return this.rmidiInfo[A].buffer;if(A==="creationDate")return ss(se(this.rmidiInfo[A]));try{let n=new TextDecoder(t),s=this.rmidiInfo[A];return s[s.length-1]===0&&(s=s?.slice(0,s.length-1)),n.decode(s.buffer).trim()}catch(n){tA(`Failed to decode ${A} name: ${n}`);return}}iterate(A){let t=Array(this.tracks.length).fill(0),n=this.tracks.length,s=()=>{let a=0,o=1/0;return this.tracks.forEach(({events:I},r)=>{t[r]>=I.length||I[t[r]].ticks<o&&(a=r,o=I[t[r]].ticks)}),a};for(;n>0;){let a=s(),o=this.tracks[a].events;if(t[a]>=o.length){n--;continue}let I=o[t[a]];A(I,a,t),t[a]++}}copyMetadataFrom(A){this.fileName=A.fileName,this.timeDivision=A.timeDivision,this.duration=A.duration,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.isDLSRMIDI=A.isDLSRMIDI,this.isDLSRMIDI=A.isDLSRMIDI,this.tempoChanges=[...A.tempoChanges],this.extraMetadata=A.extraMetadata.map(t=>new zA(t.ticks,t.statusByte,new q(t.data))),this.lyrics=A.lyrics.map(t=>new zA(t.ticks,t.statusByte,new q(t.data))),this.portChannelOffsetMap=[...A.portChannelOffsetMap],this.binaryName=A?.binaryName?.slice(),this.loop={...A.loop},this.keyRange={...A.keyRange},this.rmidiInfo={},Object.entries(A.rmidiInfo).forEach(t=>{let n=t[0],s=t[1];this.rmidiInfo[n]=s.slice()})}parseInternal(){YA("%cInterpreting MIDI events...",E.info);let A=!1;this.tempoChanges=[{ticks:0,tempo:120}],this.extraMetadata=[],this.lyrics=[],this.firstNoteOn=0,this.keyRange={max:0,min:127},this.lastVoiceEventTick=0,this.portChannelOffsetMap=[0],this.loop={start:0,end:0,type:"hard"},this.isKaraokeFile=!1,this.isMultiPort=!1;let t=!1;typeof this.rmidiInfo.name<"u"&&(t=!0);let n=null,s=null,a="hard";for(let g of this.tracks){let c=new Set,h=!1;for(let u=0;u<g.events.length;u++){let d=g.events[u];if(d.statusByte>=128&&d.statusByte<240)switch(h=!0,d.ticks>this.lastVoiceEventTick&&(this.lastVoiceEventTick=d.ticks),d.statusByte&240){case R.controllerChange:switch(d.data[0]){case 2:case 111:case 116:n=d.ticks;break;case 4:case 117:s===null?(a="soft",s=d.ticks):s=0;break;case 0:this.isDLSRMIDI&&d.data[1]!==0&&d.data[1]!==127&&(y("%cDLS RMIDI with offset 1 detected!",E.recognized),this.bankOffset=1)}break;case R.noteOn:{c.add(d.statusByte&15);let p=d.data[0];this.keyRange.min=Math.min(this.keyRange.min,p),this.keyRange.max=Math.max(this.keyRange.max,p);break}}let S=se(d.data);switch(d.statusByte){case R.endOfTrack:u!==g.events.length-1&&(g.deleteEvent(u),u--,tA("Unexpected EndOfTrack. Removing!"));break;case R.setTempo:this.tempoChanges.push({ticks:d.ticks,tempo:6e7/je(d.data,3)});break;case R.marker:switch(S.trim().toLowerCase()){default:break;case"start":case"loopstart":n=d.ticks;break;case"loopend":s=d.ticks}break;case R.copyright:this.extraMetadata.push(d);break;case R.lyric:S.trim().startsWith("@KMIDI KARAOKE FILE")&&(this.isKaraokeFile=!0,y("%cKaraoke MIDI detected!",E.recognized)),this.isKaraokeFile?d.statusByte=R.text:this.lyrics.push(d);case R.text:{let p=S.trim();p.startsWith("@KMIDI KARAOKE FILE")?(this.isKaraokeFile=!0,y("%cKaraoke MIDI detected!",E.recognized)):this.isKaraokeFile&&(p.startsWith("@T")||p.startsWith("@A")?A?this.extraMetadata.push(d):(this.binaryName=d.data.slice(2),A=!0,t=!0):p.startsWith("@")||this.lyrics.push(d));break}}}g.channels=c,g.name="";let C=g.events.find(u=>u.statusByte===R.trackName);C&&this.tracks.indexOf(g)>0&&(g.name=se(C.data),!h&&!g.name.toLowerCase().includes("setup")&&this.extraMetadata.push(C))}this.tempoChanges.reverse(),y("%cCorrecting loops, ports and detecting notes...",E.info);let o=[];for(let g of this.tracks){let c=g.events.find(h=>(h.statusByte&240)===R.noteOn);c&&o.push(c.ticks)}this.firstNoteOn=Math.min(...o),y(`%cFirst note-on detected at: %c${this.firstNoteOn}%c ticks!`,E.info,E.recognized,E.info),n??=this.firstNoteOn,(s===null||s===0)&&(s=this.lastVoiceEventTick),this.loop={start:n,end:s,type:a},this.lastVoiceEventTick=Math.max(this.lastVoiceEventTick,this.loop.end),y(`%cLoop points: start: %c${this.loop.start}%c end: %c${this.loop.end}`,E.info,E.recognized,E.info,E.recognized);let I=0;this.portChannelOffsetMap=[];for(let g of this.tracks)if(g.port=-1,g.channels.size!==0)for(let c of g.events){if(c.statusByte!==R.midiPort)continue;let h=c.data[0];g.port=h,this.portChannelOffsetMap[h]===void 0&&(this.portChannelOffsetMap[h]=I,I+=16)}this.portChannelOffsetMap=[...this.portChannelOffsetMap].map(g=>g??0);let r=1/0;for(let g of this.tracks)g.port!==-1&&r>g.port&&(r=g.port);r===1/0&&(r=0);for(let g of this.tracks)(g.port===-1||g.port===void 0)&&(g.port=r);if(this.portChannelOffsetMap.length===0&&(this.portChannelOffsetMap=[0]),this.portChannelOffsetMap.length<2?y("%cNo additional MIDI Ports detected.",E.info):(this.isMultiPort=!0,y("%cMIDI Ports detected!",E.recognized)),!t)if(this.tracks.length>1){if(this.tracks[0].events.find(g=>g.statusByte>=R.noteOn&&g.statusByte<R.polyPressure)===void 0){let g=this.tracks[0].events.find(c=>c.statusByte===R.trackName);g&&(this.binaryName=g.data)}}else{let g=this.tracks[0].events.find(c=>c.statusByte===R.trackName);g&&(this.binaryName=g.data)}if(this.extraMetadata=this.extraMetadata.filter(g=>g.data.length>0),this.lyrics.sort((g,c)=>g.ticks-c.ticks),!this.tracks.some(g=>g.events[0].ticks===0)){let g=this.tracks[0],c=this?.binaryName?.buffer;c||(c=new Uint8Array(0).buffer),g.events.unshift(new zA(0,R.trackName,new q(c)))}this.duration=this.midiTicksToSeconds(this.lastVoiceEventTick),this.binaryName&&this.binaryName.length<1&&(this.binaryName=void 0),y(`%cMIDI file parsed. Total tick time: %c${this.lastVoiceEventTick}%c, total seconds time: %c${Rn(Math.ceil(this.duration)).time}`,E.info,E.recognized,E.info,E.recognized),W()}};function Co(e,A){if(this.externalMIDIPlayback&&e.statusByte>=128){this.sendMIDIMessage([e.statusByte,...e.data]);return}let t=this._midiData.tracks[A],n=$n(e.statusByte),s=this.midiPortChannelOffsets[this.currentMIDIPorts[A]]||0;switch(n.channel+=s,n.status){case R.noteOn:{let a=e.data[1];if(a>0)this.synth.noteOn(n.channel,e.data[0],a),this.playingNotes.push({midiNote:e.data[0],channel:n.channel,velocity:a});else{this.synth.noteOff(n.channel,e.data[0]);let o=this.playingNotes.findIndex(I=>I.midiNote===e.data[0]&&I.channel===n.channel);o!==-1&&this.playingNotes.splice(o,1)}break}case R.noteOff:{this.synth.noteOff(n.channel,e.data[0]);let a=this.playingNotes.findIndex(o=>o.midiNote===e.data[0]&&o.channel===n.channel);a!==-1&&this.playingNotes.splice(a,1);break}case R.pitchWheel:this.synth.pitchWheel(n.channel,e.data[1]<<7|e.data[0]);break;case R.controllerChange:if(this._midiData.isMultiPort&&t.channels.size===0)return;this.synth.controllerChange(n.channel,e.data[0],e.data[1]);break;case R.programChange:if(this._midiData.isMultiPort&&t.channels.size===0)return;this.synth.programChange(n.channel,e.data[0]);break;case R.polyPressure:this.synth.polyPressure(n.channel,e.data[0],e.data[1]);break;case R.channelPressure:this.synth.channelPressure(n.channel,e.data[0]);break;case R.systemExclusive:this.synth.systemExclusive(e.data,s);break;case R.setTempo:{let a=6e7/je(e.data,3);this.oneTickToSeconds=60/(a*this._midiData.timeDivision),this.oneTickToSeconds===0&&(this.oneTickToSeconds=60/(120*this._midiData.timeDivision),y("invalid tempo! falling back to 120 BPM"),a=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.data[0]);break;case R.reset:this.synth.stopAllChannels(),this.synth.resetAllControllers();break;default:y(`%cUnrecognized Event: %c${e.statusByte}%c status byte: %c${Object.keys(R).find(a=>R[a]===n.status)}`,E.warn,E.unrecognized,E.warn,E.value);break}n.status>=0&&n.status<128&&this.callEvent("metaEvent",{event:e,trackIndex:A})}function ho(){if(this.paused||!this._midiData)return;let e=this.currentTime;for(;this.playedTime<e;){let A=this.findFirstEventIndex(),n=this._midiData.tracks[A].events[this.eventIndexes[A]++];this.processEvent(n,A);let s=this.findFirstEventIndex(),a=this._midiData.tracks[s];if(this.loopCount>0&&this._midiData.loop.end<=n.ticks){this.loopCount!==1/0&&(this.loopCount--,this.callEvent("loopCountChange",{newCount:this.loopCount})),this._midiData.loop.type==="soft"?this.jumpToTick(this._midiData.loop.start):this.setTimeTicks(this._midiData.loop.start);return}if(a.events.length<=this.eventIndexes[s]||n.ticks>=this._midiData.lastVoiceEventTick){this.songIsFinished();return}let o=a.events[this.eventIndexes[s]];this.playedTime+=this.oneTickToSeconds*(o.ticks-n.ticks)}}function lo(e,A){this._midiData.tracks[e].channels.size!==0&&(this.midiPortChannelOffset===0&&(this.midiPortChannelOffset+=16,this.midiPortChannelOffsets[A]=0),this.midiPortChannelOffsets[A]===void 0&&(this.synth.midiChannels.length<this.midiPortChannelOffset+15&&this.addNewMIDIPort(),this.midiPortChannelOffsets[A]=this.midiPortChannelOffset,this.midiPortChannelOffset+=16),this.currentMIDIPorts[e]=A)}function Qo(e){if(!e.tracks)throw new Error("This MIDI has no tracks!");if(e.duration===0){tA("This MIDI file has a duration of exactly 0 seconds."),this.pausedTime=0,this.isFinished=!0;return}this.oneTickToSeconds=60/(120*e.timeDivision),this._midiData=e,this.isFinished=!1,this.synth.clearEmbeddedBank(),this._midiData.embeddedSoundBank!==void 0&&(y("%cEmbedded soundbank detected! Using it.",E.recognized),this.synth.setEmbeddedSoundBank(this._midiData.embeddedSoundBank,this._midiData.bankOffset),this.preload&&this._midiData.preloadSynth(this.synth)),this.currentMIDIPorts=this._midiData.tracks.map(A=>A.port),this.midiPortChannelOffset=0,this.midiPortChannelOffsets={},this._midiData.tracks.forEach((A,t)=>{this.assignMIDIPort(t,A.port)}),this.firstNoteTime=this._midiData.midiTicksToSeconds(this._midiData.firstNoteOn),y(`%cTotal song time: ${Rn(Math.ceil(this._midiData.duration)).time}`,E.recognized),this.callEvent("songChange",{songIndex:this._songIndex}),this._midiData.duration<=.2&&(tA(`%cVery short song: (${Rn(Math.round(this._midiData.duration)).time}). Disabling loop!`,E.warn),this.loopCount=0),this.currentTime=0}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,vibLfoToVolume:61,vibLfoToFilterFc:62},Mn=Object.keys(i).length,uo=Math.max(...Object.values(i)),T=[];T[i.startAddrsOffset]={min:0,max:32768,def:0,nrpn:1};T[i.endAddrOffset]={min:-32768,max:32768,def:0,nrpn:1};T[i.startloopAddrsOffset]={min:-32768,max:32768,def:0,nrpn:1};T[i.endloopAddrsOffset]={min:-32768,max:32768,def:0,nrpn:1};T[i.startAddrsCoarseOffset]={min:0,max:32768,def:0,nrpn:1};T[i.modLfoToPitch]={min:-12e3,max:12e3,def:0,nrpn:2};T[i.vibLfoToPitch]={min:-12e3,max:12e3,def:0,nrpn:2};T[i.modEnvToPitch]={min:-12e3,max:12e3,def:0,nrpn:2};T[i.initialFilterFc]={min:1500,max:13500,def:13500,nrpn:2};T[i.initialFilterQ]={min:0,max:960,def:0,nrpn:1};T[i.modLfoToFilterFc]={min:-12e3,max:12e3,def:0,nrpn:2};T[i.vibLfoToFilterFc]={min:-12e3,max:12e3,def:0,nrpn:2};T[i.modEnvToFilterFc]={min:-12e3,max:12e3,def:0,nrpn:2};T[i.endAddrsCoarseOffset]={min:-32768,max:32768,def:0,nrpn:1};T[i.modLfoToVolume]={min:-960,max:960,def:0,nrpn:1};T[i.vibLfoToVolume]={min:-960,max:960,def:0,nrpn:1};T[i.chorusEffectsSend]={min:0,max:1e3,def:0,nrpn:1};T[i.reverbEffectsSend]={min:0,max:1e3,def:0,nrpn:1};T[i.pan]={min:-500,max:500,def:0,nrpn:1};T[i.delayModLFO]={min:-12e3,max:5e3,def:-12e3,nrpn:2};T[i.freqModLFO]={min:-16e3,max:4500,def:0,nrpn:4};T[i.delayVibLFO]={min:-12e3,max:5e3,def:-12e3,nrpn:2};T[i.freqVibLFO]={min:-16e3,max:4500,def:0,nrpn:4};T[i.delayModEnv]={min:-32768,max:5e3,def:-32768,nrpn:2};T[i.attackModEnv]={min:-32768,max:8e3,def:-32768,nrpn:2};T[i.holdModEnv]={min:-12e3,max:5e3,def:-12e3,nrpn:2};T[i.decayModEnv]={min:-12e3,max:8e3,def:-12e3,nrpn:2};T[i.sustainModEnv]={min:0,max:1e3,def:0,nrpn:1};T[i.releaseModEnv]={min:-12e3,max:8e3,def:-12e3,nrpn:2};T[i.keyNumToModEnvHold]={min:-1200,max:1200,def:0,nrpn:1};T[i.keyNumToModEnvDecay]={min:-1200,max:1200,def:0,nrpn:1};T[i.delayVolEnv]={min:-12e3,max:5e3,def:-12e3,nrpn:2};T[i.attackVolEnv]={min:-12e3,max:8e3,def:-12e3,nrpn:2};T[i.holdVolEnv]={min:-12e3,max:5e3,def:-12e3,nrpn:2};T[i.decayVolEnv]={min:-12e3,max:8e3,def:-12e3,nrpn:2};T[i.sustainVolEnv]={min:0,max:1440,def:0,nrpn:1};T[i.releaseVolEnv]={min:-12e3,max:8e3,def:-12e3,nrpn:2};T[i.keyNumToVolEnvHold]={min:-1200,max:1200,def:0,nrpn:1};T[i.keyNumToVolEnvDecay]={min:-1200,max:1200,def:0,nrpn:1};T[i.startloopAddrsCoarseOffset]={min:-32768,max:32768,def:0,nrpn:1};T[i.keyNum]={min:-1,max:127,def:-1,nrpn:1};T[i.velocity]={min:-1,max:127,def:-1,nrpn:1};T[i.initialAttenuation]={min:0,max:1440,def:0,nrpn:1};T[i.endloopAddrsCoarseOffset]={min:-32768,max:32768,def:0,nrpn:1};T[i.coarseTune]={min:-120,max:120,def:0,nrpn:1};T[i.fineTune]={min:-127