UNPKG

sf2-player

Version:
17 lines (15 loc) 10.2 kB
var F=23283064365386963e-26,w=class{float(e=1){return this.int()*F*e}probability(e){return this.float()<e}norm(e=1){return(this.int()*F-.5)*2*e}normMinMax(e,n){let r=this.minmax(e,n);return this.float()<.5?r:-r}minmax(e,n){return this.float()*(n-e)+e}minmaxInt(e,n){e|=0;let r=(n|0)-e;return r?e+this.int()%r:e}minmaxUint(e,n){e>>>=0;let r=(n>>>0)-e;return r?e+this.int()%r:e}};var g=class extends w{constructor(e){super(),this.rnd=e}float(e=1){return this.rnd()*e}norm(e=1){return(this.rnd()-.5)*2*e}int(){return this.rnd()*4294967296>>>0}};var A=new g(Math.random);var u={bins:2,scale:1,rnd:A};var m=(t,e,n)=>{let r=new Array(t);for(let i=0;i<t;i++)r[i]=n.norm(e);return r},p=t=>t.reduce((e,n)=>e+n,0);function*S(t,e){let n=[t[Symbol.iterator](),e[Symbol.iterator]()];for(let r=0;;r^=1){let i=n[r].next();if(i.done)return;yield i.value}}function*d(t){let{bins:e,scale:n,rnd:r}={...u,...t},i=m(e,n,r);i.forEach((s,c)=>i[c]=c&1?s:-s);let a=1/e,o=p(i);for(let s=0,c=-1;;++s>=e&&(s=0))o-=i[s],o+=i[s]=c*r.norm(n),c^=4294967294,yield c*o*a}var B=t=>S(d(t),d(t));var T=t=>{let e=32;return t&=-t,t&&e--,t&65535&&(e-=16),t&16711935&&(e-=8),t&252645135&&(e-=4),t&858993459&&(e-=2),t&1431655765&&(e-=1),e};function*E(t){let{bins:e=8,scale:n,rnd:r}={...u,...t},i=m(e,n,r),a=1/e,o=p(i);for(let s=0;;s=s+1>>>0){let c=T(s)%e;o-=i[c],o+=i[c]=r.norm(n),yield o*a}}function*b(t){let{bins:e,scale:n,rnd:r}={...u,...t},i=m(e,n,r),a=1/e,o=p(i);for(let s=0;;++s>=e&&(s=0))o-=i[s],o+=i[s]=r.norm(n),yield o*a}var P=t=>S(b(t),b(t));function*N(t){let{scale:e,rnd:n}={...u,...t};for(;;)yield n.norm(e)}var M=(t,e)=>typeof t?.[e]=="function";var C=t=>M(t,"xform")?t.xform():t;var O=t=>typeof t?.[Symbol.iterator]=="function";var _=t=>t;var h=class{value;constructor(e){this.value=e}deref(){return this.value}},G=t=>new h(t),D=t=>t instanceof h,L=t=>t instanceof h?t:new h(t),k=t=>t instanceof h?t.deref():t;var q=(t,e)=>[t,_,e];function U(t){return t?[...t]:q(()=>[],(e,n)=>(e.push(n),e))}function*V(t,e){let n=C(t)(U()),r=n[1],i=n[2];for(let a of e){let o=i([],a);if(D(o)){yield*k(r(o.deref()));return}o.length&&(yield*o)}yield*k(r([]))}var z=(t,e)=>[t[0],t[1],e];function R(t,e){return O(e)?V(R(t),e):n=>{let r=n[2],i=t;return z(n,(a,o)=>--i>0?r(a,o):i===0?L(r(a,o)):G(a))}}var H={version:"1.3.16",date:"2025-03-30T16:28:39.195Z"},f={blue:"blue",brown:"red",green:"green",pink:"pink",red:"red",violet:"violet"},j={noise:"white",scale:1,peaks:2,randomAlgorithm:A,decay:2,delay:0,reverse:!1,time:2,filterType:"allpass",filterFreq:2200,filterQ:1,mix:.5,once:!1},x=class t{static version=H.version;static build=H.date;ctx;wetGainNode;dryGainNode;filterNode;convolverNode;outputNode;options;isConnected;noise=N;constructor(e,n){this.ctx=e,this.options=Object.assign(j,n),this.wetGainNode=this.ctx.createGain(),this.dryGainNode=this.ctx.createGain(),this.filterNode=this.ctx.createBiquadFilter(),this.convolverNode=this.ctx.createConvolver(),this.outputNode=this.ctx.createGain(),this.isConnected=!1,this.filterType(this.options.filterType),this.setNoise(this.options.noise),this.buildImpulse(),this.mix(this.options.mix)}connect(e){return this.isConnected&&this.options.once?(this.isConnected=!1,this.outputNode):(this.convolverNode.connect(this.filterNode),this.filterNode.connect(this.wetGainNode),e.connect(this.convolverNode),e.connect(this.dryGainNode).connect(this.outputNode),e.connect(this.wetGainNode).connect(this.outputNode),this.isConnected=!0,this.outputNode)}disconnect(e){return this.isConnected&&(this.convolverNode.disconnect(this.filterNode),this.filterNode.disconnect(this.wetGainNode)),this.isConnected=!1,e}mix(e){if(!t.inRange(e,0,1))throw new RangeError("[Reverb.js] Dry/Wet ratio must be between 0 to 1.");this.options.mix=e,this.dryGainNode.gain.value=1-this.options.mix,this.wetGainNode.gain.value=this.options.mix}time(e){if(!t.inRange(e,1,50))throw new RangeError("[Reverb.js] Time length of inpulse response must be less than 50sec.");this.options.time=e,this.buildImpulse()}decay(e){if(!t.inRange(e,0,100))throw new RangeError("[Reverb.js] Inpulse Response decay level must be less than 100.");this.options.decay=e,this.buildImpulse()}delay(e){if(!t.inRange(e,0,100))throw new RangeError("[Reverb.js] Inpulse Response delay time must be less than 100.");this.options.delay=e,this.buildImpulse()}reverse(e){this.options.reverse=e,this.buildImpulse()}filterType(e="allpass"){this.filterNode.type=this.options.filterType=e}filterFreq(e){if(!t.inRange(e,20,2e4))throw new RangeError("[Reverb.js] Filter frequrncy must be between 20 and 20000.");this.options.filterFreq=e,this.filterNode.frequency.value=this.options.filterFreq}filterQ(e){if(!t.inRange(e,0,10))throw new RangeError("[Reverb.js] Filter Q value must be between 0 and 10.");this.options.filterQ=e,this.filterNode.Q.value=this.options.filterQ}peaks(e){this.options.peaks=e,this.buildImpulse()}scale(e){this.options.scale=e,this.buildImpulse()}randomAlgorithm(e){this.options.randomAlgorithm=e,this.buildImpulse()}setNoise(e){switch(this.options.noise=e,e){case f.blue:this.noise=d;break;case f.green:this.noise=B;break;case f.pink:this.noise=E;break;case f.red:case f.brown:this.noise=b;break;case f.violet:this.noise=P;break;default:this.noise=N}this.buildImpulse()}setRandomAlgorythm(e){this.options.randomAlgorithm=e,this.buildImpulse()}static inRange(e,n,r){return(e-n)*(e-r)<=0}buildImpulse(){let e=this.ctx.sampleRate,n=Math.max(e*this.options.time,1),r=e*this.options.delay,i=this.ctx.createBuffer(2,n,e),a=new Float32Array(n),o=new Float32Array(n),s=this.getNoise(n),c=this.getNoise(n);for(let l=0;l<n;l++){let v=0;l<r?(a[l]=0,o[l]=0,v=this.options.reverse??!1?n-(l-r):l-r):v=this.options.reverse??!1?n-l:l,a[l]=(s[l]??0)*(1-v/n)**this.options.decay,o[l]=(c[l]??0)*(1-v/n)**this.options.decay}i.getChannelData(0).set(a),i.getChannelData(1).set(o),this.convolverNode.buffer=i}getNoise(e){return[...R(e,this.noise({bins:this.options.peaks,scale:this.options.scale,rnd:this.options.randomAlgorithm}))]}};var y=class{input;parser;bank;bankSet;bufferSize;ctx;gainMaster;bufSrc;channelInstrument;channelBank;channelVolume;channelPanpot;channelPitchBend;channelPitchBendSensitivity;channelExpression;channelAttack;channelDecay;channelSustin;channelRelease;channelHold;channelHarmonicContent;channelCutOffFrequency;mode;programSet;channelMute;currentNoteOn;baseVolume;masterVolume;percussionPart;percussionVolume;reverb;modulation;filter;items;intersection;timer;drag;element;constructor(e){this.input=e,this.parser=null,this.bank=0,this.bankSet={},this.bufferSize=2048,this.ctx=this.getAudioContext(),this.gainMaster=this.ctx.createGain(),this.bufSrc=this.ctx.createBufferSource(),this.channelInstrument=new Array(16).fill(0),this.channelBank=new Array(16).fill(0),this.channelBank[9]=127,this.channelVolume=new Array(16).fill(100),this.channelPanpot=new Array(16).fill(64),this.channelPitchBend=new Array(16).fill(0),this.channelPitchBendSensitivity=new Array(16).fill(2),this.channelExpression=new Array(16).fill(127),this.channelAttack=new Array(16).fill(64),this.channelDecay=new Array(16).fill(64),this.channelSustin=new Array(16).fill(64),this.channelRelease=new Array(16).fill(64),this.channelHold=new Array(16).fill(!1),this.channelHarmonicContent=new Array(16).fill(64),this.channelCutOffFrequency=new Array(16).fill(64),this.mode="GM2",this.programSet=[],this.channelMute=new Array(16).fill(!1),this.currentNoteOn=Array.from({length:16},()=>[]),this.baseVolume=1/65535,this.masterVolume=16384,this.percussionPart=new Array(16).fill(!1),this.percussionPart[9]=!0,this.percussionVolume=new Array(128).fill(127),this.reverb=[],this.modulation=new Array(16).fill(0),this.filter=[],this.items=[],this.intersection=new IntersectionObserver(n=>{n.forEach(r=>{r.target instanceof HTMLElement&&(r.target.dataset.isIntersecting=r.isIntersecting.toString())})},{}),this.timer=null,this.drag=!1,this.element=null;for(let n=0;n<16;++n)this.reverb[n]=new x(this.ctx,{noise:"violet"}),this.filter[n]=this.ctx.createBiquadFilter()}getAudioContext(){let e=new AudioContext,n=()=>{document.removeEventListener("touchstart",n);let r=e.createBufferSource();r.start(),r.stop()};return document.addEventListener("touchstart",n),e}};function Q(t){return new Promise((e,n)=>{let r=new FileReader;r.onload=()=>r.result instanceof ArrayBuffer?e(r.result):n(new TypeError("File reader did not yield ArrayBuffer.")),r.onerror=i=>n(i),r.readAsArrayBuffer(t)})}async function $(t){let e=await fetch(t);if(!e.ok)throw new Error("Did not get an OK response when fetching resource.");return await e.arrayBuffer()}var Y=t=>new Promise(e=>{let n=setInterval(()=>{t!==void 0&&(clearInterval(n),e())},16)}),I=class{synth;_channel=0;_bankIndex=0;_programIndex=0;set channel(e){this._channel=e}async loadSoundFontFromFile(e){let n=await Q(e);await this.bootSynth(n)}async loadSoundFontFromURL(e){let n=await $(e);await this.bootSynth(n)}set bank(e){this._bankIndex=e,this.synth&&this.synth.bankChange(this._channel,e)}get banks(){return this.synth?.programSet?Object.keys(this.synth.programSet).map(e=>({id:e,name:("000"+parseInt(e,10)).slice(-3)})):[]}set program(e){this._programIndex=e,this.synth&&this.synth.programChange(this._channel,e)}get programs(){if(!this.synth?.programSet||!this.synth.programSet[this._bankIndex])return[];let{programSet:e}=this.synth;return Object.keys(e[this._bankIndex]).map(n=>({id:n,name:("000"+(parseInt(n,10)+1)).slice(-3)+":"+e[this._bankIndex][n]}))}async bootSynth(e){let n=new Uint8Array(e);this.synth?this.synth.refreshInstruments(n):(this.synth=new y(n),this.synth.init(),this.synth.start(),await Y(this.synth.programSet))}noteOn(e,n=127,r){this.synth&&this.synth.noteOn(r??this._channel,e,n)}noteOff(e,n=127,r){this.synth&&this.synth.noteOff(r??this._channel,e,n)}};export{I as default}; /*! Bundled license information: @logue/reverb/dist/Reverb.es.js: (** * @logue/reverb * * @description JavaScript Reverb effect class * @author Logue <logue@hotmail.co.jp> * @copyright 2019-2025 By Masashi Yoshikawa All rights reserved. * @license MIT * @version 1.3.16 * @see {@link https://github.com/logue/Reverb.js} *) */ //# sourceMappingURL=index.js.map