UNPKG

spessasynth_lib

Version:

MIDI and SoundFont2/DLS library for the browsers with no compromises

1 lines 386 kB
function xt(t,e,A=0){let s=0;for(let n=0;n<e;n++)s=s<<8|t[A+n];return s>>>0}function Nt(t,e){let A=xt(t,e,t.currentIndex);return t.currentIndex+=e,A}function sA(t,e){let A=new Array(e).fill(0);for(let s=e-1;s>=0;s--)A[s]=t&255,t>>=8;return A}function V(t,e){let A=cs(t,e,t.currentIndex);return t.currentIndex+=e,A}function cs(t,e,A=0){let s=0;for(let n=0;n<e;n++)s|=t[A+n]<<n*8;return s>>>0}function hs(t,e,A){for(let s=0;s<A;s++)t[t.currentIndex++]=e>>s*8&255}function Ae(t,e){t[t.currentIndex++]=e&255,t[t.currentIndex++]=e>>8}function ge(t,e){hs(t,e,4)}function ls(t,e){let A=e<<8|t;return A>32767?A-65536:A}function Yn(t){return t>127?t-256:t}var ee=class extends Uint8Array{currentIndex=0;slice(t,e){let A=super.slice(t,e);return A.currentIndex=0,A}};function _e(t,e=t.length,A=0){let s="";for(let n=0;n<e;n++){let a=t[A+n];if(a===0)return s;s+=String.fromCharCode(a)}return s}function Ee(t,e){let A=t.currentIndex;return t.currentIndex+=e,_e(t,e,A)}function $e(t,e=!1,A=!1){let s=t.length;e&&s++,A&&s%2!==0&&s++;let n=new ee(s);return Le(n,t),n}function Le(t,e,A=0){A>0&&e.length>A&&(e=e.slice(0,A));for(let s=0;s<e.length;s++)t[t.currentIndex++]=e.charCodeAt(s);if(A>e.length)for(let s=0;s<A-e.length;s++)t[t.currentIndex++]=0;return t}function Qe(t){let e=0;for(;t;){let A=t[t.currentIndex++];if(e=e<<7|A&127,A>>7!==1)break}return e}function UA(t){let e=[t&127];for(t>>=7;t>0;)e.unshift(t&127|128),t>>=7;return e}function _A(t){t=Math.floor(t);let e=Math.floor(t/60),A=Math.round(t-e*60);return{minutes:e,seconds:A,time:`${e.toString().padStart(2,"0")}:${A.toString().padStart(2,"0")}`}}function zs(t){let e="";for(let A=0;A<t.length;A++){let s=t[A].toString(16).padStart(2,"0").toUpperCase();e+=s,A<t.length-1&&(e+=" ")}return e}var d={warn:"color: orange;",unrecognized:"color: red;",info:"color: aqua;",recognized:"color: lime",value:"color: yellow; background-color: black;"},$s;(()=>{var t=Uint8Array,e=Uint16Array,A=Int32Array,s=new t([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]),n=new t([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 t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),r=function(T,F){for(var u=new e(31),x=0;x<31;++x)u[x]=F+=1<<T[x-1];for(var P=new A(u[30]),x=1;x<30;++x)for(var te=u[x];te<u[x+1];++te)P[te]=te-u[x]<<5|x;return{b:u,r:P}},o=r(s,2),i=o.b,g=o.r;i[28]=258,g[258]=28;var l=r(n,0),C=l.b;l.r;var B=new e(32768);for(p=0;p<32768;++p)I=(p&43690)>>1|(p&21845)<<1,I=(I&52428)>>2|(I&13107)<<2,I=(I&61680)>>4|(I&3855)<<4,B[p]=((I&65280)>>8|(I&255)<<8)>>1;var I,p,E=function(T,F,u){for(var x=T.length,P=0,te=new e(F);P<x;++P)T[P]&&++te[T[P]-1];var W=new e(F);for(P=1;P<F;++P)W[P]=W[P-1]+te[P-1]<<1;var _;if(u){_=new e(1<<F);var $=15-F;for(P=0;P<x;++P)if(T[P])for(var ne=P<<4|T[P],ae=F-T[P],J=W[T[P]-1]++<<ae,ie=J|(1<<ae)-1;J<=ie;++J)_[B[J]>>$]=ne}else for(_=new e(x),P=0;P<x;++P)T[P]&&(_[P]=B[W[T[P]-1]++]>>15-T[P]);return _},y=new t(288);for(p=0;p<144;++p)y[p]=8;var p;for(p=144;p<256;++p)y[p]=9;var p;for(p=256;p<280;++p)y[p]=7;var p;for(p=280;p<288;++p)y[p]=8;var p,S=new t(32);for(p=0;p<32;++p)S[p]=5;var p,w=E(y,9,1),R=E(S,5,1),M=function(T){for(var F=T[0],u=1;u<T.length;++u)T[u]>F&&(F=T[u]);return F},k=function(T,F,u){var x=F/8|0;return(T[x]|T[x+1]<<8)>>(F&7)&u},Q=function(T,F){var u=F/8|0;return(T[u]|T[u+1]<<8|T[u+2]<<16)>>(F&7)},m=function(T){return(T+7)/8|0},D=function(T,F,u){return(F==null||F<0)&&(F=0),(u==null||u>T.length)&&(u=T.length),new t(T.subarray(F,u))},q=["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(T,F,u){var x=new Error(F||q[T]);if(x.code=T,Error.captureStackTrace&&Error.captureStackTrace(x,K),!u)throw x;return x},O=function(T,F,u,x){var P=T.length,te=x?x.length:0;if(!P||F.f&&!F.l)return u||new t(0);var W=!u,_=W||F.i!=2,$=F.i;W&&(u=new t(P*3));var ne=function(Ce){var he=u.length;if(Ce>he){var Te=new t(Math.max(he*2,Ce));Te.set(u),u=Te}},ae=F.f||0,J=F.p||0,ie=F.b||0,pe=F.l,ve=F.d,Be=F.m,be=F.n,xe=P*8;do{if(!pe){ae=k(T,J,1);var ht=k(T,J+1,3);if(J+=3,ht)if(ht==1)pe=w,ve=R,Be=9,be=5;else if(ht==2){var lt=k(T,J,31)+257,jt=k(T,J+10,15)+4,eA=lt+k(T,J+5,31)+1;J+=14;for(var Ye=new t(eA),Et=new t(19),Re=0;Re<jt;++Re)Et[a[Re]]=k(T,J+Re*3,7);J+=jt*3;for(var Ot=M(Et),wt=(1<<Ot)-1,TA=E(Et,Ot,1),Re=0;Re<eA;){var Yt=TA[k(T,J,wt)];J+=Yt&15;var Xe=Yt>>4;if(Xe<16)Ye[Re++]=Xe;else{var it=0,Ct=0;for(Xe==16?(Ct=3+k(T,J,3),J+=2,it=Ye[Re-1]):Xe==17?(Ct=3+k(T,J,7),J+=3):Xe==18&&(Ct=11+k(T,J,127),J+=7);Ct--;)Ye[Re++]=it}}var bt=Ye.subarray(0,lt),qe=Ye.subarray(lt);Be=M(bt),be=M(qe),pe=E(bt,Be,1),ve=E(qe,be,1)}else K(1);else{var Xe=m(J)+4,dt=T[Xe-4]|T[Xe-3]<<8,je=Xe+dt;if(je>P){$&&K(0);break}_&&ne(ie+dt),u.set(T.subarray(Xe,je),ie),F.b=ie+=dt,F.p=J=je*8,F.f=ae;continue}if(J>xe){$&&K(0);break}}_&&ne(ie+131072);for(var v=(1<<Be)-1,b=(1<<be)-1,L=J;;L=J){var it=pe[Q(T,J)&v],z=it>>4;if(J+=it&15,J>xe){$&&K(0);break}if(it||K(2),z<256)u[ie++]=z;else if(z==256){L=J,pe=null;break}else{var re=z-254;if(z>264){var Re=z-257,ce=s[Re];re=k(T,J,(1<<ce)-1)+i[Re],J+=ce}var de=ve[Q(T,J)&b],j=de>>4;de||K(3),J+=de&15;var qe=C[j];if(j>3){var ce=n[j];qe+=Q(T,J)&(1<<ce)-1,J+=ce}if(J>xe){$&&K(0);break}_&&ne(ie+131072);var Ne=ie+re;if(ie<qe){var De=te-qe,oe=Math.min(qe,Ne);for(De+ie<0&&K(3);ie<oe;++ie)u[ie]=x[De+ie]}for(;ie<Ne;++ie)u[ie]=u[ie-qe]}}F.l=pe,F.p=L,F.b=ie,F.f=ae,pe&&(ae=1,F.m=Be,F.d=ve,F.n=be)}while(!ae);return ie!=u.length&&W?D(u,0,ie):u.subarray(0,ie)},Y=new t(0);function H(T,F){return O(T,{i:2},F&&F.out,F&&F.dictionary)}var Z=typeof TextDecoder<"u"&&new TextDecoder;try{Z.decode(Y,{stream:!0})}catch{}$s=H})();var js=$s,U=class en{header;size;data;constructor(e,A,s){this.header=e,this.size=A,this.data=s}static read(e,A=!0,s=!1){let n=Ee(e,4),a=V(e,4);n===""&&(a=0);let r=A?e.slice(e.currentIndex,e.currentIndex+a):new ee(0);return(A||s)&&(e.currentIndex+=a,a%2!==0&&e.currentIndex++),new en(n,a,r)}static write(e,A,s=!1,n=!1){if(e.length!==4)throw new Error(`Invalid header length: ${e}`);let a=8,r=e,o=A.length;s&&o++;let i=o;n&&(a+=4,i+=4,r="LIST");let g=a+o;g%2!==0&&g++;let l=new ee(g);return Le(l,r),ge(l,i),n&&Le(l,e),l.set(A,a),l}static getParts(e,A,s=!1){let n=e,a=A.reduce((i,g)=>g.length+i,0);s&&(a+=4,n="LIST");let r=new ee(4);ge(r,a);let o=[$e(n),r];return s&&o.push($e(e)),o.push(...A),a%2!==0&&o.push(new Uint8Array(1)),o}static writeParts(e,A,s=!1){let n=8,a=e,r=A.reduce((l,C)=>C.length+l,0),o=r;s&&(n+=4,o+=4,a="LIST");let i=n+r;i%2!==0&&i++;let g=new ee(i);Le(g,a),ge(g,o),s&&Le(g,e);for(let l of A)g.set(l,n),n+=l.length;return g}static findListType(e,A){return e.find(s=>s.header!=="LIST"?!1:(s.data.currentIndex=4,_e(s.data,4)===A))}};function bA(t,e){return{...e,...t}}var h=class WA{static infoEnabled=!1;static warnEnabled=!0;static groupEnabled=!1;static setLogLevel(e,A,s){this.infoEnabled=e,this.warnEnabled=A,this.groupEnabled=s}static info(...e){this.infoEnabled&&console.info(...e)}static warn(...e){this.warnEnabled&&console.warn(...e)}static group(...e){this.groupEnabled&&console.group(...e)}static groupCollapsed(...e){this.groupEnabled&&console.groupCollapsed(...e)}static groupEnd(){this.groupEnabled&&console.groupEnd()}static unsupported(e,A,s=""){this.infoEnabled&&this.info(`%cUnsupported %c${e}%c message: %c${zs(A)}%c. ${s}`,d.warn,d.recognized,d.warn,d.unrecognized,d.warn)}static gmInfo(e,A,s=""){this.infoEnabled&&this.coolInfo(`General MIDI ${e}`,A,s)}static gmFail(e,A){this.infoEnabled&&this.unsupported(`General MIDI ${e}`,A)}static gsInfo(e,A,s=""){this.infoEnabled&&this.coolInfo(`Roland GS ${e}`,A,s)}static gsFail(e,A,s=""){this.infoEnabled&&this.unsupported(`Roland GS ${e}`,A,s)}static xgInfo(e,A,s=""){this.infoEnabled&&this.coolInfo(`Yamaha XG ${e}`,A,s)}static xgFail(e,A,s=""){this.infoEnabled&&this.unsupported(`Yamaha XG ${e}`,A,s)}static coolInfo(e,A,s=""){this.infoEnabled&&(s?WA.info(`%c${e}%c is now set to %c${A}%c ${s}.`,d.recognized,d.info,d.value,d.info):WA.info(`%c${e}%c is now set to %c${A}%c.`,d.recognized,d.info,d.value,d.info))}},tn={ConsoleColors:d,readBigEndian:xt,readLittleEndian:cs,readLittleEndianIndexed:V,readBinaryString:_e,readBinaryStringIndexed:Ee,readVariableLengthQuantity:Qe,inflateSync:js},G={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},f={bankSelect:0,modulationWheel:1,breathController:2,undefinedCC3:3,footController:4,portamentoTime:5,dataEntryMSB:6,mainVolume:7,balance:8,undefinedCC9:9,pan:10,expression: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,expressionLSB: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,variationDepth: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},ut={pitchWheelRange:0,fineTuning:1,coarseTuning:2,modulationDepth:5,resetParameters:16383},ye={partParameter:1,drumPitch:24,drumPitchFine:25,drumLevel:26,drumPan:28,drumReverb:29,drumChorus:30,drumDelay:31,awe32:127,SF2:120},Pe={vibratoRate:8,vibratoDepth:9,vibratoDelay:10,tvfCutoffFrequency:32,tvfResonance:33,envelopeAttackTime:99,envelopeDecayTime:100,envelopeReleaseTime:102},We=class{ticks;statusByte;data;constructor(t,e,A){this.ticks=t,this.statusByte=e,this.data=A}},ws=(t,e)=>{for(let A=0;A<t.length;A++)e.push(t.charCodeAt(A))};function qn(t){if(!t.tracks)throw new Error("MIDI has no tracks!");let e=[];for(let s of t.tracks){let n=[],a=0,r;for(let o of s.events){let i=Math.max(0,o.ticks-a);if(o.statusByte===G.endOfTrack){a+=i;continue}let g;o.statusByte<=G.sequenceSpecific?(g=[255,o.statusByte,...UA(o.data.length),...o.data],r=void 0):o.statusByte===G.systemExclusive?(g=[240,...UA(o.data.length),...o.data],r=void 0):(g=[],r!==o.statusByte&&(r=o.statusByte,g.push(o.statusByte)),g.push(...o.data)),n.push(...UA(i),...g),a+=i}n.push(0,255,G.endOfTrack,0),e.push(n)}let A=[];ws("MThd",A),A.push(...sA(6,4),0,t.format,...sA(t.tracks.length,2),...sA(t.timeDivision,2));for(let s of e)ws("MTrk",A),A=A.concat(sA(s.length,4),s);return new Uint8Array(A).buffer}var nA=`SPESSASYNTH_EMBEDDED_BANK_${Math.random()}_DO_NOT_DELETE`,Jn=32767,Kn={time:0},Vn=.03,Xn=.07,Zn=.6;var hA=1/Math.cos(Math.PI/4)**2;var bs=121,Se=class{static getDefaultBank(t){return t==="gm2"?bs:0}static getDrumBank(t){switch(t){default:throw new Error(`${t} doesn't have a bank MSB for drums.`);case"gm2":return 120;case"xg":return 127}}static isXGDrum(t){return t===120||t===127}static isValidXGMSB(t){return this.isXGDrum(t)||t===64||t===bs}static isSystemXG(t){return t==="gm2"||t==="xg"}static addBankOffset(t,e,A){return this.isXGDrum(t)&&A?t:Math.min(t+e,127)}static subtractBankOffset(t,e,A){return this.isXGDrum(t)&&A?t:Math.max(0,t-e)}},ze=class zA{static toMIDIString(e){return e.isGMGSDrum?`DRUM:${e.program}`:`${e.bankLSB}:${e.bankMSB}:${e.program}`}static fromMIDIString(e){let A=e.split(":");if(A.length>3||A.length<2)throw new Error(`Invalid MIDI string: ${e}`);return e.startsWith("DRUM")?{bankMSB:0,bankLSB:0,program:Number.parseInt(A[1]),isGMGSDrum:!0}:{bankLSB:Number.parseInt(A[0]),bankMSB:Number.parseInt(A[1]),program:Number.parseInt(A[2]),isGMGSDrum:!1}}static toFullMIDIString(e){return`${this.toMIDIString(e)} ${e.isDrum?"D":"M"} ${e.name}`}static fromFullMIDIString(e){let A=e.indexOf(" "),s=e.indexOf(" ",A+1);if(A===-1||s===-1)throw new Error(`Invalid named MIDI string: ${e}`);let n=e.slice(0,Math.max(0,A)),a=e.slice(A+1,s),r=e.slice(Math.max(0,s+1));return{...zA.fromMIDIString(n),isDrum:a==="D",name:r}}static matches(e,A){return e.isGMGSDrum||A.isGMGSDrum?e.isGMGSDrum===A.isGMGSDrum&&e.program===A.program:e.program===A.program&&e.bankLSB===A.bankLSB&&e.bankMSB===A.bankMSB}static compare(e,A){return e.isGMGSDrum&&!A.isGMGSDrum?1:!e.isGMGSDrum&&A.isGMGSDrum?-1:e.program!==A.program?e.program-A.program:e.bankMSB!==A.bankMSB?e.bankMSB-A.bankMSB:e.bankLSB-A.bankLSB}static isXGDrum(e){return e.isDrum&&!e.isGMGSDrum}static selectPatch(e,A,s){if(e.length===0)throw new Error("No presets!");A.isGMGSDrum&&Se.isSystemXG(s)&&(A={...A,isGMGSDrum:!1,bankLSB:0,bankMSB:Se.getDrumBank(s)});let{isGMGSDrum:n,bankLSB:a,bankMSB:r,program:o}=A,i=Se.isSystemXG(s),g=Se.isXGDrum(r)&&i,l=e.find(I=>this.matches(I,A));if(l&&(!g||g&&this.isXGDrum(l)))return l;let C=I=>{h.info(`%cPreset %c${zA.toMIDIString(A)}%c not found. (${s}) Replaced with %c${this.toFullMIDIString(I)}`,d.warn,d.unrecognized,d.warn,d.value)};if(n){let I=e.find(E=>E.isGMGSDrum&&E.program===o);return I||(I=e.find(E=>E.isDrum&&E.program===o),I)?(C(I),I):(I=this.getAnyDrums(e,!1),C(I),I)}if(g){let I=e.find(E=>E.program===o&&E.isDrum&&!E.isGMGSDrum);return I||(I=e.find(E=>E.isDrum&&E.program===o),I&&I.program<49)?(C(I),I):(I=this.getAnyDrums(e,!0),C(I),I)}let B=e.filter(I=>I.program===o&&!I.isDrum);if(B.length===0)return C(e[0]),e[0];if(l=i?B.find(I=>I.bankLSB===a):B.find(I=>I.bankMSB===r),l)return C(l),l;if(a!==64||!i){let I=Math.max(r,a);if(l=B.find(E=>E.bankLSB===I||E.bankMSB===I),l)return C(l),l}return C(B[0]),B[0]}static getAnyDrums(e,A){let s=A?e.find(n=>this.isXGDrum(n)):e.find(n=>n.isGMGSDrum);return s||(e.find(n=>n.isDrum)??e[0])}},fe=Object.freeze({type:"Other"}),se=class $A{static analyzeSysEx(e){if(e.length<3)return fe;switch(e[0]){default:return fe;case 126:case 127:return this.analyzeGM(e);case 65:return this.analyzeGS(e);case 67:return this.analyzeXG(e)}}static analyzeRPN(e,A,s){switch(A){default:return fe;case ut.fineTuning:return{type:"Fine Tune",channel:e,value:(s-8192)/81.92};case ut.coarseTuning:return{type:"Key Shift",channel:e,value:(s>>7)-64}}}static analyzeNRPN(e,A,s){let n=A>>7,a=A&127;switch(n){default:return fe;case ye.partParameter:switch(a){default:return fe;case Pe.vibratoRate:return{type:"Controller Change",channel:e,controller:f.vibratoRate,value:s>>7};case Pe.vibratoDepth:return{type:"Controller Change",channel:e,controller:f.vibratoDepth,value:s>>7};case Pe.vibratoDelay:return{type:"Controller Change",channel:e,controller:f.vibratoDelay,value:s>>7};case Pe.tvfCutoffFrequency:return{type:"Controller Change",channel:e,controller:f.brightness,value:s>>7};case Pe.tvfResonance:return{type:"Controller Change",channel:e,controller:f.filterResonance,value:s>>7};case Pe.envelopeAttackTime:return{type:"Controller Change",channel:e,controller:f.attackTime,value:s>>7};case Pe.envelopeDecayTime:return{type:"Controller Change",channel:e,controller:f.decayTime,value:s>>7};case Pe.envelopeReleaseTime:return{type:"Controller Change",channel:e,controller:f.releaseTime,value:s>>7}}case ye.drumPitch:case ye.drumPitchFine:case ye.drumLevel:case ye.drumPan:case ye.drumReverb:case ye.drumChorus:case ye.drumDelay:return{type:"Drum Setup"}}}static syxToChannel(e){return[9,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15][e%16]}static channelToSyx(e){return[1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15][e%16]}static gsData(e,A,s,n){let a=128-(e+A+s+n.reduce((r,o)=>r+o,0))%128&127;return[65,16,66,18,e,A,s,...n,a,247]}static gsMessage(e,A,s,n,a){return new We(e,G.systemExclusive,new Uint8Array(this.gsData(A,s,n,a)))}static gsDrumChange(e,A,s){let n=16|this.channelToSyx(A);return this.gsMessage(e,40,n,21,[s])}static gsReset(e){return this.gsMessage(e,64,0,127,[0])}static analyzeGM(e){if(e.length<4)return fe;if(e[2]===4)switch(e[3]){default:return fe;case 3:return{type:"Master Fine Tune",value:((e[5]<<7|e[6])-8192)/81.92};case 4:return{type:"Master Key Shift",value:e[5]-64};case 5:if(e[4]!==1||e[5]!==1||e[6]!==1||e[7]!==1)return fe;switch(e[8]){default:return fe;case 1:switch(e[9]){default:return fe;case 1:case 2:return{type:"Reverb Param"}}case 2:switch(e[9]){default:return fe;case 1:case 2:case 3:case 4:return{type:"Chorus Param"}}}}if(e[2]!==9)return fe;switch(e[3]){default:return fe;case 1:return{type:"GM On"};case 2:return{type:"GM Off"};case 3:return{type:"GM2 On"}}}static analyzeXG(e){if(e[2]!==76||e.length<7)return fe;let A=e[3],s=e[4],n=e[5],a=e[6];if(A===0&&s===0)switch(n){default:return fe;case 0:return{type:"Master Fine Tune",value:(((e[6]&15)<<12|(e[7]&15)<<8|(e[8]&15)<<4|e[9]&15)-1024)/10};case 6:return{type:"Master Key Shift",value:a-64};case 126:case 127:return{type:"XG Reset"}}if(A===2&&s===1)return n<=21?{type:"Reverb Param"}:n<=53?{type:"Chorus Param"}:{type:"Variation Param"};if(A===3&&s===0)return{type:"Variation Param"};if(A===8){let r=s;if(r>=16)return fe;switch(n){default:return fe;case 1:return{type:"Controller Change",channel:r,controller:f.bankSelect,value:a};case 2:return{type:"Controller Change",channel:r,controller:f.bankSelectLSB,value:a};case 3:return{type:"Program Change",channel:r,value:a};case 5:return{type:"Controller Change",channel:r,controller:a===1?f.polyModeOn:f.monoModeOn,value:0};case 7:return{type:"Drums On",channel:r,isDrum:a>0};case 8:return{type:"Key Shift",channel:r,value:a-64};case 11:return{type:"Controller Change",channel:r,controller:f.mainVolume,value:a};case 14:return{type:"Controller Change",channel:r,controller:f.pan,value:a};case 18:return{type:"Controller Change",channel:r,controller:f.chorusDepth,value:a};case 19:return{type:"Controller Change",channel:r,controller:f.reverbDepth,value:a};case 21:return{type:"Controller Change",channel:r,controller:f.vibratoRate,value:a};case 22:return{type:"Controller Change",channel:r,controller:f.vibratoDepth,value:a};case 23:return{type:"Controller Change",channel:r,controller:f.vibratoDelay,value:a};case 24:return{type:"Controller Change",channel:r,controller:f.brightness,value:a};case 25:return{type:"Controller Change",channel:r,controller:f.filterResonance,value:a};case 26:return{type:"Controller Change",channel:r,controller:f.attackTime,value:a};case 27:return{type:"Controller Change",channel:r,controller:f.decayTime,value:a};case 12:return{type:"Controller Change",channel:r,controller:f.releaseTime,value:a}}}return A>>4===3?{type:"Drum Setup"}:fe}static analyzeGS(e){if(e.length<10||e[2]!==66||e[3]!==18)return fe;let A=e[4],s=e[5],n=e[6],a=e[7];if((A===0||A===64)&&s===0)switch(n){case 127:switch(a){case 0:return{type:"GS Reset"};case 127:return{type:"GM On"}}return fe;case 0:return{type:"Master Fine Tune",value:((a<<12|e[8]<<8|e[9]<<4|e[10])-1024)/10}}if(A===65)return{type:"Drum Setup"};if(A!==64)return fe;if(s===0&&n===5)return{type:"Master Key Shift",value:a-64};if(s===1){if(n>=48&&n<=55)return{type:"Reverb Param"};if(n>=56&&n<=64)return{type:"Chorus Param"};if(n>=80&&n<=90)return{type:"Delay Param"}}if(s===3&&n>=0&&n<=127)return{type:"Insertion Param"};if(s>>4===1){let r=$A.syxToChannel(s&15);switch(n){default:return fe;case 0:return{type:"Program Change",channel:r,value:a};case 19:return{type:"Controller Change",channel:r,controller:a===1?f.polyModeOn:f.monoModeOn,value:0};case 21:return{type:"Drums On",channel:r,isDrum:a>0};case 22:return{type:"Key Shift",channel:r,value:a-64};case 25:return{type:"Controller Change",channel:r,controller:f.mainVolume,value:a};case 28:return{type:"Controller Change",channel:r,controller:f.pan,value:a};case 33:return{type:"Controller Change",channel:r,controller:f.chorusDepth,value:a};case 34:return{type:"Controller Change",channel:r,controller:f.reverbDepth,value:a};case 42:return{type:"Fine Tune",channel:r,value:((a<<7|e[8])-8192)/81.92};case 44:return{type:"Controller Change",channel:r,controller:f.variationDepth,value:a};case 48:return{type:"Controller Change",channel:r,controller:f.vibratoRate,value:a};case 49:return{type:"Controller Change",channel:r,controller:f.vibratoDepth,value:a};case 50:return{type:"Controller Change",channel:r,controller:f.brightness,value:a};case 51:return{type:"Controller Change",channel:r,controller:f.filterResonance,value:a};case 52:return{type:"Controller Change",channel:r,controller:f.attackTime,value:a};case 53:return{type:"Controller Change",channel:r,controller:f.decayTime,value:a};case 54:return{type:"Controller Change",channel:r,controller:f.releaseTime,value:a};case 55:return{type:"Controller Change",channel:r,controller:f.vibratoDelay,value:a}}}if(s>>4===4){let r=$A.syxToChannel(s&15);switch(n){default:return fe;case 0:case 1:return{type:"Controller Change",channel:r,controller:f.bankSelectLSB,value:a};case 34:return{type:"Insertion Param"}}}return fe}},_n="Created using SpessaSynth";function Wn(t,e,A){let s="gm",n=[],a=new Array(t.tracks.length).fill(0),r=16+Math.max(...t.portChannelOffsetMap),o=[];for(let i=0;i<r;i++)o.push({program:0,isDrum:i%16===9,lastBank:void 0,lastBankLSB:void 0,hasBankSelect:!1});t.iterate((i,g,l)=>{let C=t.portChannelOffsetMap[a[g]];if(i.statusByte===G.midiPort){a[g]=i.data[0];return}let B=i.statusByte&240;if(B!==G.controllerChange&&B!==G.programChange&&B!==G.systemExclusive)return;if(B===G.systemExclusive){let S=se.analyzeSysEx(i.data);switch(S.type){default:return;case"Drums On":{let p=S.channel+C;o[p].isDrum=S.isDrum;return}case"XG Reset":s="xg";return;case"GS Reset":s="gs";return;case"GM Off":case"GM On":s="gm",n.push({tNum:g,e:i});return;case"GM2 On":s="gm2";return;case"Controller Change":{let p=t.tracks[g],w=new We(i.ticks,G.controllerChange|S.channel,new Uint8Array([S.controller,S.value]));p.events[l[g]]=w,i=w,h.info("%cReplaced a system exclusive with controller change!",d.info);break}case"Program Change":{let p=t.tracks[g],w=new We(i.ticks,G.programChange|S.channel,new Uint8Array([S.value]));p.events[l[g]]=w,i=w,h.info("%cReplaced a system exclusive with program change!",d.info);break}}}let I=(i.statusByte&15)+C,E=o[I];if(B===G.programChange){let S={program:i.data[0],bankLSB:E.lastBankLSB?.data?.[1]??0,bankMSB:Se.subtractBankOffset(E.lastBank?.data?.[1]??0,t.bankOffset,s==="xg"),isGMGSDrum:E.isDrum},p=A.getPreset(S,s);if(h.info(`%cInput patch: %c${ze.toMIDIString(S)}%c. Channel %c${I}%c. Changing patch to ${p.toString()}.`,d.info,d.unrecognized,d.info,d.recognized,d.info),i.data[0]=p.program,p.isGMGSDrum&&Se.isSystemXG(s)||E.lastBank===void 0||(E.lastBank.data[1]=Se.addBankOffset(p.bankMSB,e,s==="xg"),E.lastBankLSB===void 0))return;E.lastBankLSB.data[1]=p.bankLSB;return}let y=i.data[0]===f.bankSelectLSB;i.data[0]!==f.bankSelect&&!y||(E.hasBankSelect=!0,y?E.lastBankLSB=i:E.lastBank=i)});for(let i=0;i<o.length;i++){let g=o[i];if(g.hasBankSelect)continue;let l=i%16,C=G.programChange|l,B=Math.floor(i/16)*16,I=t.portChannelOffsetMap.indexOf(B),E=t.tracks.find(R=>R.port===I&&R.channels.has(l));if(E===void 0)continue;let y=E.events.findIndex(R=>R.statusByte===C);if(y===-1){let R=E.events.findIndex(Q=>Q.statusByte>128&&Q.statusByte<240&&(Q.statusByte&15)===l);if(R===-1)continue;let M=E.events[R].ticks,k=A.getPreset({bankMSB:0,bankLSB:0,program:0,isGMGSDrum:!1},s).program;E.addEvents(R,new We(M,G.programChange|l,new ee([k]))),y=R}h.info(`%cAdding bank select for %c${i}`,d.info,d.recognized);let S=E.events[y].ticks,p=A.getPreset({bankLSB:0,bankMSB:0,program:g.program,isGMGSDrum:g.isDrum},s),w=Se.addBankOffset(p.bankMSB,e,s==="xg");E.addEvents(y,new We(S,G.controllerChange|l,new ee([f.bankSelect,w])))}if(s==="gm"&&!Se.isSystemXG(s)){for(let g of n){let l=t.tracks[g.tNum];l.deleteEvent(l.events.indexOf(g.e))}let i=0;t.tracks[0].events[0].statusByte===G.trackName&&i++,t.tracks[0].addEvents(i,se.gsReset(0))}t.flush()}var Rs={bankOffset:0,metadata:{},correctBankOffset:!0,soundBank:void 0};function zn(t,e,A){let s=A.metadata;if(h.group("%cWriting the RMIDI File...",d.info),h.info("metadata",s),h.info("Initial bank offset",t.bankOffset),A.correctBankOffset){if(!A.soundBank)throw new Error("Sound bank must be provided if correcting bank offset.");Wn(t,A.bankOffset,A.soundBank)}let n=new ee(t.writeMIDI());s.name??=t.getName(),s.creationDate??=new Date,s.copyright??=_n,s.software??="SpessaSynth",Object.entries(s).forEach(i=>{let g=i;g[1]&&t.setRMIDInfo(g[0],g[1])});let a=[],r=(i,g)=>{a.push(U.write(i,g))};for(let i of Object.entries(t.rmidiInfo)){let g=i[0],l=i[1];switch(g){case"album":r("IALB",l),r("IPRD",l);break;case"software":r("ISFT",l);break;case"infoEncoding":r("IENC",l);break;case"creationDate":r("ICRD",l);break;case"picture":r("IPIC",l);break;case"name":r("INAM",l);break;case"artist":r("IART",l);break;case"genre":r("IGNR",l);break;case"copyright":r("ICOP",l);break;case"comment":r("ICMT",l);break;case"engineer":r("IENG",l);break;case"subject":r("ISBJ",l);break;case"midiEncoding":r("MENC",l);break}}let o=new ee(2);return hs(o,A.bankOffset,2),a.push(U.write("DBNK",o)),h.info("%cFinished!",d.info),h.groupEnd(),U.writeParts("RIFF",[$e("RMID"),U.write("data",n),U.writeParts("INFO",a,!0),new ee(e)]).buffer}var QA=class{rpnMSB={v:127,track:0,event:0};rpnLSB={v:127,track:0,event:0};nrpnMSB={v:0,track:0,event:0};nrpnLSB={v:0,track:0,event:0};dataMSB={v:0,track:0,event:0};dataLSB={v:0,track:0,event:0};channel;isRegistered=!0;constructor(t){this.channel=t}get paramMSB(){return this.isRegistered?this.rpnMSB:this.nrpnMSB}get paramLSB(){return this.isRegistered?this.rpnLSB:this.nrpnLSB}reset(){this.isRegistered=!0,this.rpnLSB.v=127,this.rpnMSB.v=127,this.nrpnMSB.v=0,this.nrpnLSB.v=0,this.resetData()}controllerChange(t,e,A,s){switch(t){case f.registeredParameterMSB:this.resetData(),this.isRegistered=!0,this.rpnMSB={v:e,track:A,event:s};break;case f.registeredParameterLSB:this.resetData(),this.isRegistered=!0,this.rpnLSB={v:e,track:A,event:s};break;case f.nonRegisteredParameterMSB:this.resetData(),this.isRegistered=!1,this.nrpnMSB={v:e,track:A,event:s};break;case f.nonRegisteredParameterLSB:this.resetData(),this.isRegistered=!1,this.nrpnLSB={v:e,track:A,event:s};break;case f.dataEntryMSB:return this.dataMSB={v:e,track:A,event:s},this.analyze();case f.dataEntryLSB:return this.dataLSB={v:e,track:A,event:s},this.analyze()}}resetData(){this.dataLSB.v=0,this.dataMSB.v=0}analyze(){let t=this.dataMSB.v<<7|this.dataLSB.v;return this.isRegistered?se.analyzeRPN(this.channel,this.rpnMSB.v<<7|this.rpnLSB.v,t):se.analyzeNRPN(this.channel,this.nrpnMSB.v<<7|this.nrpnLSB.v,t)}};function $n(t,e){h.groupCollapsed("%cSearching for all used programs and keys...",d.info);let A=16+Math.max(...t.portChannelOffsetMap),s=[],n="gs",a=0,r=B=>{n=B,a=0;for(let I=0;I<A;I++){let E=s[I];E.isDrum=I%16===9,E.bankMSB=Se.getDefaultBank(B),E.bankLSB=0,E.keyShift=0,E.param.reset()}};for(let B=0;B<A;B++){let I=B%16===9;s.push({preset:e.getPreset({bankLSB:0,bankMSB:0,isGMGSDrum:I,program:0},n),bankMSB:0,bankLSB:0,param:new QA(B),isDrum:I,keyShift:0})}let o=new Map,i=t.tracks.map(B=>B.port),g=t.portChannelOffsetMap,{timeline:l,tracks:C}=t;for(let B of l){let I=B.tr,E=B.ev,y=C[I].events[E];if(y.statusByte===G.midiPort&&t.tracks[I].channels.size>0){let w=y.data[0];g[w]===void 0&&(h.warn(`Invalid port ${w} on track ${I}. (No offset found in the MIDI map.`),w=0),i[I]=w;continue}let S=y.statusByte&240;if(S!==G.noteOn&&S!==G.controllerChange&&S!==G.programChange&&S!==G.systemExclusive)continue;let p=g[i[I]]||0;switch(S){case G.programChange:{let w=s[(y.statusByte&15)+p];w.preset=e.getPreset({bankMSB:w.bankMSB,bankLSB:w.bankLSB,program:y.data[0],isGMGSDrum:w.isDrum},n);break}case G.controllerChange:{let w=s[(y.statusByte&15)+p],R=y.data[0],M=y.data[1];switch(R){case f.registeredParameterMSB:case f.registeredParameterLSB:case f.nonRegisteredParameterLSB:case f.nonRegisteredParameterMSB:w.param.controllerChange(R,M,I,E);break;case f.dataEntryMSB:case f.dataEntryLSB:{let k=w.param.controllerChange(R,M,I,E);k?.type==="Key Shift"&&(w.keyShift=w.isDrum?0:k.value);break}case f.resetAllControllers:w.param.reset();break;case f.bankSelect:w.bankMSB=M;break;case f.bankSelectLSB:w.bankLSB=M;break}break}case G.noteOn:{let w=s[(y.statusByte&15)+p];if(y.data[1]===0||!w.preset)continue;let R=o.get(w.preset);R||(R=new Map,o.set(w.preset,R));let M=y.data[0]+(w.isDrum?0:a)+w.keyShift,k=R.get(M);k||(k=new Set,R.set(M,k)),k.add(y.data[1]);break}case G.systemExclusive:{let w=se.analyzeSysEx(y.data);switch(w.type){default:break;case"XG Reset":r("xg"),h.info("%cXG on detected!",d.recognized);break;case"GM2 On":r("gm2"),h.info("%cGM2 on detected!",d.recognized);break;case"GM On":r("gm"),h.info("%cGM on detected!",d.recognized);break;case"GM Off":case"GS Reset":r("gs"),h.info("%cGS on detected!",d.recognized);break;case"Master Key Shift":a=w.value;break;case"Key Shift":{let R=s[w.channel];R.keyShift=R.isDrum?0:w.value;break}case"Drums On":{let R=w.channel+p;s[R].isDrum=w.isDrum;break}case"Program Change":{let R=s[w.channel+p];R.preset=e.getPreset({bankMSB:R.bankMSB,bankLSB:R.bankLSB,program:w.value,isGMGSDrum:R.isDrum},n);break}case"Controller Change":{let R=w.channel+p;w.controller===f.bankSelectLSB?s[R].bankLSB=w.value:w.controller===f.bankSelect&&(s[R].bankMSB=w.value)}}}}}for(let[B,I]of o.entries())I.size===0&&(h.info(`%cDetected change but no keys for %c${B.name}`,d.info,d.value),o.delete(B));return h.groupEnd(),o}var jn=t=>(t.data=new ee(t.data.buffer),6e7/xt(t.data,3));function ea(t,e=0){let A=[];for(let C=0;C<16;C++)A.push([]);let s=0,n=60/(120*t.timeDivision),a=0,r=0,o=[];for(let C=0;C<16;C++)o.push(new Map);let i=(C,B)=>{let I=o[B],E=I.get(C);if(E===void 0)return;let y=A[B][E],S=s-y.start;y.length=B===9?Math.max(S,e):S,I.delete(C),r--},{timeline:g,tracks:l}=t;for(;a<g.length;){let C=g[a],B=l[C.tr].events[C.ev],I=B.statusByte>>4,E=B.statusByte&15;if(I===8)i(B.data[0],E);else if(I===9){let y=B.data[0],S=B.data[1];if(S===0)i(y,E);else{i(y,E);let p={midiNote:y,start:s,length:-1,velocity:S},w=A[E];w.push(p),o[E].set(y,w.length-1),r++}}else B.statusByte===81&&(n=60/(jn(B)*t.timeDivision));if(++a>=g.length)break;s+=n*(l[g[a].tr].events[g[a].ev].ticks-B.ticks)}if(r>0)for(let C=0;C<o.length;C++)for(let B of o[C].values()){let I=A[C][B];I.length=s-I.start}return A}var ta={character:49,preLowpass:50,level:51,time:52,delayFeedback:53,preDelayTime:55},Aa={preLowpass:57,level:58,feedback:59,delay:60,rate:61,depth:62,sendLevelToReverb:63,sendLevelToDelay:64},sa={preLowpass:81,timeCenter:82,timeRatioLeft:83,timeRatioRight:84,levelCenter:85,levelLeft:86,levelRight:87,level:88,feedback:89,sendLevelToReverb:90};function Mt(t,e,A,s){return new We(s,G.controllerChange|t%16,new ee([e,A]))}function na(t,e){h.groupCollapsed("%cApplying changes to the MIDI file...",d.info);let{channels:A,reverbParams:s,chorusParams:n,delayParams:a,insertionParams:r}=e;h.info("Desired channel changes",A),h.info("Desired reverb parameters",s),h.info("Desired chorus parameters",n),h.info("Desired delay parameters",a),h.info("Desired insertion parameters",r);let o=e.drumSetupParams==="clear",i=new Set,g=new Map;if(A)for(let[m,D]of A)D==="clear"?i.add(m):g.set(m,D);let l="gs",C=!1,B=0,I=0,E=t.tracks.map(m=>m.port),y={},S=0,p=(m,D)=>{t.tracks[m].channels.size!==0&&(S===0&&(S+=16,y[D]=0),y[D]===void 0&&(y[D]=S,S+=16),E[m]=D)};for(let[m,D]of t.tracks.entries())p(m,D.port);let w=S,R=[];for(let m=0;m<w;m++)R.push({isFirstNoteOn:!0,param:new QA(m),clearedParams:{pLSB:!0,pMSB:!0,data:!0},keyShift:g.get(m)?.keyShift??0,fineTune:g.get(m)?.fineTune??0});if(t.iterate((m,D,q)=>{let K=t.tracks[D],O=q[D],Y=()=>{K.deleteEvent(O),q[D]--},H=W=>{let _=R[W],$=_.param,ne=$.paramMSB,ae=$.paramLSB;h.info(`%cClearing Non/Registered Parameter on ${W}. Clear MSB: %c${_.clearedParams.pMSB}%c, clear LSB: %c${_.clearedParams.pLSB}%c, clear data: %c${_.clearedParams.data}.`,d.info,d.recognized,d.info,d.recognized,d.info,d.recognized),_.clearedParams.data||(Y(),D===ne.track&&O<ne.event&&ne.event--,D===ae.track&&O<ae.event&&ae.event--,_.clearedParams.data=!0),_.clearedParams.pMSB||(t.tracks[ne.track].deleteEvent(ne.event),q[ne.track]--,ne.track===ae.track&&ne.event<ae.event&&ae.event--,_.clearedParams.pMSB=!0),_.clearedParams.pLSB||(t.tracks[ae.track].deleteEvent(ae.event),q[ae.track]--,_.clearedParams.pLSB=!0)},Z=(W,_=0)=>{K.addEvents(O+_,W),q[D]++},T=y[E[D]]||0;if(m.statusByte===G.midiPort){p(D,m.data[0]);return}if(m.statusByte<G.noteOff||m.statusByte>G.systemExclusive)return;let F=m.statusByte&240,u=m.statusByte&15,x=u+T;if(m.statusByte!==G.systemExclusive&&i.has(x)){Y();return}let P=R[x],te=g.get(x);switch(F){case G.noteOn:if(!te)break;if(P.isFirstNoteOn){if(P.isFirstNoteOn=!1,te.controllers)for(let[_,$]of te.controllers)$!=="clear"&&Z(Mt(u,_,$,m.ticks));if(P.fineTune!==0){let _=Math.floor(P.fineTune*81.92)+8192,$=Mt(u,f.registeredParameterMSB,0,m.ticks),ne=Mt(u,f.registeredParameterLSB,1,m.ticks),ae=Mt(x,f.dataEntryMSB,_>>7&127,m.ticks);Z(Mt(u,f.dataEntryLSB,_&127,m.ticks)),Z(ae),Z(ne),Z($)}let W=te.patch;if(W&&W!=="clear"){h.info(`%cSetting %c${x}%c to %c${ze.toMIDIString(W)}%c. Track num: %c${D}`,d.info,d.recognized,d.info,d.recognized,d.info,d.recognized);let _=W.bankMSB,$=W.bankLSB,ne=W.program;Z(new We(m.ticks,G.programChange|u,new ee([ne])));let ae=(J,ie)=>{Z(Mt(u,J?f.bankSelectLSB:f.bankSelect,ie,m.ticks))};Se.isSystemXG(l)&&W.isGMGSDrum&&(h.info(`%cAdding XG Drum change on track %c${D}`,d.recognized,d.value),_=Se.getDrumBank(l),$=0),ae(!1,_),ae(!0,$),W.isGMGSDrum&&!Se.isSystemXG(l)&&u!==9&&(h.info(`%cAdding GS Drum change on track %c${D}`,d.recognized,d.value),Z(se.gsDrumChange(m.ticks,u,1)))}}m.data[0]+=P.keyShift;break;case G.noteOff:if(!te)break;m.data[0]+=P.keyShift;break;case G.programChange:if(te?.patch){Y();return}break;case G.controllerChange:{let W=m.data[0],_=m.data[1];if(te?.controllers?.get(W)){Y();return}switch(W){case f.bankSelect:case f.bankSelectLSB:te?.patch&&Y();return;case f.registeredParameterLSB:case f.registeredParameterMSB:case f.nonRegisteredParameterMSB:case f.nonRegisteredParameterLSB:W===f.nonRegisteredParameterLSB||W===f.registeredParameterLSB?P.clearedParams.pLSB=!1:P.clearedParams.pMSB=!1,P.param.controllerChange(W,_,D,O);return;case f.dataEntryMSB:case f.dataEntryLSB:{P.clearedParams.data=!1;let $=P.param.controllerChange(W,_,D,O);if(!$)return;switch($.type){case"Drum Setup":o&&H(x);return;case"Controller Change":{let ne=$.controller,ae=$.channel;if(te?.controllers?.get(ne)){H(ae);return}(ne===f.bankSelect||ne===f.bankSelectLSB)&&te?.patch&&H(ae);break}case"Fine Tune":if(P.fineTune){if(P.isFirstNoteOn){let ne=P.fineTune+$.value;P.keyShift+=Math.trunc(ne/100),P.fineTune=ne%100,h.info(`%cFine tuning already present on ${x}, new relative tune: %c${ne} cents`,d.info,d.recognized)}H(x)}return}P.clearedParams.pLSB=!0,P.clearedParams.pMSB=!0;return}default:return}}case G.systemExclusive:{let W=se.analyzeSysEx(m.data);switch(W.type){default:return;case"XG Reset":h.info("%cXG system on detected",d.info),l="xg",C=!0,B=D,I=O;for(let _ of R)_.param.reset(),_.clearedParams={pLSB:!0,pMSB:!0,data:!0};return;case"GM2 On":h.info("%cGM2 system on detected",d.info),l="gm2",C=!0,B=D,I=O;for(let _ of R)_.param.reset(),_.clearedParams={pLSB:!0,pMSB:!0,data:!0};return;case"GS Reset":h.info("%cGS on detected!",d.recognized),C=!0,B=D,I=O;for(let _ of R)_.param.reset(),_.clearedParams={pLSB:!0,pMSB:!0,data:!0};return;case"GM Off":case"GM On":h.info("%cGM on detected, removing!",d.info),Y(),C=!1;return;case"Drum Setup":o&&Y();return;case"Reverb Param":s&&Y();return;case"Chorus Param":n&&Y();return;case"Delay Param":a&&Y();return;case"Insertion Param":r&&Y();return;case"Program Change":g.get(W.channel+T)?.patch&&Y();return;case"Fine Tune":{let _=g.get(W.channel+T),$=R[W.channel+T];if($.isFirstNoteOn&&_){let ne=$.fineTune+W.value;$.keyShift+=Math.trunc(ne/100),$.fineTune=ne%100,h.info(`%cFine tuning already present on ${W.channel+T}, new relative tune: %c${ne} cents`,d.info,d.recognized),Y()}break}case"Controller Change":{let _=W.controller,$=g.get(W.channel+T);if($?.controllers?.get(_)!==void 0){Y();return}(_===f.bankSelect||_===f.bankSelectLSB)&&$?.patch&&Y();return}}}}}),!C&&[...g.values()].some(m=>m.patch&&m.patch!=="clear")){let m=0;t.tracks[0].events[0].statusByte===G.trackName&&m++,t.tracks[0].addEvents(m,se.gsReset(0)),B=0,I=m,h.info("%cGS on not detected. Adding it.",d.info)}let M=Math.max(0,t.firstNoteOn),k=t.tracks[B],Q=I+1;if(s&&s!=="clear"){let m=ta,D=s;k.addEvents(Q,se.gsMessage(M,64,1,m.level,[D.level]),se.gsMessage(M,64,1,m.preLowpass,[D.preLowpass]),se.gsMessage(M,64,1,m.character,[D.character]),se.gsMessage(M,64,1,m.time,[D.time]),se.gsMessage(M,64,1,m.delayFeedback,[D.delayFeedback]),se.gsMessage(M,64,1,m.preDelayTime,[D.preDelayTime]))}if(n&&n!=="clear"){let m=Aa,D=n;k.addEvents(Q,se.gsMessage(M,64,1,m.level,[D.level]),se.gsMessage(M,64,1,m.preLowpass,[D.preLowpass]),se.gsMessage(M,64,1,m.feedback,[D.feedback]),se.gsMessage(M,64,1,m.delay,[D.delay]),se.gsMessage(M,64,1,m.rate,[D.rate]),se.gsMessage(M,64,1,m.depth,[D.depth]),se.gsMessage(M,64,1,m.sendLevelToReverb,[D.sendLevelToReverb]),se.gsMessage(M,64,1,m.sendLevelToDelay,[D.sendLevelToDelay]))}if(a&&a!=="clear"){let m=sa,D=a;k.addEvents(Q,se.gsMessage(M,64,1,m.level,[D.level]),se.gsMessage(M,64,1,m.preLowpass,[D.preLowpass]),se.gsMessage(M,64,1,m.timeCenter,[D.timeCenter]),se.gsMessage(M,64,1,m.timeRatioLeft,[D.timeRatioLeft]),se.gsMessage(M,64,1,m.timeRatioRight,[D.timeRatioRight]),se.gsMessage(M,64,1,m.levelCenter,[D.levelCenter]),se.gsMessage(M,64,1,m.levelLeft,[D.levelLeft]),se.gsMessage(M,64,1,m.levelRight,[D.levelRight]),se.gsMessage(M,64,1,m.feedback,[D.feedback]),se.gsMessage(M,64,1,m.sendLevelToReverb,[D.sendLevelToReverb]))}if(r&&r!=="clear"){let m=r;for(let D=0;D<m.channels.length;D++)m.channels[D]&&k.addEvents(M,se.gsMessage(M,64,64|se.channelToSyx(D),34,[1]));for(let D=0;D<m.params.length;D++){let q=m.params[D];q!==255&&k.addEvents(Q,se.gsMessage(M,64,3,D+3,[q]))}k.addEvents(Q,se.gsMessage(M,64,3,0,[m.type>>8,m.type&127]))}t.flush(),h.groupEnd()}var RA=class An{name="";port=0;channels=new Set;events=[];static copyFrom(e){let A=new An;return A.copyFrom(e),A}copyFrom(e){this.name=e.name,this.port=e.port,this.channels=new Set(e.channels),this.events=e.events.map(A=>new We(A.ticks,A.statusByte,new ee(A.data)))}addEvent(e,A){this.events.splice(A,0,e)}addEvents(e,...A){this.events.splice(e,0,...A)}deleteEvent(e){this.events.splice(e,1)}pushEvent(e){this.events.push(e)}},aa={8:2,9:2,10:2,11:2,12:1,13:1,14:2};function Cs(t,e,A){h.groupCollapsed("%cParsing MIDI File...",d.info),t.fileName=A;let s=r=>{let o=Ee(r,4),i=Nt(r,4),g={type:o,size:i,data:new ee(i)},l=r.slice(r.currentIndex,r.currentIndex+g.size);return g.data.set(l,0),r.currentIndex+=g.size,g},n=s(e);if(n.type!=="MThd")throw h.groupEnd(),new SyntaxError(`Invalid MIDI Header! Expected "MThd", got "${n.type}"`);if(n.size!==6)throw h.groupEnd(),new RangeError(`Invalid MIDI header chunk size! Expected 6, got ${n.size}`);t.format=Nt(n.data,2);let a=Nt(n.data,2);t.timeDivision=Nt(n.data,2);for(let r=0;r<a;r++){let o=new RA,i=s(e);if(i.type!=="MTrk")throw h.groupEnd(),new SyntaxError(`Invalid track header! Expected "MTrk" got "${i.type}"`);let g,l=0;t.format===2&&r>0&&(l+=t.tracks[r-1].events[t.tracks[r-1].events.length-1].ticks);let C=i.data;for(;C.currentIndex<i.size;){l+=Qe(C);let B=C[C.currentIndex],I;if(g!==void 0&&B<128)I=g;else{if(B<128)throw h.groupEnd(),new SyntaxError(`Unexpected byte with no running byte. (${B})`);I=B,C.currentIndex++}let E;I>=G.noteOff&&I<G.systemExclusive?(E=aa[I>>4],g=I):I===G.systemExclusive?E=Qe(C):I===255?(I=C[C.currentIndex++],E=Qe(C)):E=0;let y=new ee(E);y.set(C.slice(C.currentIndex,C.currentIndex+E)),o.pushEvent(new We(l,I,y)),C.currentIndex+=E}t.tracks.push(o),h.info(`%cParsed %c${t.tracks.length}%c / %c${t.tracks.length}`,d.info,d.value,d.info,d.value)}h.info("%cAll tracks parsed correctly!",d.recognized),t.flush(!1),h.groupEnd()}function Bs(t){return t.toISOString().split(".")[0]+"Z"}var ra=[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"]])];function ia(t){for(let e of ra){let A=t;for(let[n,a]of e.entries()){let r=new RegExp(n,"gi");A=A.replace(r,a)}let s=new Date(A);if(!Number.isNaN(s.getTime()))return s}}function oa(t){let e=/^(\d{2})\.(\d{2})\.(\d{4})$/.exec(t);if(e){let A=Number.parseInt(e[1]),s=Number.parseInt(e[2])-1,n=Number.parseInt(e[3]),a=new Date(n,s,A);if(!Number.isNaN(a.getTime()))return a}}function ga(t){let e=/^(\d{1,2})\s{1,2}(\d{1,2})\s{1,2}(\d{2})$/.exec(t);if(e){let A=e[1],s=(Number.parseInt(e[2])+1).toString(),n=e[3],a=new Date(`${s}/${A}/${n}`);if(!Number.isNaN(a.getTime()))return a}}function Ia(t){let e=/\b\d{4}\b/.exec(t);return e?new Date(e[0]):void 0}function Es(t){if(t=t.trim(),t.length===0)return new Date;let e=t.replaceAll(/\b(\d+)(st|nd|rd|th)\b/g,"$1").replace(/\s+at\s+/i," "),A=new Date(e);if(Number.isNaN(A.getTime())){let s=ia(t);if(s)return s;let n=oa(t);if(n)return n;let a=ga(t);if(a)return a;let r=Ia(t);return r||(h.warn(`Invalid date: "${t}". Replacing with the current date!`),new Date)}return A}function ca(t,e,A){e.currentIndex+=8;let s=Ee(e,4);if(s!=="RMID")throw h.groupEnd(),new SyntaxError(`Invalid RMIDI Header! Expected "RMID", got "${s}"`);let n=U.read(e);if(n.header!=="data")throw h.groupEnd(),new SyntaxError(`Invalid RMIDI Chunk header! Expected "data", got "${n.header}"`);let a=n.data,r=!1,o=!1;for(;e.currentIndex<e.length;){let i=e.currentIndex,g=U.read(e,!0);if(g.header==="RIFF"){let l=Ee(g.data,4).toLowerCase();l==="sfbk"||l==="sfpk"||l==="dls "?(h.info("%cFound embedded soundbank!",d.recognized),t.embeddedSoundBank=e.slice(i,i+g.size).buffer):h.warn(`Unknown RIFF chunk: "${l}"`),l==="dls "?t.isDLSRMIDI=!0:r=!0}else if(g.header==="LIST"&&Ee(g.data,4)==="INFO")for(h.info("%cFound RMIDI INFO chunk!",d.recognized);g.data.currentIndex<g.size;){let l=U.read(g.data,!0),C=l.header,B=l.data;switch(C){default:h.warn(`Unknown RMIDI Info: ${C}`);break;case"INAM":t.rmidiInfo.name=B;break;case"IALB":case"IPRD":t.rmidiInfo.album=B;break;case"ICRT":case"ICRD":t.rmidiInfo.creationDate=B;break;case"IART":t.rmidiInfo.artist=B;break;case"IGNR":t.rmidiInfo.genre=B;break;case"IPIC":t.rmidiInfo.picture=B;break;case"ICOP":t.rmidiInfo.copyright=B;break;case"ICMT":t.rmidiInfo.comment=B;break;case"IENG":t.rmidiInfo.engineer=B;break;case"ISFT":t.rmidiInfo.software=B;break;case"ISBJ":t.rmidiInfo.subject=B;break;case"IENC":t.rmidiInfo.infoEncoding=B;break;case"MENC":t.rmidiInfo.midiEncoding=B;break;case"DBNK":t.bankOffset=cs(B,2),o=!0;break}}}r&&!o&&(t.bankOffset=1),t.isDLSRMIDI&&(t.bankOffset=0),t.embeddedSoundBank===void 0&&(t.bankOffset=0),Cs(t,a,A)}var xA={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},vt={inLineResource:1,inFileResource:2,inFileNode:3,externalFile:4,externalXMF:5,XMFFileURIandNodeID:6},HA={StandardMIDIFile:0,StandardMIDIFileType1:1,DLS1:2,DLS2:3,DLS22:4,mobileDLS:5,unknown:-1,folder:-2},ha={standard:0,MMA:1,registered:2,nonRegistered:3},aA={none:0,MMAUnpacker:1,registered:2,nonRegistered:3},la=class sn{length;itemCount;metadataLength;metadata={};nodeData;innerNodes=[];packedContent=!1;nodeUnpackers=[];resourceFormat="unknown";referenceTypeID;constructor(e){let A=e.currentIndex;this.length=Qe(e),this.itemCount=Qe(e);let s=Qe(e),n=s-(e.currentIndex-A),a=e.slice(e.currentIndex,e.currentIndex+n);e.currentIndex+=n,this.metadataLength=Qe(a);let r=a.slice(a.currentIndex,a.currentIndex+this.metadataLength);a.currentIndex+=this.metadataLength;let o,i;for(;r.currentIndex<r.length;){r[r.currentIndex]===0?(r.currentIndex++,o=Qe(r),Object.values(xA).includes(o)?i=Object.keys(xA).find(I=>xA[I]===o)??"":(h.info(`Unknown field specifier: ${o}`),i=`unknown_${o}`)):(o=Ee(r,Qe(r)),i=o);let B=Qe(r);if(B===0){let I=Qe(r),E=r.slice(r.currentIndex,r.currentIndex+I);r.currentIndex+=I;let y=Qe(E);this.metadata[i]=y<4?Ee(E,I-1):E.slice(E.currentIndex)}else h.info(`International content: ${B}`),r.currentIndex+=Qe(r)}let g=a.currentIndex,l=Qe(a),C=a.slice(a.currentIndex,g+l);if(a.currentIndex=g+l,l>0)for(this.packedContent=!0;C.currentIndex<l;){let B={id:Qe(C)};switch(B.id){case aA.nonRegistered:case aA.registered:throw h.groupEnd(),new Error(`Unsupported unpacker ID: ${B.id}`);default:throw h.groupEnd(),new Error(`Unknown unpacker ID: ${B.id}`);case aA.none:B.standardID=Qe(C);break;case aA.MMAUnpacker:{let I=C[C.currentIndex++];I===0&&(I<<=8,I|=C[C.currentIndex++],I<<=8,I|=C[C.currentIndex++]);let E=Qe(C);B.manufacturerID=I,B.manufacturerInternalID=E}break}B.decodedSize=Qe(C),this.nodeUnpackers.push(B)}switch(e.currentIndex=A+s,this.referenceTypeID=Qe(e),this.nodeData=e.slice(e.currentIndex,A+this.length),e.currentIndex=A+this.length,this.referenceTypeID){case vt.inLineResource:break;case vt.externalXMF:case vt.inFileNode:case vt.XMFFileURIandNodeID:case vt.externalFile:case vt.inFileResource:throw h.groupEnd(),new Error(`Unsupported reference type: ${this.referenceTypeID}`);default:throw h.groupEnd(),new Error(`Unknown reference type: ${this.referenceTypeID}`)}if(this.isFile){if(this.packedContent){let I=this.nodeData.slice(2);h.info(`%cPacked content. Attempting to deflate. Target size: %c${this.nodeUnpackers[0].decodedSize}`,d.warn,d.value);try{this.nodeData=new ee(js(I).buffer)}catch(E){if(h.groupEnd(),E instanceof Error)throw new Error(`Error unpacking XMF file contents: ${E.message}.`,{cause:E})}}let B=this.metadata.resourceFormat;if(B===void 0)h.warn("No resource format for this file node!");else{B[0]!==ha.standard&&(h.info(`Non-standard formatTypeID: ${B.toString()}`),this.resourceFormat=B.toString());let I=B[1];Object.values(HA).includes(I)?this.resourceFormat=Object.keys(HA).find(E=>HA[E]===I):h.info(`Unrecognized resource format: ${I}`)}}else for(this.resourceFormat="folder";this.nodeData.currentIndex<this.nodeData.length;){let B=this.nodeData.currentIndex,I=Qe(this.nodeData),E=this.nodeData.slice(B,B+I);this.nodeData.currentIndex=B+I,this.innerNodes.push(new sn(E))}}get isFile(){return this.itemCount===0}};function Ca(t,e,A){t.bankOffset=0;let s=Ee(e,4);if(s!=="XMF_")throw h.groupEnd(),new SyntaxError(`Invalid XMF Header! Expected "_XMF", got "${s}"`);h.group("%cParsing XMF file...",d.info);let n=Ee(e,4);if(h.info(`%cXMF version: %c${n}`,d.info,d.recognized),n==="2.00"){let g=Nt(e,4),l=Nt(e,4);h.info(`%cFile Type ID: %c${g}%c, File Type Revision ID: %c${l}`,d.info,d.recognized,d.info,d.recognized)}Qe(e);let a=Qe(e);e.currentIndex+=a,e.currentIndex=Qe(e);let r=new la(e),o,i=g=>{let l=(C,B)=>{g.metadata[C]!==void 0&&typeof g.metadata[C]=="string"&&(t.rmidiInfo[B]=$e(g.metadata[C]))};if(l("nodeName","name"),l("title","name"),l("copyrightNotice","copyright"),l("comment","comment"),g.isFile)switch(g.resourceFormat){default:return;case"DLS1":case"DLS2":case"DLS22":case"mobileDLS":h.info("%cFound embedded DLS!",d.recognized),t.embeddedSoundBank=g.nodeData.buffer;break;case"StandardMIDIFile":case"StandardMIDIFileType1":h.info("%cFound embedded MIDI!",d.recognized),o=g.nodeData;break}else for(let C of g.innerNodes)i(C)};if(i(r),h.groupEnd(),!o)throw new Error("No MIDI data in the XMF file!");Cs(t,o,A)}function Ba(t,e){let A=new Map,s=e.systemParameters.keyShift,n=e.systemParameters.fineTune;for(let a=0;a<e.midiChannels.length;a++){let r=e.midiChannels[a];if(r.systemParameters.isMuted){A.set(a,"clear");continue}let o=r.systemParameters.keyShift+(r.drumChannel?0:s),i=r.systemParameters.fineTune+(r.drumChannel?0:n),g;r.systemParameters.presetLock&&r.patch&&(g={...r.patch});let l=new Map;for(let C=0;C<128;C++){if(!r.lockedControllers[C]||C===f.bankSelect)continue;let B=r.midiControllers[C]>>7;l.set(C,B)}A.set(a,{keyShift:o,fineTune:i,patch:g,controllers:l})}t.modify({channels:A,drumSetupParams:e.systemParameters.drumLock?"clear":void 0,reverbParams:e.systemParamete