spessasynth_lib 4.0.6 → 4.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -14,7 +14,7 @@ Output transform: ${this.transformName}
|
|
|
14
14
|
Destination: ${this.destinationName}`}write(){let A=new J(12);q(A,this.source.source),q(A,this.control.source),q(A,this.destination);let t=this.transform|this.control.toTransformFlag()<<4|this.source.toTransformFlag()<<10;return q(A,t),iA(A,this.scale),A}toSFGenerator(A){let t=this.destination,n=this.shortScale;switch(t){default:y(`%cFailed converting DLS articulator into SF generator: %c${this.toString()}%c
|
|
15
15
|
(invalid destination)`,c.warn,c.value,c.unrecognized);return;case G.pan:A.setGenerator(I.pan,n);break;case G.gain:A.addToGenerator(I.initialAttenuation,-n/.4);break;case G.filterCutoff:A.setGenerator(I.initialFilterFc,n);break;case G.filterQ:A.setGenerator(I.initialFilterQ,n);break;case G.modLfoFreq:A.setGenerator(I.freqModLFO,n);break;case G.modLfoDelay:A.setGenerator(I.delayModLFO,n);break;case G.vibLfoFreq:A.setGenerator(I.freqVibLFO,n);break;case G.vibLfoDelay:A.setGenerator(I.delayVibLFO,n);break;case G.volEnvDelay:A.setGenerator(I.delayVolEnv,n);break;case G.volEnvAttack:A.setGenerator(I.attackVolEnv,n);break;case G.volEnvHold:A.setGenerator(I.holdVolEnv,n);break;case G.volEnvDecay:A.setGenerator(I.decayVolEnv,n);break;case G.volEnvRelease:A.setGenerator(I.releaseVolEnv,n);break;case G.volEnvSustain:A.setGenerator(I.sustainVolEnv,1e3-n);break;case G.modEnvDelay:A.setGenerator(I.delayModEnv,n);break;case G.modEnvAttack:A.setGenerator(I.attackModEnv,n);break;case G.modEnvHold:A.setGenerator(I.holdModEnv,n);break;case G.modEnvDecay:A.setGenerator(I.decayModEnv,n);break;case G.modEnvRelease:A.setGenerator(I.releaseModEnv,n);break;case G.modEnvSustain:A.setGenerator(I.sustainModEnv,1e3-n);break;case G.reverbSend:A.setGenerator(I.reverbEffectsSend,n);break;case G.chorusSend:A.setGenerator(I.chorusEffectsSend,n);break;case G.pitch:A.fineTuning+=n;break}}toSFModulator(A){let t=this.shortScale,n,s,a=new XA,o=g=>{y(`%cFailed converting DLS articulator into SF2:
|
|
16
16
|
%c${this.toString()}%c
|
|
17
|
-
(${g})`,c.warn,c.value,c.unrecognized)},i=this.toCombinedSFDestination();if(i){n=i;let g=this.control.toSFSource();if(!g){o("Invalid control");return}s=g}else{let g=this.toSFDestination();if(!g){o("Invalid destination");return}typeof g=="object"?(t=g.newAmount,n=g.gen):n=g;let E=this.source.toSFSource();if(!E){o("Invalid source");return}s=E;let Q=this.control.toSFSource();if(!Q){o("Invalid control");return}a=Q}this.transform!==QA.linear&&s.curveType===QA.linear&&(s.curveType=this.transform),n===I.initialAttenuation&&((this.source.source===N.velocity||this.source.source===N.volume||this.source.source===N.expression)&&(s.isNegative=!0),t=Math.min(960,Math.max(0,t)));let r=new cA(s,a,n,t,0);A.addModulators(r)}toCombinedSFDestination(){let A=this.source.source,t=this.destination;return A===N.vibratoLfo&&t===G.pitch?I.vibLfoToPitch:A===N.modLfo&&t===G.pitch?I.modLfoToPitch:A===N.modLfo&&t===G.filterCutoff?I.modLfoToFilterFc:A===N.modLfo&&t===G.gain?I.modLfoToVolume:A===N.modEnv&&t===G.filterCutoff?I.modEnvToFilterFc:A===N.modEnv&&t===G.pitch?I.modEnvToPitch:void 0}toSFDestination(){let A=this.shortScale;switch(this.destination){default:case G.none:return;case G.pan:return I.pan;case G.gain:return{gen:I.initialAttenuation,newAmount:-A};case G.pitch:return I.fineTune;case G.keyNum:return I.overridingRootKey;case G.volEnvDelay:return I.delayVolEnv;case G.volEnvAttack:return I.attackVolEnv;case G.volEnvHold:return I.holdVolEnv;case G.volEnvDecay:return I.decayVolEnv;case G.volEnvSustain:return{gen:I.sustainVolEnv,newAmount:1e3-A};case G.volEnvRelease:return I.releaseVolEnv;case G.modEnvDelay:return I.delayModEnv;case G.modEnvAttack:return I.attackModEnv;case G.modEnvHold:return I.holdModEnv;case G.modEnvDecay:return I.decayModEnv;case G.modEnvSustain:return{gen:I.sustainModEnv,newAmount:1e3-A};case G.modEnvRelease:return I.releaseModEnv;case G.filterCutoff:return I.initialFilterFc;case G.filterQ:return I.initialFilterQ;case G.chorusSend:return I.chorusEffectsSend;case G.reverbSend:return I.reverbEffectsSend;case G.modLfoFreq:return I.freqModLFO;case G.modLfoDelay:return I.delayModLFO;case G.vibLfoFreq:return I.freqVibLFO;case G.vibLfoDelay:return I.delayVibLFO}}},Da=class Wn extends je{connectionBlocks=new Array;mode="dls2";get length(){return this.connectionBlocks.length}copyFrom(A){this.mode=A.mode,A.connectionBlocks.forEach(t=>{this.connectionBlocks.push(ct.copyFrom(t))})}fromSFZone(A){this.mode="dls2";let t=new Vt;t.copyFrom(A);for(let n of t.generators){let s;switch(n.generatorType){default:continue;case I.keyNumToVolEnvDecay:s=I.decayVolEnv;break;case I.keyNumToVolEnvHold:s=I.holdVolEnv;break;case I.keyNumToModEnvDecay:s=I.decayModEnv;break;case I.keyNumToModEnvHold:s=I.holdModEnv}let a=t.getGenerator(s,void 0),o=n.generatorValue*-128;if(a===void 0)continue;let i=60/128*o,r=a-i;t.setGenerator(n.generatorType,o,!1),t.setGenerator(s,r,!1)}for(let n of t.generators)ct.fromSFGenerator(n,this);for(let n of t.modulators)ct.fromSFModulator(n,this)}read(A){let t=fe(A,"lart"),n=fe(A,"lar2");if(t)for(this.mode="dls1";t.data.currentIndex<t.data.length;){let s=aA(t.data);Wn.verifyHeader(s,"art1","art2");let a=s.data,o=v(a,4);o!==8&&nA(`CbSize in articulation mismatch. Expected 8, got ${o}`);let i=v(a,4);for(let r=0;r<i;r++)this.connectionBlocks.push(ct.read(a))}else if(n)for(this.mode="dls2";n.data.currentIndex<n.data.length;){let s=aA(n.data);Wn.verifyHeader(s,"art2","art1");let a=s.data,o=v(a,4);o!==8&&nA(`CbSize in articulation mismatch. Expected 8, got ${o}`);let i=v(a,4);for(let r=0;r<i;r++)this.connectionBlocks.push(ct.read(a))}}write(){let A=new J(8);iA(A,8),iA(A,this.connectionBlocks.length);let t=this.connectionBlocks.map(s=>s.write()),n=bA(this.mode==="dls2"?"art2":"art1",[A,...t]);return IA(this.mode==="dls2"?"lar2":"lart",n,!1,!0)}toSFZone(A){let t=(n,s,a,o)=>{let i=n/-128;if(A.setGenerator(s,i),i<=120){let r=Math.round(.46875*n),g=this.connectionBlocks.find(E=>E.isStaticParameter&&E.destination===o);g&&A.setGenerator(a,r+g.shortScale)}};for(let n of this.connectionBlocks){let s=n.shortScale,a=n.source.source,o=n.control.source,i=n.destination;if(n.isStaticParameter){n.toSFGenerator(A);continue}if(o===N.none)if(a===N.keyNum){if(i===G.pitch){A.setGenerator(I.scaleTuning,s/128);continue}if(i===G.modEnvHold||i===G.modEnvDecay||i===G.volEnvHold||i==G.volEnvDecay)continue}else{let r=n.toCombinedSFDestination();if(r){A.setGenerator(r,s);continue}}n.toSFModulator(A)}this.mode==="dls1"&&A.addModulators(cA.copyFrom(Go),cA.copyFrom(Ro));for(let n of this.connectionBlocks){if(n.source.source!==N.keyNum)continue;let s=n.shortScale;switch(n.destination){default:continue;case G.volEnvHold:t(s,I.keyNumToVolEnvHold,I.holdVolEnv,G.volEnvHold);break;case G.volEnvDecay:t(s,I.keyNumToVolEnvDecay,I.decayVolEnv,G.volEnvDecay);break;case G.modEnvHold:t(s,I.keyNumToModEnvHold,I.holdModEnv,G.modEnvHold);break;case G.modEnvDecay:t(s,I.keyNumToModEnvDecay,I.decayModEnv,G.modEnvDecay);break}}}},wn=class Ut{channel=1;tableIndex;fusOptions=0;phaseGroup=0;constructor(A){this.tableIndex=A}static copyFrom(A){let t=new Ut(A.tableIndex);return t.channel=A.channel,t.phaseGroup=A.phaseGroup,t.fusOptions=A.fusOptions,t}static read(A){let t=v(A.data,2),n=v(A.data,2),s=v(A.data,4),a=v(A.data,4),o=new Ut(a);return o.channel=s,o.fusOptions=t,o.phaseGroup=n,o}static fromSFZone(A,t){let n=A.indexOf(t.sample);if(n<0)throw new Error(`Wave link error: Sample ${t.sample.name} does not exist in the sample list.`);let s=new Ut(n);switch(t.sample.sampleType){default:case wA.leftSample:case wA.monoSample:s.channel=1;break;case wA.rightSample:s.channel=2}return s}write(){let A=new J(12);return q(A,this.fusOptions),q(A,this.phaseGroup),iA(A,this.channel),iA(A,this.tableIndex),IA("wlnk",A)}},Tt=class Ve extends je{articulation=new Da;keyRange={min:0,max:127};velRange={min:0,max:127};keyGroup=0;fusOptions=0;usLayer=0;waveSample;waveLink;constructor(A,t){super(),this.waveSample=t,this.waveLink=A}static copyFrom(A){let t=new Ve(wn.copyFrom(A.waveLink),ze.copyFrom(A.waveSample));return t.keyGroup=A.keyGroup,t.keyRange={...A.keyRange},t.velRange={...A.velRange},t.usLayer=A.usLayer,t.fusOptions=A.fusOptions,t.articulation.copyFrom(A.articulation),t}static read(A,t){let n=this.verifyAndReadList(t,"rgn ","rgn2"),s=n.find(S=>S.header==="wsmp"),a=s?ze.read(s):void 0,o=n.find(S=>S.header==="wlnk");if(!o){nA("Invalid DLS region: missing 'wlnk' chunk! Discarding...");return}let i=wn.read(o),r=n.find(S=>S.header==="rgnh");if(!r){nA("Invalid DLS region: missing 'rgnh' chunk! Discarding...");return}let g=A[i.tableIndex];g||Ve.parsingError(`Invalid sample index: ${i.tableIndex}. Samples available: ${A.length}`),a??=g.waveSample;let E=new Ve(i,a),Q=v(r.data,2),l=v(r.data,2),C=v(r.data,2),d=v(r.data,2);return C===0&&d===0&&(d=127,C=0),E.keyRange.max=l,E.keyRange.min=Q,E.velRange.max=d,E.velRange.min=C,E.fusOptions=v(r.data,2),E.keyGroup=v(r.data,2),r.data.length-r.data.currentIndex>=2&&(E.usLayer=v(r.data,2)),E.articulation.read(n),E}static fromSFZone(A,t){let n=ze.fromSFZone(A),s=wn.fromSFZone(t,A),a=new Ve(s,n);return a.keyRange.min=Math.max(A.keyRange.min,0),a.keyRange.max=A.keyRange.max,a.velRange.min=Math.max(A.velRange.min,0),a.velRange.max=A.velRange.max,a.keyGroup=A.getGenerator(I.exclusiveClass,0),a.articulation.fromSFZone(A),a}write(){let A=[this.writeHeader(),this.waveSample.write(),this.waveLink.write(),this.articulation.write()];return bA("rgn2",A,!0)}toSFZone(A,t){let n=t[this.waveLink.tableIndex];n||Ve.parsingError(`Invalid sample index: ${this.waveLink.tableIndex}`);let s=A.createZone(n);return s.keyRange=this.keyRange,s.velRange=this.velRange,this.keyRange.max===127&&this.keyRange.min===0&&(s.keyRange.min=-1),this.velRange.max===127&&this.velRange.min===0&&(s.velRange.min=-1),this.keyGroup!==0&&s.setGenerator(I.exclusiveClass,this.keyGroup),this.waveSample.toSFZone(s,n),this.articulation.toSFZone(s),s.generators=s.generators.filter(a=>a.generatorValue!==U[a.generatorType].def),s}writeHeader(){let A=new J(12);return q(A,Math.max(this.keyRange.min,0)),q(A,this.keyRange.max),q(A,Math.max(this.velRange.min,0)),q(A,this.velRange.max),q(A,this.fusOptions),q(A,this.keyGroup),q(A,this.usLayer),IA("rgnh",A)}},Fn=class xt extends je{articulation=new Da;regions=new Array;name="Unnamed";bankLSB=0;bankMSB=0;isGMGSDrum=!1;program=0;static copyFrom(A){let t=new xt;return t.name=A.name,t.isGMGSDrum=A.isGMGSDrum,t.bankMSB=A.bankMSB,t.bankLSB=A.bankLSB,t.program=A.program,t.articulation.copyFrom(A.articulation),A.regions.forEach(n=>{t.regions.push(Tt.copyFrom(n))}),t}static read(A,t){let n=this.verifyAndReadList(t,"ins "),s=n.find(l=>l.header==="insh");if(!s)throw Z(),new Error("No instrument header!");let a="",o=fe(n,"INFO");if(o){let l=aA(o.data);for(;l.header!=="INAM";)l=aA(o.data);a=hA(l.data,l.data.length).trim()}a.length<1&&(a="Unnamed Instrument");let i=new xt;i.name=a;let r=v(s.data,4),g=v(s.data,4),E=v(s.data,4);i.program=E&127,i.bankMSB=g>>>8&127,i.bankLSB=g&127,i.isGMGSDrum=g>>>31>0,MA(`%cParsing %c"${a}"%c...`,c.info,c.recognized,c.info);let Q=fe(n,"lrgn");if(!Q)throw Z(),new Error("No region list!");i.articulation.read(n);for(let l=0;l<r;l++){let C=aA(Q.data);this.verifyHeader(C,"LIST");let d=hA(C.data,4);d!=="rgn "&&d!=="rgn2"&&(Z(),this.parsingError(`Invalid DLS region! Expected "rgn " or "rgn2" got "${d}"`));let S=Tt.read(A,C);S&&i.regions.push(S)}return Z(),i}static fromSFPreset(A,t){let n=new xt;return n.name=A.name,n.bankLSB=A.bankLSB,n.bankMSB=A.bankMSB,n.program=A.program,n.isGMGSDrum=A.isGMGSDrum,OA(`%cConverting %c${A.toString()}%c to DLS...`,c.info,c.value,c.info),A.toFlattenedInstrument().zones.forEach(a=>{n.regions.push(Tt.fromSFZone(a,t))}),Z(),n}write(){MA(`%cWriting %c${this.name}%c...`,c.info,c.recognized,c.info);let A=[this.writeHeader()],t=this.regions.map(s=>s.write());A.push(bA("lrgn",t,!0)),this.articulation.length>0&&A.push(this.articulation.write());let n=IA("INAM",ne(this.name,!0));return A.push(IA("INFO",n,!1,!0)),Z(),bA("ins ",A,!0)}toSFPreset(A){let t=new pe(A);t.name=this.name,t.bankMSB=this.bankMSB,t.bankLSB=this.bankLSB,t.isGMGSDrum=this.isGMGSDrum,t.program=this.program;let n=new dt;n.name=this.name,t.createZone(n),this.articulation.toSFZone(n.globalZone),this.regions.forEach(s=>s.toSFZone(n,A.samples)),n.globalize(),n.globalZone.modulators.find(s=>s.destination===I.reverbEffectsSend)===void 0&&n.globalZone.addModulators(cA.copyFrom(ya)),n.globalZone.modulators.find(s=>s.destination===I.chorusEffectsSend)===void 0&&n.globalZone.addModulators(cA.copyFrom(ka)),n.globalZone.generators=n.globalZone.generators.filter(s=>s.generatorValue!==U[s.generatorType].def),A.addPresets(t),A.addInstruments(n)}writeHeader(){let A=new J(12);iA(A,this.regions.length);let t=(this.bankMSB&127)<<8|this.bankLSB&127;return this.isGMGSDrum&&(t|=1<<31),iA(A,t),iA(A,this.program&127),IA("insh",A)}},wa={progressFunction:void 0},Fa=class _n extends je{samples=new Array;instruments=new Array;soundBankInfo={name:"Unnamed",creationDate:new Date,software:"SpessaSynth",soundEngine:"DLS Level 2.2",version:{major:2,minor:4}};static read(A){if(!A)throw new Error("No data provided!");let t=new J(A);OA("%cParsing DLS file...",c.info);let n=aA(t,!1);this.verifyHeader(n,"RIFF"),this.verifyText(hA(t,4).toLowerCase(),"dls ");let s=[];for(;t.currentIndex<t.length;)s.push(aA(t));let a=new _n;a.soundBankInfo.name="Unnamed DLS",a.soundBankInfo.product="SpessaSynth DLS",a.soundBankInfo.comment="(no description)";let o=fe(s,"INFO");if(o)for(;o.data.currentIndex<o.data.length;){let d=aA(o.data),S=d.header,m=hA(d.data,d.size);switch(S){case"INAM":a.soundBankInfo.name=m;break;case"ICRD":a.soundBankInfo.creationDate=as(m);break;case"ICMT":a.soundBankInfo.comment=m;break;case"ISBJ":a.soundBankInfo.subject=m;break;case"ICOP":a.soundBankInfo.copyright=m;break;case"IENG":a.soundBankInfo.engineer=m;break;case"IPRD":a.soundBankInfo.product=m;break;case"ISFT":a.soundBankInfo.software=m}}this.printInfo(a);let i=s.find(d=>d.header==="colh");if(!i)return this.parsingError("No colh chunk!"),5;let r=v(i.data,4);y(`%cInstruments amount: %c${r}`,c.info,c.recognized);let g=fe(s,"wvpl");if(!g)return this.parsingError("No wvpl chunk!"),5;this.verifyAndReadList(g,"wvpl").forEach(d=>{a.samples.push(Ts.read(d))});let Q=fe(s,"lins");if(!Q)return this.parsingError("No lins chunk!"),5;let l=this.verifyAndReadList(Q,"lins");MA("%cLoading instruments...",c.info),l.length!==r&&nA(`Colh reported invalid amount of instruments. Detected ${l.length}, expected ${r}`),l.forEach(d=>{a.instruments.push(Fn.read(a.samples,d))}),Z();let C=s.find(d=>d.header==="pgal");if(C){y("%cFound the instrument aliasing chunk!",c.recognized);let d=C.data;d[0]===2&&d[1]+d[2]+d[3]===0&&(d.currentIndex+=4);let S=a.instruments.find(D=>fA.isXGDrums(D.bankMSB)||D.isGMGSDrum);if(!S)return nA("MobileBAE aliasing chunk without a drum preset. Aborting!"),a;let m=d.slice(d.currentIndex,d.currentIndex+128);d.currentIndex+=128;for(let D=0;D<128;D++){let k=m[D];if(k===D)continue;let M=S.regions.find(x=>x.keyRange.max===k&&x.keyRange.min===k);if(!M){nA(`Invalid drum alias ${D} to ${k}: region does not exist.`);continue}let Y=Tt.copyFrom(M);Y.keyRange.max=D,Y.keyRange.min=D,S.regions.push(Y)}for(d.currentIndex+=4;d.currentIndex<d.length;){let D=v(d,2),k=D&127,M=D>>7&127,Y=d[d.currentIndex++],x=d[d.currentIndex++];x!==0&&nA(`Invalid alias byte. Expected 0, got ${x}`);let B=v(d,2),AA=B&127,eA=B>>7&127,j=d[d.currentIndex++];x=d[d.currentIndex++],x!==0&&nA(`Invalid alias header. Expected 0, got ${x}`);let P=a.instruments.find(H=>H.bankLSB===AA&&H.bankMSB===eA&&H.program===j&&!H.isGMGSDrum);if(!P){nA(`Invalid alias. Missing instrument: ${AA}:${eA}:${j}`);continue}let V=Fn.copyFrom(P);V.bankMSB=M,V.bankLSB=k,V.program=Y,a.instruments.push(V)}}return y(`%cParsing finished! %c"${a.soundBankInfo.name||"UNNAMED"}"%c has %c${a.instruments.length}%c instruments and %c${a.samples.length}%c samples.`,c.info,c.recognized,c.info,c.recognized,c.info,c.recognized,c.info),Z(),a}static fromSF(A){MA("%cSaving SF2 to DLS level 2...",c.info);let t=new _n;return t.soundBankInfo={...A.soundBankInfo},t.soundBankInfo.comment=(t.soundBankInfo.comment??"(No description)")+`
|
|
17
|
+
(${g})`,c.warn,c.value,c.unrecognized)},i=this.toCombinedSFDestination();if(i){n=i;let g=this.control.toSFSource();if(!g){o("Invalid control");return}s=g}else{let g=this.toSFDestination();if(!g){o("Invalid destination");return}typeof g=="object"?(t=g.newAmount,n=g.gen):n=g;let E=this.source.toSFSource();if(!E){o("Invalid source");return}s=E;let Q=this.control.toSFSource();if(!Q){o("Invalid control");return}a=Q}this.transform!==QA.linear&&s.curveType===QA.linear&&(s.curveType=this.transform),n===I.initialAttenuation&&((this.source.source===N.velocity||this.source.source===N.volume||this.source.source===N.expression)&&(s.isNegative=!0),t=Math.min(960,Math.max(0,t)));let r=new cA(s,a,n,t,0);A.addModulators(r)}toCombinedSFDestination(){let A=this.source.source,t=this.destination;return A===N.vibratoLfo&&t===G.pitch?I.vibLfoToPitch:A===N.modLfo&&t===G.pitch?I.modLfoToPitch:A===N.modLfo&&t===G.filterCutoff?I.modLfoToFilterFc:A===N.modLfo&&t===G.gain?I.modLfoToVolume:A===N.modEnv&&t===G.filterCutoff?I.modEnvToFilterFc:A===N.modEnv&&t===G.pitch?I.modEnvToPitch:void 0}toSFDestination(){let A=this.shortScale;switch(this.destination){default:case G.none:return;case G.pan:return I.pan;case G.gain:return{gen:I.initialAttenuation,newAmount:-A};case G.pitch:return I.fineTune;case G.keyNum:return I.overridingRootKey;case G.volEnvDelay:return I.delayVolEnv;case G.volEnvAttack:return I.attackVolEnv;case G.volEnvHold:return I.holdVolEnv;case G.volEnvDecay:return I.decayVolEnv;case G.volEnvSustain:return{gen:I.sustainVolEnv,newAmount:1e3-A};case G.volEnvRelease:return I.releaseVolEnv;case G.modEnvDelay:return I.delayModEnv;case G.modEnvAttack:return I.attackModEnv;case G.modEnvHold:return I.holdModEnv;case G.modEnvDecay:return I.decayModEnv;case G.modEnvSustain:return{gen:I.sustainModEnv,newAmount:1e3-A};case G.modEnvRelease:return I.releaseModEnv;case G.filterCutoff:return I.initialFilterFc;case G.filterQ:return I.initialFilterQ;case G.chorusSend:return I.chorusEffectsSend;case G.reverbSend:return I.reverbEffectsSend;case G.modLfoFreq:return I.freqModLFO;case G.modLfoDelay:return I.delayModLFO;case G.vibLfoFreq:return I.freqVibLFO;case G.vibLfoDelay:return I.delayVibLFO}}},Da=class Wn extends je{connectionBlocks=new Array;mode="dls2";get length(){return this.connectionBlocks.length}copyFrom(A){this.mode=A.mode,A.connectionBlocks.forEach(t=>{this.connectionBlocks.push(ct.copyFrom(t))})}fromSFZone(A){this.mode="dls2";let t=new Vt;t.copyFrom(A);for(let n of t.generators){let s;switch(n.generatorType){default:continue;case I.keyNumToVolEnvDecay:s=I.decayVolEnv;break;case I.keyNumToVolEnvHold:s=I.holdVolEnv;break;case I.keyNumToModEnvDecay:s=I.decayModEnv;break;case I.keyNumToModEnvHold:s=I.holdModEnv}let a=t.getGenerator(s,void 0),o=n.generatorValue*-128;if(a===void 0)continue;let i=60/128*o,r=a-i;t.setGenerator(n.generatorType,o,!1),t.setGenerator(s,r,!1)}for(let n of t.generators)ct.fromSFGenerator(n,this);for(let n of t.modulators)ct.fromSFModulator(n,this)}read(A){let t=fe(A,"lart"),n=fe(A,"lar2");if(t)for(this.mode="dls1";t.data.currentIndex<t.data.length;){let s=aA(t.data);Wn.verifyHeader(s,"art1","art2");let a=s.data,o=v(a,4);o!==8&&nA(`CbSize in articulation mismatch. Expected 8, got ${o}`);let i=v(a,4);for(let r=0;r<i;r++)this.connectionBlocks.push(ct.read(a))}else if(n)for(this.mode="dls2";n.data.currentIndex<n.data.length;){let s=aA(n.data);Wn.verifyHeader(s,"art2","art1");let a=s.data,o=v(a,4);o!==8&&nA(`CbSize in articulation mismatch. Expected 8, got ${o}`);let i=v(a,4);for(let r=0;r<i;r++)this.connectionBlocks.push(ct.read(a))}}write(){let A=new J(8);iA(A,8),iA(A,this.connectionBlocks.length);let t=this.connectionBlocks.map(s=>s.write()),n=bA(this.mode==="dls2"?"art2":"art1",[A,...t]);return IA(this.mode==="dls2"?"lar2":"lart",n,!1,!0)}toSFZone(A){let t=(n,s,a,o)=>{let i=n/-128;if(A.setGenerator(s,i),i<=120){let r=Math.round(.46875*n),g=this.connectionBlocks.find(E=>E.isStaticParameter&&E.destination===o);g&&A.setGenerator(a,r+g.shortScale)}};for(let n of this.connectionBlocks){let s=n.shortScale,a=n.source.source,o=n.control.source,i=n.destination;if(n.isStaticParameter){n.toSFGenerator(A);continue}if(o===N.none)if(a===N.keyNum){if(i===G.pitch){A.setGenerator(I.scaleTuning,s/128);continue}if(i===G.modEnvHold||i===G.modEnvDecay||i===G.volEnvHold||i==G.volEnvDecay)continue}else{let r=n.toCombinedSFDestination();if(r){A.setGenerator(r,s);continue}}n.toSFModulator(A)}this.mode==="dls1"&&A.addModulators(cA.copyFrom(Go),cA.copyFrom(Ro));for(let n of this.connectionBlocks){if(n.source.source!==N.keyNum)continue;let s=n.shortScale;switch(n.destination){default:continue;case G.volEnvHold:t(s,I.keyNumToVolEnvHold,I.holdVolEnv,G.volEnvHold);break;case G.volEnvDecay:t(s,I.keyNumToVolEnvDecay,I.decayVolEnv,G.volEnvDecay);break;case G.modEnvHold:t(s,I.keyNumToModEnvHold,I.holdModEnv,G.modEnvHold);break;case G.modEnvDecay:t(s,I.keyNumToModEnvDecay,I.decayModEnv,G.modEnvDecay);break}}}},wn=class Ut{channel=1;tableIndex;fusOptions=0;phaseGroup=0;constructor(A){this.tableIndex=A}static copyFrom(A){let t=new Ut(A.tableIndex);return t.channel=A.channel,t.phaseGroup=A.phaseGroup,t.fusOptions=A.fusOptions,t}static read(A){let t=v(A.data,2),n=v(A.data,2),s=v(A.data,4),a=v(A.data,4),o=new Ut(a);return o.channel=s,o.fusOptions=t,o.phaseGroup=n,o}static fromSFZone(A,t){let n=A.indexOf(t.sample);if(n<0)throw new Error(`Wave link error: Sample ${t.sample.name} does not exist in the sample list.`);let s=new Ut(n);switch(t.sample.sampleType){default:case wA.leftSample:case wA.monoSample:s.channel=1;break;case wA.rightSample:s.channel=2}return s}write(){let A=new J(12);return q(A,this.fusOptions),q(A,this.phaseGroup),iA(A,this.channel),iA(A,this.tableIndex),IA("wlnk",A)}},Tt=class Ve extends je{articulation=new Da;keyRange={min:0,max:127};velRange={min:0,max:127};keyGroup=0;fusOptions=0;usLayer=0;waveSample;waveLink;constructor(A,t){super(),this.waveSample=t,this.waveLink=A}static copyFrom(A){let t=new Ve(wn.copyFrom(A.waveLink),ze.copyFrom(A.waveSample));return t.keyGroup=A.keyGroup,t.keyRange={...A.keyRange},t.velRange={...A.velRange},t.usLayer=A.usLayer,t.fusOptions=A.fusOptions,t.articulation.copyFrom(A.articulation),t}static read(A,t){let n=this.verifyAndReadList(t,"rgn ","rgn2"),s=n.find(S=>S.header==="wsmp"),a=s?ze.read(s):void 0,o=n.find(S=>S.header==="wlnk");if(!o){nA("Invalid DLS region: missing 'wlnk' chunk! Discarding...");return}let i=wn.read(o),r=n.find(S=>S.header==="rgnh");if(!r){nA("Invalid DLS region: missing 'rgnh' chunk! Discarding...");return}let g=A[i.tableIndex];g||Ve.parsingError(`Invalid sample index: ${i.tableIndex}. Samples available: ${A.length}`),a??=g.waveSample;let E=new Ve(i,a),Q=v(r.data,2),l=v(r.data,2),C=v(r.data,2),d=v(r.data,2);return C===0&&d===0&&(d=127,C=0),E.keyRange.max=l,E.keyRange.min=Q,E.velRange.max=d,E.velRange.min=C,E.fusOptions=v(r.data,2),E.keyGroup=v(r.data,2),r.data.length-r.data.currentIndex>=2&&(E.usLayer=v(r.data,2)),E.articulation.read(n),E}static fromSFZone(A,t){let n=ze.fromSFZone(A),s=wn.fromSFZone(t,A),a=new Ve(s,n);return a.keyRange.min=Math.max(A.keyRange.min,0),a.keyRange.max=A.keyRange.max,a.velRange.min=Math.max(A.velRange.min,0),a.velRange.max=A.velRange.max,a.keyGroup=A.getGenerator(I.exclusiveClass,0),a.articulation.fromSFZone(A),a}write(){let A=[this.writeHeader(),this.waveSample.write(),this.waveLink.write(),this.articulation.write()];return bA("rgn2",A,!0)}toSFZone(A,t){let n=t[this.waveLink.tableIndex];n||Ve.parsingError(`Invalid sample index: ${this.waveLink.tableIndex}`);let s=A.createZone(n);return s.keyRange=this.keyRange,s.velRange=this.velRange,this.keyRange.max===127&&this.keyRange.min===0&&(s.keyRange.min=-1),this.velRange.max===127&&this.velRange.min===0&&(s.velRange.min=-1),this.keyGroup!==0&&s.setGenerator(I.exclusiveClass,this.keyGroup),this.waveSample.toSFZone(s,n),this.articulation.toSFZone(s),s.generators=s.generators.filter(a=>a.generatorValue!==U[a.generatorType].def),s}writeHeader(){let A=new J(12);return q(A,Math.max(this.keyRange.min,0)),q(A,this.keyRange.max),q(A,Math.max(this.velRange.min,0)),q(A,this.velRange.max),q(A,this.fusOptions),q(A,this.keyGroup),q(A,this.usLayer),IA("rgnh",A)}},Fn=class xt extends je{articulation=new Da;regions=new Array;name="Unnamed";bankLSB=0;bankMSB=0;isGMGSDrum=!1;program=0;static copyFrom(A){let t=new xt;return t.name=A.name,t.isGMGSDrum=A.isGMGSDrum,t.bankMSB=A.bankMSB,t.bankLSB=A.bankLSB,t.program=A.program,t.articulation.copyFrom(A.articulation),A.regions.forEach(n=>{t.regions.push(Tt.copyFrom(n))}),t}static read(A,t){let n=this.verifyAndReadList(t,"ins "),s=n.find(l=>l.header==="insh");if(!s)throw Z(),new Error("No instrument header!");let a="",o=fe(n,"INFO");if(o){let l=aA(o.data);for(;l.header!=="INAM";)l=aA(o.data);a=hA(l.data,l.data.length).trim()}a.length<1&&(a="Unnamed Instrument");let i=new xt;i.name=a;let r=v(s.data,4),g=v(s.data,4),E=v(s.data,4);i.program=E&127,i.bankMSB=g>>>8&127,i.bankLSB=g&127,i.isGMGSDrum=g>>>31>0,MA(`%cParsing %c"${a}"%c...`,c.info,c.recognized,c.info);let Q=fe(n,"lrgn");if(!Q)throw Z(),new Error("No region list!");i.articulation.read(n);for(let l=0;l<r;l++){let C=aA(Q.data);this.verifyHeader(C,"LIST");let d=hA(C.data,4);d!=="rgn "&&d!=="rgn2"&&(Z(),this.parsingError(`Invalid DLS region! Expected "rgn " or "rgn2" got "${d}"`));let S=Tt.read(A,C);S&&i.regions.push(S)}return Z(),i}static fromSFPreset(A,t){let n=new xt;return n.name=A.name,n.bankLSB=A.bankLSB,n.bankMSB=A.bankMSB,n.program=A.program,n.isGMGSDrum=A.isGMGSDrum,OA(`%cConverting %c${A.toString()}%c to DLS...`,c.info,c.value,c.info),A.toFlattenedInstrument().zones.forEach(a=>{n.regions.push(Tt.fromSFZone(a,t))}),Z(),n}write(){MA(`%cWriting %c${this.name}%c...`,c.info,c.recognized,c.info);let A=[this.writeHeader()],t=this.regions.map(s=>s.write());A.push(bA("lrgn",t,!0)),this.articulation.length>0&&A.push(this.articulation.write());let n=IA("INAM",ne(this.name,!0));return A.push(IA("INFO",n,!1,!0)),Z(),bA("ins ",A,!0)}toSFPreset(A){let t=new pe(A);t.name=this.name,t.bankMSB=this.bankMSB,t.bankLSB=this.bankLSB,t.isGMGSDrum=this.isGMGSDrum,t.program=this.program;let n=new dt;n.name=this.name,t.createZone(n),this.articulation.toSFZone(n.globalZone),this.regions.forEach(s=>s.toSFZone(n,A.samples)),n.globalize(),n.globalZone.modulators.find(s=>s.destination===I.reverbEffectsSend)===void 0&&n.globalZone.addModulators(cA.copyFrom(ya)),n.globalZone.modulators.find(s=>s.destination===I.chorusEffectsSend)===void 0&&n.globalZone.addModulators(cA.copyFrom(ka)),n.globalZone.generators=n.globalZone.generators.filter(s=>s.generatorValue!==U[s.generatorType].def),A.addPresets(t),A.addInstruments(n)}writeHeader(){let A=new J(12);iA(A,this.regions.length);let t=(this.bankMSB&127)<<8|this.bankLSB&127;return this.isGMGSDrum&&(t|=1<<31),iA(A,t),iA(A,this.program&127),IA("insh",A)}},wa={progressFunction:void 0},Fa=class _n extends je{samples=new Array;instruments=new Array;soundBankInfo={name:"Unnamed",creationDate:new Date,software:"SpessaSynth",soundEngine:"DLS Level 2.2",version:{major:2,minor:4}};static read(A){if(!A)throw new Error("No data provided!");let t=new J(A);OA("%cParsing DLS file...",c.info);let n=aA(t,!1);this.verifyHeader(n,"RIFF"),this.verifyText(hA(t,4).toLowerCase(),"dls ");let s=[];for(;t.currentIndex<t.length;)s.push(aA(t));let a=new _n;a.soundBankInfo.name="Unnamed DLS",a.soundBankInfo.product="SpessaSynth DLS",a.soundBankInfo.comment="(no description)";let o=fe(s,"INFO");if(o)for(;o.data.currentIndex<o.data.length;){let d=aA(o.data),S=d.header,m=hA(d.data,d.size);switch(S){case"INAM":a.soundBankInfo.name=m;break;case"ICRD":a.soundBankInfo.creationDate=as(m);break;case"ICMT":a.soundBankInfo.comment=m;break;case"ISBJ":a.soundBankInfo.subject=m;break;case"ICOP":a.soundBankInfo.copyright=m;break;case"IENG":a.soundBankInfo.engineer=m;break;case"IPRD":a.soundBankInfo.product=m;break;case"ISFT":a.soundBankInfo.software=m}}this.printInfo(a);let i=s.find(d=>d.header==="colh");if(!i)return this.parsingError("No colh chunk!"),5;let r=v(i.data,4);y(`%cInstruments amount: %c${r}`,c.info,c.recognized);let g=fe(s,"wvpl");if(!g)return this.parsingError("No wvpl chunk!"),5;this.verifyAndReadList(g,"wvpl").forEach(d=>{a.samples.push(Ts.read(d))});let Q=fe(s,"lins");if(!Q)return this.parsingError("No lins chunk!"),5;let l=this.verifyAndReadList(Q,"lins");MA("%cLoading instruments...",c.info),l.length!==r&&nA(`Colh reported invalid amount of instruments. Detected ${l.length}, expected ${r}`),l.forEach(d=>{a.instruments.push(Fn.read(a.samples,d))}),Z();let C=s.find(d=>d.header==="pgal");if(C){y("%cFound the instrument aliasing chunk!",c.recognized);let d=C.data;(d[0]!==0||d[1]!==1||d[2]!==2||d[3]!==3)&&(d.currentIndex+=4);let S=a.instruments.find(D=>fA.isXGDrums(D.bankMSB)||D.isGMGSDrum);if(!S)return nA("MobileBAE aliasing chunk without a drum preset. Aborting!"),a;let m=d.slice(d.currentIndex,d.currentIndex+128);d.currentIndex+=128;for(let D=0;D<128;D++){let k=m[D];if(k===D)continue;let M=S.regions.find(x=>x.keyRange.max===k&&x.keyRange.min===k);if(!M){nA(`Invalid drum alias ${D} to ${k}: region does not exist.`);continue}let Y=Tt.copyFrom(M);Y.keyRange.max=D,Y.keyRange.min=D,S.regions.push(Y)}for(d.currentIndex+=4;d.currentIndex<d.length;){let D=v(d,2),k=D&127,M=D>>7&127,Y=d[d.currentIndex++],x=d[d.currentIndex++];x!==0&&nA(`Invalid alias byte. Expected 0, got ${x}`);let B=v(d,2),AA=B&127,eA=B>>7&127,j=d[d.currentIndex++];x=d[d.currentIndex++],x!==0&&nA(`Invalid alias header. Expected 0, got ${x}`);let P=a.instruments.find(H=>H.bankLSB===AA&&H.bankMSB===eA&&H.program===j&&!H.isGMGSDrum);if(!P){nA(`Invalid alias. Missing instrument: ${AA}:${eA}:${j}`);continue}let V=Fn.copyFrom(P);V.bankMSB=M,V.bankLSB=k,V.program=Y,a.instruments.push(V)}}return y(`%cParsing finished! %c"${a.soundBankInfo.name||"UNNAMED"}"%c has %c${a.instruments.length}%c instruments and %c${a.samples.length}%c samples.`,c.info,c.recognized,c.info,c.recognized,c.info,c.recognized,c.info),Z(),a}static fromSF(A){MA("%cSaving SF2 to DLS level 2...",c.info);let t=new _n;return t.soundBankInfo={...A.soundBankInfo},t.soundBankInfo.comment=(t.soundBankInfo.comment??"(No description)")+`
|
|
18
18
|
Converted from SF2 to DLS with SpessaSynth`,A.samples.forEach(n=>{t.samples.push(Ts.fromSFSample(n))}),A.presets.forEach(n=>{t.instruments.push(Fn.fromSFPreset(n,A.samples))}),y("%cConversion complete!",c.recognized),Z(),t}static printInfo(A){for(let[t,n]of Object.entries(A.soundBankInfo)){if(typeof n=="object"&&"major"in n){let s=n;y(`%c${t}: %c"${s.major}.${s.minor}"`,c.info,c.recognized)}y(`%c${t}: %c${n.toLocaleString()}`,c.info,c.recognized)}}async write(A=wa){MA("%cSaving DLS...",c.info);let t=new J(4);iA(t,this.instruments.length);let n=IA("colh",t);MA("%cWriting instruments...",c.info);let s=bA("lins",this.instruments.map(m=>m.write()),!0);y("%cSuccess!",c.recognized),Z(),MA("%cWriting WAVE samples...",c.info);let a=0,o=[],i=[],r=0;for(let m of this.samples){let D=m.write();await A?.progressFunction?.(m.name,r,this.samples.length),o.push(a),a+=D.length,i.push(D),r++}let g=bA("wvpl",i,!0);y("%cSucceeded!",c.recognized);let E=new J(8+4*o.length);iA(E,8),iA(E,o.length);for(let m of o)iA(E,m);let Q=IA("ptbl",E);this.soundBankInfo.software="SpessaSynth";let l=[],C=(m,D)=>{l.push(IA(m,ne(D,!0)))};for(let[m,D]of Object.entries(this.soundBankInfo)){let k=m,M=D;if(M)switch(k){case"name":C("INAM",M);break;case"comment":C("ICMT",M);break;case"copyright":C("ICOP",M);break;case"creationDate":C("ICRD",M.toISOString());break;case"engineer":C("IENG",M);break;case"product":C("IPRD",M);break;case"romVersion":case"version":case"soundEngine":case"romInfo":break;case"software":C("ISFT",M);break;case"subject":C("ISBJ",M)}}let d=bA("INFO",l,!0);y("%cCombining everything...");let S=bA("RIFF",[ne("DLS "),n,s,Q,g,d]);return y("%cSaved successfully!",c.recognized),Z(),S.buffer}toSF(){OA("%cConverting DLS to SF2...",c.info);let A=new Ga;return A.soundBankInfo.version.minor=4,A.soundBankInfo.version.major=2,A.soundBankInfo={...this.soundBankInfo},A.soundBankInfo.comment=(A.soundBankInfo.comment??"(No description)")+`
|
|
19
19
|
Converted from DLS to SF2 with SpessaSynth`,this.samples.forEach(t=>{t.toSFSample(A)}),this.instruments.forEach(t=>{t.toSFPreset(A)}),A.flush(),y("%cConversion complete!",c.recognized),Z(),A}},Ga=class Ht{static isSF3DecoderReady=Ot.isInitialized;soundBankInfo={name:"Unnamed",creationDate:new Date,software:"SpessaSynth",soundEngine:"E-mu 10K2",version:{major:2,minor:4}};presets=[];samples=[];instruments=[];defaultModulators=Ea.map(cA.copyFrom.bind(cA));customDefaultModulators=!1;_isXGBank=!1;get isXGBank(){return this._isXGBank}static mergeSoundBanks(...A){let t=A.shift();if(!t)throw new Error("No sound banks provided!");let n=t.presets;for(;A.length;){let a=A?.shift()?.presets;a&&a.forEach(o=>{n.find(i=>o.matches(i))===void 0&&n.push(o)})}let s=new Ht;return s.addCompletePresets(n),s.soundBankInfo={...t.soundBankInfo},s}static async getSampleSoundBankFile(){let A=new Ht,t=new Float32Array(128);for(let i=0;i<128;i++)t[i]=i/128*2-1;let n=new mo;n.name="Saw",n.originalKey=65,n.pitchCorrection=20,n.loopEnd=127,n.setAudioData(t,44100),A.addSamples(n);let s=new dt;s.name="Saw Wave",s.globalZone.addGenerators(new FA(I.initialAttenuation,375),new FA(I.releaseVolEnv,-1e3),new FA(I.sampleModes,1)),s.createZone(n),s.createZone(n).addGenerators(new FA(I.fineTune,-9)),A.addInstruments(s);let o=new pe(A);return o.name="Saw Wave",o.createZone(s),A.addPresets(o),A.soundBankInfo.name="Dummy",A.flush(),await A.writeSF2()}static copyFrom(A){let t=new Ht;return A.presets.forEach(n=>t.clonePreset(n)),t.soundBankInfo={...A.soundBankInfo},t}addCompletePresets(A){this.addPresets(...A);let t=[];for(let s of A)for(let a of s.zones)a.instrument&&!t.includes(a.instrument)&&t.push(a.instrument);this.addInstruments(...t);let n=[];for(let s of t)for(let a of s.zones)a.sample&&!n.includes(a.sample)&&n.push(a.sample);this.addSamples(...n)}async writeDLS(A=wa){return Fa.fromSF(this).write(A)}async writeSF2(A=Xn){return ko(this,A)}addPresets(...A){this.presets.push(...A)}addInstruments(...A){this.instruments.push(...A)}addSamples(...A){this.samples.push(...A)}cloneSample(A){let t=this.samples.find(s=>s.name===A.name);if(t)return t;let n=new Zt(A.name,A.sampleRate,A.originalKey,A.pitchCorrection,A.sampleType,A.loopStart,A.loopEnd);if(A.isCompressed?n.setCompressedData(A.getRawData(!0)):n.setAudioData(A.getAudioData(),A.sampleRate),this.addSamples(n),A.linkedSample){let s=this.cloneSample(A.linkedSample);s.linkedSample||n.setLinkedSample(s,n.sampleType)}return n}cloneInstrument(A){let t=this.instruments.find(s=>s.name===A.name);if(t)return t;let n=new dt;n.name=A.name,n.globalZone.copyFrom(A.globalZone);for(let s of A.zones)n.createZone(this.cloneSample(s.sample)).copyFrom(s);return this.addInstruments(n),n}clonePreset(A){let t=this.presets.find(s=>s.name===A.name);if(t)return t;let n=new pe(this);n.name=A.name,n.bankMSB=A.bankMSB,n.bankLSB=A.bankLSB,n.isGMGSDrum=A.isGMGSDrum,n.program=A.program,n.library=A.library,n.genre=A.genre,n.morphology=A.morphology,n.globalZone.copyFrom(A.globalZone);for(let s of A.zones)n.createZone(this.cloneInstrument(s.instrument)).copyFrom(s);return this.addPresets(n),n}flush(){this.presets.sort(te.sorter.bind(te)),this.parseInternal()}trimSoundBank(A){let t=(s,a)=>{let o=0;for(let i=0;i<s.zones.length;i++){let r=s.zones[i],g=r.keyRange,E=r.velRange,Q=!1;for(let l of a)if(l.key>=g.min&&l.key<=g.max&&l.velocity>=E.min&&l.velocity<=E.max){Q=!0;break}!Q&&r.sample&&(y(`%c${r.sample.name}%c removed from %c${s.name}%c.`,c.recognized,c.info,c.recognized,c.info),s.deleteZone(i)&&(o++,i--,y(`%c${r.sample.name}%c deleted`,c.recognized,c.info)),r.sample.useCount<1&&this.deleteSample(r.sample))}return o};OA("%cTrimming sound bank...",c.info);let n=A.getUsedProgramsAndKeys(this);MA("%cModifying sound bank...",c.info),y("Detected keys for midi:",n);for(let s=0;s<this.presets.length;s++){let a=this.presets[s],o=n.get(a);if(o===void 0)y(`%cDeleting preset %c${a.name}%c and its zones`,c.info,c.recognized,c.info),this.deletePreset(a),s--;else{let i=[...o].map(g=>{let E=g.split("-");return{key:parseInt(E[0]),velocity:parseInt(E[1])}});MA(`%cTrimming %c${a.name}`,c.info,c.recognized),y(`Keys for ${a.name}:`,i);let r=0;for(let g=0;g<a.zones.length;g++){let E=a.zones[g],Q=E.keyRange,l=E.velRange,C=!1;for(let d of i)if(d.key>=Q.min&&d.key<=Q.max&&d.velocity>=l.min&&d.velocity<=l.max&&E.instrument){C=!0;let S=t(E.instrument,i);y(`%cTrimmed off %c${S}%c zones from %c${E.instrument.name}`,c.info,c.recognized,c.info,c.recognized);break}!C&&E.instrument&&(r++,a.deleteZone(g),E.instrument.useCount<1&&this.deleteInstrument(E.instrument),g--)}y(`%cTrimmed off %c${r}%c zones from %c${a.name}`,c.info,c.recognized,c.info,c.recognized),Z()}}this.removeUnusedElements(),y("%cSound bank modified!",c.recognized),Z(),Z()}removeUnusedElements(){this.instruments=this.instruments.filter(A=>{A.deleteUnusedZones();let t=A.useCount<1;return t&&A.delete(),!t}),this.samples=this.samples.filter(A=>{let t=A.useCount<1;return t&&A.unlinkSample(),!t})}deleteInstrument(A){A.delete(),this.instruments.splice(this.instruments.indexOf(A),1)}deletePreset(A){A.delete(),this.presets.splice(this.presets.indexOf(A),1)}deleteSample(A){A.unlinkSample(),this.samples.splice(this.samples.indexOf(A),1)}getPreset(A,t){return Qa(this.presets,A,t)}destroySoundBank(){this.presets.length=0,this.instruments.length=0,this.samples.length=0}parsingError(A){throw new Error(`SF parsing error: ${A} The file may be corrupted.`)}parseInternal(){this._isXGBank=!1;let A=new Set([0,1,2,3,4,5,6,7,8,9,16,17,24,25,26,27,28,29,30,31,32,33,40,41,48,56,57,58,64,65,66,126,127]);for(let t of this.presets)if(fA.isXGDrums(t.bankMSB)&&(this._isXGBank=!0,!A.has(t.program))){this._isXGBank=!1,y(`%cThis bank is not valid XG. Preset %c${t.toString()}%c is not a valid XG drum. XG mode will use presets on bank 128.`,c.info,c.value,c.info);break}}printInfo(){for(let[A,t]of Object.entries(this.soundBankInfo)){if(typeof t=="object"&&"major"in t){let n=t;y(`%c${A}: %c"${n.major}.${n.minor}"`,c.info,c.recognized)}y(`%c${A}: %c${t.toLocaleString()}`,c.info,c.recognized)}}},bo=class extends FA{constructor(e){let A=e.currentIndex,t=e[A+1]<<8|e[A],n=jn(e[A+2],e[A+3]);e.currentIndex+=4,super(t,n,!1)}};function xs(e){let A=[];for(;e.data.length>e.data.currentIndex;)A.push(new bo(e.data));return A.pop(),A}var vo=class extends Ca{constructor(e,A,t,n){let s=t.find(o=>o.generatorType===I.instrument),a;if(s)a=n[s.generatorValue];else throw new Error("No instrument ID found in preset zone.");if(!a)throw new Error(`Invalid instrument ID: ${s.generatorValue}, available instruments: ${n.length}`);super(e,a),this.addGenerators(...t),this.addModulators(...A)}};function Lo(e,A,t,n,s){let a=e.gen,o=e.mod,i=0,r=0;for(let g of s)for(let E=0;E<g.zonesCount;E++){let Q=a[r++],l=a[r],C=A.slice(Q,l),d=o[i++],S=o[i],m=t.slice(d,S);C.find(D=>D.generatorType===I.instrument)!==void 0?g.createSoundFontZone(m,C,n):(g.globalZone.addGenerators(...C),g.globalZone.addModulators(...m))}}var No=class extends pe{zoneStartIndex;zonesCount=0;constructor(e,A){super(A),this.name=hA(e.data,20).replace(/\d{3}:\d{3}/,""),this.program=v(e.data,2);let t=v(e.data,2);this.bankMSB=t&127,this.isGMGSDrum=(t&128)>0,this.bankLSB=t>>8,this.zoneStartIndex=v(e.data,2),this.library=v(e.data,4),this.genre=v(e.data,4),this.morphology=v(e.data,4)}createSoundFontZone(e,A,t){let n=new vo(this,e,A,t);return this.zones.push(n),n}};function Hs(e,A){let t=[];for(;e.data.length>e.data.currentIndex;){let n=new No(e,A);if(t.length>0){let s=t[t.length-1];s.zonesCount=n.zoneStartIndex-s.zoneStartIndex}t.push(n)}return t.pop(),t}var Uo=class extends ha{constructor(e,A,t,n){let s=t.find(o=>o.generatorType===I.sampleID),a;if(s)a=n[s.generatorValue];else throw new Error("No sample ID found in instrument zone.");if(!a)throw new Error(`Invalid sample ID: ${s.generatorValue}, available samples: ${n.length}`);super(e,a),this.addGenerators(...t),this.addModulators(...A)}};function To(e,A,t,n,s){let a=e.gen,o=e.mod,i=0,r=0;for(let g of s)for(let E=0;E<g.zonesCount;E++){let Q=a[r++],l=a[r],C=A.slice(Q,l),d=o[i++],S=o[i],m=t.slice(d,S);C.find(D=>D.generatorType===I.sampleID)?g.createSoundFontZone(m,C,n):(g.globalZone.addGenerators(...C),g.globalZone.addModulators(...m))}}var xo=class extends dt{zoneStartIndex;zonesCount=0;constructor(e){super(),this.name=hA(e.data,20),this.zoneStartIndex=v(e.data,2)}createSoundFontZone(e,A,t){let n=new Uo(this,e,A,t);return this.zones.push(n),n}};function Ys(e){let A=[];for(;e.data.length>e.data.currentIndex;){let t=new xo(e);if(A.length>0){let n=A[A.length-1];n.zonesCount=t.zoneStartIndex-n.zoneStartIndex}A.push(t)}return A.pop(),A}function Gn(e){let A=[];for(;e.data.length>e.data.currentIndex;){let t=e.data,n=v(t,2),s=v(t,2),a=jn(t[t.currentIndex++],t[t.currentIndex++]),o=v(t,2),i=v(t,2);A.push(new yA(n,o,s,a,i))}return A.pop(),A}function bt(e){let A=[],t=[];for(;e.data.length>e.data.currentIndex;)t.push(v(e.data,2)),A.push(v(e.data,2));return{mod:A,gen:t}}var Ho=class extends Ga{sampleDataStartIndex=0;constructor(e,A=!0){if(super(),A)throw new Error("Using the constructor directly is deprecated. Use SoundBankLoader.fromArrayBuffer() instead.");let t=new J(e);OA("%cParsing a SoundFont2 file...",c.info),t||(Z(),this.parsingError("No data provided!"));let n=aA(t,!1);this.verifyHeader(n,"riff");let s=hA(t,4).toLowerCase();if(s!=="sfbk"&&s!=="sfpk")throw Z(),new SyntaxError(`Invalid soundFont! Expected "sfbk" or "sfpk" got "${s}"`);let a=s==="sfpk",o=aA(t);this.verifyHeader(o,"list");let i=hA(o.data,4);if(i!=="INFO")throw Z(),new SyntaxError(`Invalid soundFont! Expected "INFO" or "${i}"`);let r;for(;o.data.length>o.data.currentIndex;){let K=aA(o.data),F=ee(K.data,K.data.length),b=K.header;switch(b){case"ifil":case"iver":let O=v(K.data,2),tA=v(K.data,2);b==="ifil"?this.soundBankInfo.version={major:O,minor:tA}:this.soundBankInfo.romVersion={major:O,minor:tA};break;case"DMOD":{this.defaultModulators=Gn(K),this.customDefaultModulators=!0;break}case"LIST":{hA(K.data,4)==="xdta"&&(y("%cExtended SF2 found!",c.recognized),r=K);break}case"ICRD":this.soundBankInfo.creationDate=as(hA(K.data,K.data.length));break;case"ISFT":this.soundBankInfo.software=F;break;case"IPRD":this.soundBankInfo.product=F;break;case"IENG":this.soundBankInfo.engineer=F;break;case"ICOP":this.soundBankInfo.copyright=F;break;case"INAM":this.soundBankInfo.name=F;break;case"ICMT":this.soundBankInfo.comment=F;break;case"irom":this.soundBankInfo.romInfo=F;break;case"isng":this.soundBankInfo.soundEngine=F}}this.printInfo();let g={};r!==void 0&&(g.phdr=aA(r.data),g.pbag=aA(r.data),g.pmod=aA(r.data),g.pgen=aA(r.data),g.inst=aA(r.data),g.ibag=aA(r.data),g.imod=aA(r.data),g.igen=aA(r.data),g.shdr=aA(r.data));let E=aA(t,!1);this.verifyHeader(E,"list"),this.verifyText(hA(t,4),"sdta"),y("%cVerifying smpl chunk...",c.warn);let Q=aA(t,!1);this.verifyHeader(Q,"smpl");let l;if(a){y("%cSF2Pack detected, attempting to decode the smpl chunk...",c.info);try{l=Ot.decode(t.buffer.slice(t.currentIndex,t.currentIndex+E.size-12)).data[0]}catch(K){throw Z(),new Error(`SF2Pack Ogg Vorbis decode error: ${K}`)}y(`%cDecoded the smpl chunk! Length: %c${l.length}`,c.info,c.value)}else l=t,this.sampleDataStartIndex=t.currentIndex;y(`%cSkipping sample chunk, length: %c${E.size-12}`,c.info,c.value),t.currentIndex+=E.size-12,y("%cLoading preset data chunk...",c.warn);let C=aA(t);this.verifyHeader(C,"list"),hA(C.data,4);let d=aA(C.data);this.verifyHeader(d,"phdr");let S=aA(C.data);this.verifyHeader(S,"pbag");let m=aA(C.data);this.verifyHeader(m,"pmod");let D=aA(C.data);this.verifyHeader(D,"pgen");let k=aA(C.data);this.verifyHeader(k,"inst");let M=aA(C.data);this.verifyHeader(M,"ibag");let Y=aA(C.data);this.verifyHeader(Y,"imod");let x=aA(C.data);this.verifyHeader(x,"igen");let B=aA(C.data);this.verifyHeader(B,"shdr"),y("%cParsing samples...",c.info),t.currentIndex=this.sampleDataStartIndex;let AA=Ns(B,l,r===void 0);if(r&&g.shdr){let K=Ns(g.shdr,new Float32Array(1),!1);K.length===AA.length&&AA.forEach((F,b)=>{F.name+=K[b].name,F.linkedSampleIndex|=K[b].linkedSampleIndex<<16})}AA.forEach(K=>K.name=K.name.trim()),this.samples.push(...AA);let eA=xs(x),j=Gn(Y),P=Ys(k);if(r&&g.inst){let K=Ys(g.inst);K.length===P.length&&(P.forEach((F,b)=>{F.name+=K[b].name,F.zoneStartIndex|=K[b].zoneStartIndex}),P.forEach((F,b)=>{b<P.length-1&&(F.zonesCount=P[b+1].zoneStartIndex-F.zoneStartIndex)}))}P.forEach(K=>K.name=K.name.trim()),this.instruments.push(...P);let V=bt(M);if(r&&g.ibag){let K=bt(g.ibag);for(let F=0;F<V.mod.length;F++)V.mod[F]|=K.mod[F]<<16;for(let F=0;F<V.gen.length;F++)V.gen[F]|=K.gen[F]<<16}To(V,eA,j,this.samples,P);let H=xs(D),X=Gn(m),CA=Hs(d,this);if(r&&g.phdr){let K=Hs(g.phdr,this);K.length===CA.length&&(CA.forEach((F,b)=>{F.name+=K[b].name,F.zoneStartIndex|=K[b].zoneStartIndex}),CA.forEach((F,b)=>{b<CA.length-1&&(F.zonesCount=CA[b+1].zoneStartIndex-F.zoneStartIndex)}))}CA.forEach(K=>K.name===K.name.trim()),this.addPresets(...CA);let gA=bt(S);if(r&&g.pbag){let K=bt(g.pbag);for(let F=0;F<gA.mod.length;F++)gA.mod[F]|=K.mod[F]<<16;for(let F=0;F<gA.gen.length;F++)gA.gen[F]|=K.gen[F]<<16}Lo(gA,H,X,this.instruments,CA),this.flush(),y(`%cParsing finished! %c"${this.soundBankInfo.name}"%c has %c${this.presets.length}%c presets,
|
|
20
20
|
%c${this.instruments.length}%c instruments and %c${this.samples.length}%c samples.`,c.info,c.recognized,c.info,c.recognized,c.info,c.recognized,c.info,c.recognized,c.info),Z()}verifyHeader(e,A){e.header.toLowerCase()!==A.toLowerCase()&&(Z(),this.parsingError(`Invalid chunk header! Expected "${A.toLowerCase()}" got "${e.header.toLowerCase()}"`))}verifyText(e,A){e.toLowerCase()!==A.toLowerCase()&&(Z(),this.parsingError(`Invalid FourCC: Expected "${A.toLowerCase()}" got "${e.toLowerCase()}"\``))}},ut=class{static fromArrayBuffer(e){let A=e.slice(8,12),t=new J(A);return hA(t,4).toLowerCase()==="dls "?this.loadDLS(e):new Ho(e,!1)}static loadDLS(e){return Fa.read(e).toSF()}},Ra=class{soundBankManager=new Yr(this.updatePresetList.bind(this));midiChannels=[];keyModifierManager=new $r;totalVoicesAmount=0;processorInitialized=Ot.isInitialized;currentSynthTime=0;sampleRate;enableEffects=!0;enableEventSystem;onEventCall;systemExclusive=jr.bind(this);resetAllControllers=mr.bind(this);setMasterParameter=br.bind(this);getMasterParameter=vr.bind(this);getAllMasterParameters=Lr.bind(this);getVoicesForPreset=Wr.bind(this);killVoices=Xr.bind(this);getVoices=_r.bind(this);privateProps;savedSnapshot;eventQueue=[];sampleTime;constructor(e,A=Ms){let t=$n(A,Ms);if(this.enableEffects=t.enableEffects,this.enableEventSystem=t.enableEventSystem,this.currentSynthTime=t.initialTime,this.sampleRate=e,this.sampleTime=1/e,isNaN(t.initialTime)||isNaN(e))throw new Error("Initial time or sample rate is NaN!");this.privateProps=new eo(this.callEvent.bind(this),this.getVoices.bind(this),this.killVoices.bind(this),Rr*(44100/e),Pr*(44100/e),Or*(44100/e));for(let n=0;n<Rn;n++)this.createMIDIChannelInternal(!1);this.processorInitialized.then(()=>{y("%cSpessaSynth is ready!",c.recognized)})}applySynthesizerSnapshot(e){this.savedSnapshot=e,e.apply(this),y("%cFinished applying snapshot!",c.info),this.resetAllControllers()}getSnapshot(){return gs.create(this)}setEmbeddedSoundBank(e,A){let t=ut.fromArrayBuffer(e);this.soundBankManager.addSoundBank(t,Rt,A);let n=this.soundBankManager.priorityOrder;n.pop(),n.unshift(Rt),this.soundBankManager.priorityOrder=n,this.savedSnapshot!==void 0&&this.applySynthesizerSnapshot(this.savedSnapshot),y(`%cEmbedded sound bank set at offset %c${A}`,c.recognized,c.value)}clearEmbeddedBank(){this.soundBankManager.soundBankList.some(e=>e.id===Rt)&&this.soundBankManager.deleteSoundBank(Rt)}createMIDIChannel(){this.createMIDIChannelInternal(!0)}stopAllChannels(e=!1){y("%cStop all received!",c.info);for(let A of this.midiChannels)A.stopAllNotes(e)}renderAudio(e,A,t,n=0,s=0){this.renderAudioSplit(A,t,Array(16).fill(e),n,s)}renderAudioSplit(e,A,t,n=0,s=0){let a=this.currentSynthTime;for(;this.eventQueue[0]?.time<=a;)this.eventQueue.shift()?.callback();let o=e[0],i=e[1],r=A[0],g=A[1];n=Math.max(n,0);let E=s||t[0][0].length-n;this.totalVoicesAmount=0,this.midiChannels.forEach((Q,l)=>{if(Q.voices.length<1||Q.isMuted)return;let C=Q.voices.length,d=l%16;Q.renderAudio(t[d][0],t[d][1],o,i,r,g,n,E),this.totalVoicesAmount+=Q.voices.length,Q.voices.length!==C&&Q.sendChannelProperty()}),this.currentSynthTime+=E*this.sampleTime}destroySynthProcessor(){this.midiChannels.forEach(e=>{e.voices.length=0,e.sustainedVoices.length=0,e.lockedControllers=[],e.preset=void 0}),this.clearCache(),this.midiChannels.length=0,this.soundBankManager.destroy()}controllerChange(e,A,t){this.midiChannels[e].controllerChange(A,t)}noteOn(e,A,t){this.midiChannels[e].noteOn(A,t)}noteOff(e,A){this.midiChannels[e].noteOff(A)}polyPressure(e,A,t){this.midiChannels[e].polyPressure(A,t)}channelPressure(e,A){this.midiChannels[e].channelPressure(A)}pitchWheel(e,A){this.midiChannels[e].pitchWheel(A)}programChange(e,A){this.midiChannels[e].programChange(A)}processMessage(e,A=0,t=!1,n=Za){let s=()=>{let o=As(e[0]),i=o.channel+A;switch(o.status){case R.noteOn:{let r=e[2];r>0?this.noteOn(i,e[1],r):this.noteOff(i,e[1]);break}case R.noteOff:t?this.midiChannels[i].killNote(e[1]):this.noteOff(i,e[1]);break;case R.pitchWheel:this.pitchWheel(i,e[2]<<7|e[1]);break;case R.controllerChange:this.controllerChange(i,e[1],e[2]);break;case R.programChange:this.programChange(i,e[1]);break;case R.polyPressure:this.polyPressure(i,e[0],e[1]);break;case R.channelPressure:this.channelPressure(i,e[1]);break;case R.systemExclusive:this.systemExclusive(new J(e.slice(1)),A);break;case R.reset:this.stopAllChannels(!0),this.resetAllControllers();break;default:break}},a=n.time;a>this.currentSynthTime?(this.eventQueue.push({callback:s.bind(this),time:a}),this.eventQueue.sort((o,i)=>o.time-i.time)):s()}clearCache(){this.privateProps.cachedVoices=[]}setMIDIVolume(e){this.privateProps.midiVolume=Math.pow(e,Math.E)}setMasterTuning(e){e=Math.round(e);for(let A of this.midiChannels)A.setCustomController(oA.masterTuning,e)}callEvent(e,A){this.onEventCall?.({type:e,data:A})}getCachedVoice(e,A,t){let n=e.bankMSB,s=e.bankLSB,{isGMGSDrum:a,program:o}=e;return a&&(n=128,s=0),this.privateProps.cachedVoices?.[n]?.[s]?.[o]?.[A]?.[t]}setCachedVoice(e,A,t,n){let s=e.bankMSB,a=e.bankLSB,{isGMGSDrum:o,program:i}=e;o&&(s=128,a=0),this.privateProps.cachedVoices[s]||(this.privateProps.cachedVoices[s]=[]),this.privateProps.cachedVoices[s][a]||(this.privateProps.cachedVoices[s][a]=[]),this.privateProps.cachedVoices[s][a][i]||(this.privateProps.cachedVoices[s][a][i]=[]),this.privateProps.cachedVoices[s][a][i][A]||(this.privateProps.cachedVoices[s][a][i][A]=[]),this.privateProps.cachedVoices[s][a][i][A][t]=n}createMIDIChannelInternal(e){let A=new Qo(this,this.privateProps,this.privateProps.defaultPreset,this.midiChannels.length);this.midiChannels.push(A),e&&(this.callEvent("newChannel",void 0),A.sendChannelProperty(),this.midiChannels[this.midiChannels.length-1].setDrums(!0))}updatePresetList(){let e=this.soundBankManager.presetList;this.clearCache(),this.privateProps.callEvent("presetListChange",e),this.getDefaultPresets(),this.midiChannels.forEach(A=>{A.setPresetLock(!1)}),this.resetAllControllers(!1)}getDefaultPresets(){this.privateProps.defaultPreset=this.soundBankManager.getPreset({bankLSB:0,bankMSB:0,program:0,isGMGSDrum:!1},"xg"),this.privateProps.drumPreset=this.soundBankManager.getPreset({bankLSB:0,bankMSB:0,program:0,isGMGSDrum:!0},"gs")}};var zt=Ee.consoleColors;var Ma="spessasynth-worklet-processor";function ba(e,A){return{...A,...e??{}}}var va={skipToFirstNoteOn:!0,initialPlaybackRate:1};var cs=class extends Kt{events=[];constructor(A){super(),super.copyFrom(A),this.events=[]}},Wt=class e extends Le{tracks;embeddedSoundBank=void 0;embeddedSoundBankSize;constructor(A){super(),super.copyMetadataFrom(A),this.tracks=A.tracks.map(t=>new cs(t)),A instanceof e?this.embeddedSoundBankSize=A.embeddedSoundBankSize:this.embeddedSoundBankSize=A?.embeddedSoundBank?.byteLength}};var _t={shuffleOn:1,shuffleOff:2,index:3};var jt=class{synthesizer;sequencer;post;alive=!1;constructor(A,t,n){this.synthesizer=new Ra(A,t),this.sequencer=new sa(this.synthesizer),this.post=n,this.synthesizer.onEventCall=s=>{this.post({type:"eventCall",data:s,currentTime:this.synthesizer.currentSynthTime})},this.sequencer.onEventCall=s=>{if(s.type==="songListChange"){let o=s.data.newSongList.map(i=>new Wt(i));this.post({type:"sequencerReturn",data:{type:s.type,data:{newSongList:o}},currentTime:this.synthesizer.currentSynthTime});return}this.post({type:"sequencerReturn",data:s,currentTime:this.synthesizer.currentSynthTime})}}postReady(A,t,n=[]){this.post({type:"isFullyInitialized",data:{type:A,data:t},currentTime:this.synthesizer.currentSynthTime},n)}postProgress(A,t){this.post({type:"renderingProgress",data:{type:A,data:t},currentTime:this.synthesizer.currentSynthTime})}destroy(){this.synthesizer.destroySynthProcessor(),delete this.synthesizer,delete this.sequencer}handleMessage(A){let t=A.channelNumber,n;if(t>=0&&(n=this.synthesizer.midiChannels[t],n===void 0)){Ee.SpessaSynthWarn(`Trying to access channel ${t} which does not exist... ignoring!`);return}switch(A.type){case"midiMessage":this.synthesizer.processMessage(A.data.messageData,A.data.channelOffset,A.data.force,A.data.options);break;case"customCcChange":n?.setCustomController(A.data.ccNumber,A.data.ccValue);break;case"ccReset":t===Be?this.synthesizer.resetAllControllers():n?.resetControllers();break;case"setChannelVibrato":if(t===Be)for(let s of this.synthesizer.midiChannels)A.data.rate===Be?s.disableAndLockGSNRPN():s.setVibrato(A.data.depth,A.data.rate,A.data.delay);else A.data.rate===Be?n?.disableAndLockGSNRPN():n?.setVibrato(A.data.depth,A.data.rate,A.data.delay);break;case"stopAll":t===Be?this.synthesizer.stopAllChannels(A.data===1):n?.stopAllNotes(A.data===1);break;case"killNotes":this.synthesizer.killVoices(A.data);break;case"muteChannel":n?.muteChannel(A.data);break;case"addNewChannel":this.synthesizer.createMIDIChannel();break;case"setMasterParameter":this.synthesizer.setMasterParameter(A.data.type,A.data.data);break;case"setDrums":n?.setDrums(A.data);break;case"transposeChannel":n?.transposeChannel(A.data.semitones,A.data.force);break;case"lockController":if(A.data.controllerNumber===Be)n?.setPresetLock(A.data.isLocked);else{if(!n)return;n.lockedControllers[A.data.controllerNumber]=A.data.isLocked}break;case"sequencerSpecific":{if(!this.sequencer)return;let s=this.sequencer,a=A.data;switch(a.type){default:break;case"loadNewSongList":try{let i=a.data.map(r=>"duration"in r?Le.copyFrom(r):Le.fromArrayBuffer(r.binary,r.fileName));s.loadNewSongList(i)}catch(o){console.error(o),this.post({type:"sequencerReturn",data:{type:"midiError",data:o},currentTime:this.synthesizer.currentSynthTime})}break;case"pause":s.pause();break;case"play":s.play();break;case"setTime":s.currentTime=a.data;break;case"changeMIDIMessageSending":s.externalMIDIPlayback=a.data;break;case"setPlaybackRate":s.playbackRate=a.data;break;case"setLoopCount":s.loopCount=a.data;break;case"changeSong":switch(a.data.changeType){case _t.shuffleOff:s.shuffleMode=!1;break;case _t.shuffleOn:s.shuffleMode=!0;break;case _t.index:a.data.data!==void 0&&(console.log("INDEX",a.data),s.songIndex=a.data.data);break}break;case"getMIDI":if(!s.midiData)throw new Error("No MIDI is loaded!");this.post({type:"sequencerReturn",data:{type:"getMIDI",data:s.midiData},currentTime:this.synthesizer.currentSynthTime});break;case"setSkipToFirstNote":s.skipToFirstNoteOn=a.data;break}break}case"soundBankManager":try{let s=this.synthesizer.soundBankManager,a=A.data,o;switch(a.type){case"addSoundBank":o=ut.fromArrayBuffer(a.data.soundBankBuffer),s.addSoundBank(o,a.data.id,a.data.bankOffset),this.postReady("soundBankManager",null);break;case"deleteSoundBank":s.deleteSoundBank(a.data),this.postReady("soundBankManager",null);break;case"rearrangeSoundBanks":s.priorityOrder=a.data,this.postReady("soundBankManager",null)}}catch(s){this.post({type:"soundBankError",data:s,currentTime:this.synthesizer.currentSynthTime})}break;case"keyModifierManager":{let s=A.data,a=this.synthesizer.keyModifierManager;switch(s.type){default:return;case"addMapping":a.addMapping(s.data.channel,s.data.midiNote,s.data.mapping);break;case"clearMappings":a.clearMappings();break;case"deleteMapping":a.deleteMapping(s.data.channel,s.data.midiNote)}break}case"requestSynthesizerSnapshot":{let s=gs.create(this.synthesizer);this.postReady("synthesizerSnapshot",s);break}case"setLogLevel":Xs(A.data.enableInfo,A.data.enableWarning,A.data.enableGroup);break;case"destroyWorklet":this.alive=!1,this.synthesizer.destroySynthProcessor(),this.destroy();break;default:Ee.SpessaSynthWarn("Unrecognized event!",A);break}}};var $t=class extends jt{alive=!0;oneOutputMode;port;constructor(A,t,n,s){super(A,{enableEffects:!s.oneOutput,enableEventSystem:s?.enableEventSystem,initialTime:t},(a,o)=>{n.postMessage(a,o)}),this.port=n,this.oneOutputMode=s.oneOutput,this.synthesizer.processorInitialized.then(()=>{this.port.onmessage=a=>this.handleMessage(a.data),this.postReady("sf3Decoder",null)})}process(A,t){if(!this.alive)return!1;if(this.sequencer.processTick(),this.oneOutputMode){let n=t[0],s=[];for(let a=0;a<32;a+=2)s.push([n[a],n[a+1]]);this.synthesizer.renderAudioSplit([],[],s)}else this.synthesizer.renderAudioSplit(t[0],t[1],t.slice(2));return!0}handleMessage(A){if(A.type==="startOfflineRender"){this.startOfflineRender(A.data);return}super.handleMessage(A)}startOfflineRender(A){if(!this.sequencer)return;A.soundBankList.forEach((n,s)=>{try{this.synthesizer.soundBankManager.addSoundBank(ut.fromArrayBuffer(n.soundBankBuffer),`bank-${s}`,n.bankOffset)}catch(a){this.post({type:"soundBankError",data:a,currentTime:this.synthesizer.currentSynthTime})}}),A.snapshot!==void 0&&this.synthesizer.applySynthesizerSnapshot(A.snapshot),Ee.SpessaSynthInfo("%cRendering enabled! Starting render.",zt.info),this.sequencer.loopCount=A.loopCount,this.synthesizer.setMasterParameter("voiceCap",1/0);let t=ba(A.sequencerOptions,va);this.sequencer.skipToFirstNoteOn=t.skipToFirstNoteOn,this.sequencer.playbackRate=t.initialPlaybackRate;try{this.sequencer.loadNewSongList([Le.copyFrom(A.midiSequence)]),this.sequencer.play()}catch(n){console.error(n),this.post({type:"sequencerReturn",data:{type:"midiError",data:n},currentTime:this.synthesizer.currentSynthTime})}this.postReady("startOfflineRender",null)}};var Es=class extends AudioWorkletProcessor{process;core;constructor(A){super(),this.core=new $t(sampleRate,currentTime,this.port,A.processorOptions),this.process=this.core.process.bind(this.core)}};registerProcessor(Ma,Es);Ee.SpessaSynthInfo("%cProcessor successfully registered!",zt.recognized);
|