cacophony 0.3.3 → 0.3.4
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.
- package/dist/assets/phase-vocoder-5mfSKiHe.js +2 -0
- package/dist/assets/phase-vocoder-5mfSKiHe.js.map +1 -0
- package/dist/cacophony.cjs.js +1 -1
- package/dist/cacophony.cjs.js.map +1 -1
- package/dist/cacophony.es.js +63 -63
- package/dist/cacophony.es.js.map +1 -1
- package/dist/cacophony.iife.js +1 -1
- package/dist/cacophony.iife.js.map +1 -1
- package/dist/cacophony.umd.js +1 -1
- package/dist/cacophony.umd.js.map +1 -1
- package/docs/classes/Cacophony.html +2 -2
- package/docs/classes/Group.html +2 -2
- package/docs/classes/MicrophonePlayback.html +2 -2
- package/docs/classes/MicrophoneStream.html +2 -2
- package/docs/classes/Playback.html +2 -2
- package/docs/classes/Sound.html +2 -2
- package/docs/enums/SoundType.html +2 -2
- package/docs/interfaces/BaseSound.html +2 -2
- package/docs/types/FadeType.html +1 -1
- package/docs/types/LoopCount.html +1 -1
- package/docs/types/Orientation.html +1 -1
- package/docs/types/Position.html +1 -1
- package/package.json +1 -1
- package/src/cacophony.ts +1 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(){"use strict";class at extends AudioWorkletProcessor{nbInputs;nbOutputs;blockSize;hopSize;nbOverlaps;inputBuffers=[];inputBuffersHead=[];inputBuffersToSend=[];outputBuffers=[];outputBuffersToRetrieve=[];constructor(t){super(t),this.nbInputs=t.numberOfInputs||1,this.nbOutputs=t.numberOfOutputs||1,this.blockSize=t.processorOptions.blockSize||1024,this.hopSize=128,this.nbOverlaps=Math.floor(this.blockSize/this.hopSize),this.initializeBuffers()}initializeBuffers(){this.inputBuffers=new Array(this.nbInputs),this.inputBuffersHead=new Array(this.nbInputs),this.inputBuffersToSend=new Array(this.nbInputs),this.outputBuffers=new Array(this.nbOutputs),this.outputBuffersToRetrieve=new Array(this.nbOutputs);for(let t=0;t<this.nbInputs;t++)this.allocateInputChannels(t,1);for(let t=0;t<this.nbOutputs;t++)this.allocateOutputChannels(t,1)}allocateInputChannels(t,s){this.inputBuffers[t]=new Array(s),this.inputBuffersHead[t]=new Array(s),this.inputBuffersToSend[t]=new Array(s);for(let e=0;e<s;e++)this.inputBuffers[t][e]=new Float32Array(this.blockSize+128),this.inputBuffers[t][e].fill(0),this.inputBuffersHead[t][e]=this.inputBuffers[t][e].subarray(0,this.blockSize),this.inputBuffersToSend[t][e]=new Float32Array(this.blockSize)}allocateOutputChannels(t,s){this.outputBuffers[t]=new Array(s),this.outputBuffersToRetrieve[t]=new Array(s);for(let e=0;e<s;e++)this.outputBuffers[t][e]=new Float32Array(this.blockSize),this.outputBuffers[t][e].fill(0),this.outputBuffersToRetrieve[t][e]=new Float32Array(this.blockSize)}reallocateChannelsIfNeeded(t,s){for(let e=0;e<this.nbInputs;e++){let r=t[e].length;r!==this.inputBuffers[e].length&&this.allocateInputChannels(e,r)}for(let e=0;e<this.nbOutputs;e++){let r=s[e].length;r!==this.outputBuffers[e].length&&this.allocateOutputChannels(e,r)}}readInputs(t){for(let s=0;s<this.nbInputs;s++)for(let e=0;e<this.inputBuffers[s].length;e++){let r=t[s][e];this.inputBuffers[s][e].set(r,this.blockSize)}}writeOutputs(t){for(let s=0;s<this.nbOutputs;s++)for(let e=0;e<this.outputBuffers[s].length;e++)t[s][e].set(this.outputBuffers[s][e].subarray(0,128))}shiftInputBuffers(){for(let t=0;t<this.nbInputs;t++)for(let s=0;s<this.inputBuffers[t].length;s++)this.inputBuffers[t][s].copyWithin(0,128)}shiftOutputBuffers(){for(let t=0;t<this.nbOutputs;t++)for(let s=0;s<this.outputBuffers[t].length;s++)this.outputBuffers[t][s].copyWithin(0,128),this.outputBuffers[t][s].fill(0,this.blockSize-128)}prepareInputBuffersToSend(){for(let t=0;t<this.nbInputs;t++)for(let s=0;s<this.inputBuffers[t].length;s++)this.inputBuffersToSend[t][s].set(this.inputBuffersHead[t][s])}handleOutputBuffersToRetrieve(){for(let t=0;t<this.nbOutputs;t++)for(let s=0;s<this.outputBuffers[t].length;s++)for(let e=0;e<this.blockSize;e++)this.outputBuffers[t][s][e]+=this.outputBuffersToRetrieve[t][s][e]/this.nbOverlaps}process(t,s,e){return this.reallocateChannelsIfNeeded(t,s),this.readInputs(t),this.shiftInputBuffers(),this.prepareInputBuffersToSend(),this.processOLA(this.inputBuffersToSend,this.outputBuffersToRetrieve,e),this.handleOutputBuffersToRetrieve(),this.writeOutputs(s),this.shiftOutputBuffers(),!0}}function ht(h){return h&&h.__esModule&&Object.prototype.hasOwnProperty.call(h,"default")?h.default:h}function b(h){if(this.size=h|0,this.size<=1||this.size&this.size-1)throw new Error("FFT size must be a power of two and bigger than 1");this._csize=h<<1;for(var t=new Array(this.size*2),s=0;s<t.length;s+=2){const f=Math.PI*s/this.size;t[s]=Math.cos(f),t[s+1]=-Math.sin(f)}this.table=t;for(var e=0,r=1;this.size>r;r<<=1)e++;this._width=e%2===0?e-1:e,this._bitrev=new Array(1<<this._width);for(var n=0;n<this._bitrev.length;n++){this._bitrev[n]=0;for(var i=0;i<this._width;i+=2){var o=this._width-i-2;this._bitrev[n]|=(n>>>i&3)<<o}}this._out=null,this._data=null,this._inv=0}var ft=b;b.prototype.fromComplexArray=function(t,s){for(var e=s||new Array(t.length>>>1),r=0;r<t.length;r+=2)e[r>>>1]=t[r];return e},b.prototype.createComplexArray=function(){const t=new Array(this._csize);for(var s=0;s<t.length;s++)t[s]=0;return t},b.prototype.toComplexArray=function(t,s){for(var e=s||this.createComplexArray(),r=0;r<e.length;r+=2)e[r]=t[r>>>1],e[r+1]=0;return e},b.prototype.completeSpectrum=function(t){for(var s=this._csize,e=s>>>1,r=2;r<e;r+=2)t[s-r]=t[r],t[s-r+1]=-t[r+1]},b.prototype.transform=function(t,s){if(t===s)throw new Error("Input and output buffers must be different");this._out=t,this._data=s,this._inv=0,this._transform4(),this._out=null,this._data=null},b.prototype.realTransform=function(t,s){if(t===s)throw new Error("Input and output buffers must be different");this._out=t,this._data=s,this._inv=0,this._realTransform4(),this._out=null,this._data=null},b.prototype.inverseTransform=function(t,s){if(t===s)throw new Error("Input and output buffers must be different");this._out=t,this._data=s,this._inv=1,this._transform4();for(var e=0;e<t.length;e++)t[e]/=this.size;this._out=null,this._data=null},b.prototype._transform4=function(){var t=this._out,s=this._csize,e=this._width,r=1<<e,n=s/r<<1,i,o,f=this._bitrev;if(n===4)for(i=0,o=0;i<s;i+=n,o++){const u=f[o];this._singleTransform2(i,u,r)}else for(i=0,o=0;i<s;i+=n,o++){const u=f[o];this._singleTransform4(i,u,r)}var a=this._inv?-1:1,c=this.table;for(r>>=2;r>=2;r>>=2){n=s/r<<1;var v=n>>>2;for(i=0;i<s;i+=n)for(var d=i+v,B=i,l=0;B<d;B+=2,l+=r){const u=B,p=u+v,m=p+v,_=m+v,g=t[u],S=t[u+1],w=t[p],I=t[p+1],C=t[m],y=t[m+1],A=t[_],T=t[_+1],z=g,F=S,x=c[l],O=a*c[l+1],k=w*x-I*O,R=w*O+I*x,M=c[2*l],K=a*c[2*l+1],U=C*M-y*K,Z=C*K+y*M,H=c[3*l],j=a*c[3*l+1],q=A*H-T*j,L=A*j+T*H,N=z+U,E=F+Z,D=z-U,V=F-Z,$=k+q,P=R+L,W=a*(k-q),G=a*(R-L),J=N+$,Q=E+P,X=N-$,Y=E-P,tt=D+G,st=V-W,et=D-G,rt=V+W;t[u]=J,t[u+1]=Q,t[p]=tt,t[p+1]=st,t[m]=X,t[m+1]=Y,t[_]=et,t[_+1]=rt}}},b.prototype._singleTransform2=function(t,s,e){const r=this._out,n=this._data,i=n[s],o=n[s+1],f=n[s+e],a=n[s+e+1],c=i+f,v=o+a,d=i-f,B=o-a;r[t]=c,r[t+1]=v,r[t+2]=d,r[t+3]=B},b.prototype._singleTransform4=function(t,s,e){const r=this._out,n=this._data,i=this._inv?-1:1,o=e*2,f=e*3,a=n[s],c=n[s+1],v=n[s+e],d=n[s+e+1],B=n[s+o],l=n[s+o+1],u=n[s+f],p=n[s+f+1],m=a+B,_=c+l,g=a-B,S=c-l,w=v+u,I=d+p,C=i*(v-u),y=i*(d-p),A=m+w,T=_+I,z=g+y,F=S-C,x=m-w,O=_-I,k=g-y,R=S+C;r[t]=A,r[t+1]=T,r[t+2]=z,r[t+3]=F,r[t+4]=x,r[t+5]=O,r[t+6]=k,r[t+7]=R},b.prototype._realTransform4=function(){var t=this._out,s=this._csize,e=this._width,r=1<<e,n=s/r<<1,i,o,f=this._bitrev;if(n===4)for(i=0,o=0;i<s;i+=n,o++){const it=f[o];this._singleRealTransform2(i,it>>>1,r>>>1)}else for(i=0,o=0;i<s;i+=n,o++){const it=f[o];this._singleRealTransform4(i,it>>>1,r>>>1)}var a=this._inv?-1:1,c=this.table;for(r>>=2;r>=2;r>>=2){n=s/r<<1;var v=n>>>1,d=v>>>1,B=d>>>1;for(i=0;i<s;i+=n)for(var l=0,u=0;l<=B;l+=2,u+=r){var p=i+l,m=p+d,_=m+d,g=_+d,S=t[p],w=t[p+1],I=t[m],C=t[m+1],y=t[_],A=t[_+1],T=t[g],z=t[g+1],F=S,x=w,O=c[u],k=a*c[u+1],R=I*O-C*k,M=I*k+C*O,K=c[2*u],U=a*c[2*u+1],Z=y*K-A*U,H=y*U+A*K,j=c[3*u],q=a*c[3*u+1],L=T*j-z*q,N=T*q+z*j,E=F+Z,D=x+H,V=F-Z,$=x-H,P=R+L,W=M+N,G=a*(R-L),J=a*(M-N),Q=E+P,X=D+W,Y=V+J,tt=$-G;if(t[p]=Q,t[p+1]=X,t[m]=Y,t[m+1]=tt,l===0){var st=E-P,et=D-W;t[_]=st,t[_+1]=et;continue}if(l!==B){var rt=V,vt=-$,dt=E,mt=-D,Bt=-a*J,_t=-a*G,bt=-a*W,gt=-a*P,St=rt+Bt,It=vt+_t,wt=dt+gt,Ct=mt-bt,nt=i+d-l,ot=i+v-l;t[nt]=St,t[nt+1]=It,t[ot]=wt,t[ot+1]=Ct}}}},b.prototype._singleRealTransform2=function(t,s,e){const r=this._out,n=this._data,i=n[s],o=n[s+e],f=i+o,a=i-o;r[t]=f,r[t+1]=0,r[t+2]=a,r[t+3]=0},b.prototype._singleRealTransform4=function(t,s,e){const r=this._out,n=this._data,i=this._inv?-1:1,o=e*2,f=e*3,a=n[s],c=n[s+e],v=n[s+o],d=n[s+f],B=a+v,l=a-v,u=c+d,p=i*(c-d),m=B+u,_=l,g=-p,S=B-u,w=l,I=p;r[t]=m,r[t+1]=0,r[t+2]=_,r[t+3]=g,r[t+4]=S,r[t+5]=0,r[t+6]=w,r[t+7]=I};var ut=ht(ft);const ct=2048;function lt(h){let t=new Float32Array(h);for(let s=0;s<h;s++)t[s]=.5*(1-Math.cos(2*Math.PI*s/h));return t}class pt extends at{fftSize;timeCursor;hannWindow;fft;freqComplexBuffer;freqComplexBufferShifted;timeComplexBuffer;magnitudes;peakIndexes;nbPeaks;static get parameterDescriptors(){return[{name:"pitchFactor",defaultValue:1}]}constructor(t){t.processorOptions={blockSize:ct},super(t),this.fftSize=this.blockSize,this.timeCursor=0,this.hannWindow=lt(this.blockSize),this.fft=new ut(this.fftSize),this.freqComplexBuffer=this.fft.createComplexArray(),this.freqComplexBufferShifted=this.fft.createComplexArray(),this.timeComplexBuffer=this.fft.createComplexArray(),this.magnitudes=new Float32Array(this.fftSize/2+1),this.peakIndexes=new Int32Array(this.magnitudes.length),this.nbPeaks=0}processOLA(t,s,e){const r=e.get("pitchFactor")[e.get("pitchFactor").length-1];for(let o=0;o<this.nbInputs;o++)for(let f=0;f<t[o].length;f++){var n=t[o][f],i=s[o][f];this.applyHannWindow(n),this.fft.realTransform(this.freqComplexBuffer,n),this.computeMagnitudes(),this.findPeaks(),this.shiftPeaks(r),this.fft.completeSpectrum(this.freqComplexBufferShifted),this.fft.inverseTransform(this.timeComplexBuffer,this.freqComplexBufferShifted),this.fft.fromComplexArray(this.timeComplexBuffer,i),this.applyHannWindow(i)}return this.timeCursor+=this.hopSize,!0}applyHannWindow(t){for(let s=0;s<this.blockSize;s++)t[s]*=this.hannWindow[s]}computeMagnitudes(){for(let t=0,s=0;t<this.magnitudes.length;t++,s+=2){const e=this.freqComplexBuffer[s],r=this.freqComplexBuffer[s+1];this.magnitudes[t]=e**2+r**2}}findPeaks(){this.nbPeaks=0;for(let t=2,s=this.magnitudes.length-2;t<s;t++){const e=this.magnitudes[t];this.magnitudes[t-1]>=e||this.magnitudes[t-2]>=e||this.magnitudes[t+1]>=e||this.magnitudes[t+2]>=e||(this.peakIndexes[this.nbPeaks++]=t)}}shiftPeaks(t){this.freqComplexBufferShifted.fill(0);for(let s=0;s<this.nbPeaks;s++){const e=this.peakIndexes[s],r=Math.round(e*t);if(r>this.magnitudes.length)break;let n=s>0?e-Math.floor((e-this.peakIndexes[s-1])/2):0,i=s<this.nbPeaks-1?e+Math.ceil((this.peakIndexes[s+1]-e)/2):this.fftSize;for(let o=n-e;o<i-e;o++){const f=e+o,a=r+o;if(a>=this.magnitudes.length)break;const c=2*Math.PI*(a-f)/this.fftSize,v=Math.cos(c*this.timeCursor),d=Math.sin(c*this.timeCursor),B=f*2,l=B+1,u=this.freqComplexBuffer[B],p=this.freqComplexBuffer[l],m=u*v-p*d,_=u*d+p*v,g=a*2,S=g+1;this.freqComplexBufferShifted[g]+=m,this.freqComplexBufferShifted[S]+=_}}}}registerProcessor("phase-vocoder-processor",pt)})();
|
|
2
|
+
//# sourceMappingURL=phase-vocoder-5mfSKiHe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-vocoder-5mfSKiHe.js","sources":["../src/processors/ola.ts","../node_modules/fft.js/lib/fft.js","../src/processors/phase-vocoder.ts"],"sourcesContent":["\"use strict\";\n\nconst WEBAUDIO_BLOCK_SIZE = 128;\nconst DEFAULT_BLOCK_SIZE = 1024; // Default block size if not provided in options\n\n/** Overlap-Add Node */\nexport default abstract class OLAProcessor extends AudioWorkletProcessor {\n nbInputs: number;\n nbOutputs: number;\n blockSize: number;\n hopSize: number;\n nbOverlaps: number;\n inputBuffers: Float32Array[][] = [];\n inputBuffersHead: Float32Array[][] = [];\n inputBuffersToSend: Float32Array[][] = [];\n outputBuffers: Float32Array[][] = [];\n outputBuffersToRetrieve: Float32Array[][] = [];\n\n constructor(options: AudioWorkletNodeOptions) {\n super(options);\n\n this.nbInputs = options.numberOfInputs || 1;\n this.nbOutputs = options.numberOfOutputs || 1;\n\n this.blockSize = options.processorOptions.blockSize || DEFAULT_BLOCK_SIZE;\n this.hopSize = WEBAUDIO_BLOCK_SIZE;\n this.nbOverlaps = Math.floor(this.blockSize / this.hopSize);\n\n this.initializeBuffers();\n }\n\n private initializeBuffers() {\n this.inputBuffers = new Array(this.nbInputs);\n this.inputBuffersHead = new Array(this.nbInputs);\n this.inputBuffersToSend = new Array(this.nbInputs);\n this.outputBuffers = new Array(this.nbOutputs);\n this.outputBuffersToRetrieve = new Array(this.nbOutputs);\n\n for (let i = 0; i < this.nbInputs; i++) {\n this.allocateInputChannels(i, 1);\n }\n\n for (let i = 0; i < this.nbOutputs; i++) {\n this.allocateOutputChannels(i, 1);\n }\n }\n\n private allocateInputChannels(inputIndex: number, nbChannels: number) {\n this.inputBuffers[inputIndex] = new Array(nbChannels);\n this.inputBuffersHead[inputIndex] = new Array(nbChannels);\n this.inputBuffersToSend[inputIndex] = new Array(nbChannels);\n\n for (let i = 0; i < nbChannels; i++) {\n this.inputBuffers[inputIndex][i] = new Float32Array(this.blockSize + WEBAUDIO_BLOCK_SIZE);\n this.inputBuffers[inputIndex][i].fill(0);\n this.inputBuffersHead[inputIndex][i] = this.inputBuffers[inputIndex][i].subarray(0, this.blockSize);\n this.inputBuffersToSend[inputIndex][i] = new Float32Array(this.blockSize);\n }\n }\n\n private allocateOutputChannels(outputIndex: number, nbChannels: number) {\n this.outputBuffers[outputIndex] = new Array(nbChannels);\n this.outputBuffersToRetrieve[outputIndex] = new Array(nbChannels);\n\n for (let i = 0; i < nbChannels; i++) {\n this.outputBuffers[outputIndex][i] = new Float32Array(this.blockSize);\n this.outputBuffers[outputIndex][i].fill(0);\n this.outputBuffersToRetrieve[outputIndex][i] = new Float32Array(this.blockSize);\n }\n }\n\n private reallocateChannelsIfNeeded(inputs: Float32Array[][], outputs: Float32Array[][]) {\n for (let i = 0; i < this.nbInputs; i++) {\n let nbChannels = inputs[i].length;\n if (nbChannels !== this.inputBuffers[i].length) {\n this.allocateInputChannels(i, nbChannels);\n }\n }\n\n for (let i = 0; i < this.nbOutputs; i++) {\n let nbChannels = outputs[i].length;\n if (nbChannels !== this.outputBuffers[i].length) {\n this.allocateOutputChannels(i, nbChannels);\n }\n }\n }\n\n private readInputs(inputs: Float32Array[][]) {\n for (let i = 0; i < this.nbInputs; i++) {\n for (let j = 0; j < this.inputBuffers[i].length; j++) {\n let webAudioBlock = inputs[i][j];\n this.inputBuffers[i][j].set(webAudioBlock, this.blockSize);\n }\n }\n }\n\n private writeOutputs(outputs: Float32Array[][]) {\n for (let i = 0; i < this.nbOutputs; i++) {\n for (let j = 0; j < this.outputBuffers[i].length; j++) {\n let webAudioBlock = outputs[i][j];\n webAudioBlock.set(this.outputBuffers[i][j].subarray(0, WEBAUDIO_BLOCK_SIZE));\n }\n }\n }\n\n private shiftInputBuffers() {\n for (let i = 0; i < this.nbInputs; i++) {\n for (let j = 0; j < this.inputBuffers[i].length; j++) {\n this.inputBuffers[i][j].copyWithin(0, WEBAUDIO_BLOCK_SIZE);\n }\n }\n }\n\n private shiftOutputBuffers() {\n for (let i = 0; i < this.nbOutputs; i++) {\n for (let j = 0; j < this.outputBuffers[i].length; j++) {\n this.outputBuffers[i][j].copyWithin(0, WEBAUDIO_BLOCK_SIZE);\n this.outputBuffers[i][j].fill(0, this.blockSize - WEBAUDIO_BLOCK_SIZE);\n }\n }\n }\n\n private prepareInputBuffersToSend() {\n for (let i = 0; i < this.nbInputs; i++) {\n for (let j = 0; j < this.inputBuffers[i].length; j++) {\n this.inputBuffersToSend[i][j].set(this.inputBuffersHead[i][j]);\n }\n }\n }\n\n private handleOutputBuffersToRetrieve() {\n for (let i = 0; i < this.nbOutputs; i++) {\n for (let j = 0; j < this.outputBuffers[i].length; j++) {\n for (let k = 0; k < this.blockSize; k++) {\n this.outputBuffers[i][j][k] += this.outputBuffersToRetrieve[i][j][k] / this.nbOverlaps;\n }\n }\n }\n }\n\n process(inputs: Float32Array[][], outputs: Float32Array[][], parameters: AudioParamMap): boolean {\n this.reallocateChannelsIfNeeded(inputs, outputs);\n\n this.readInputs(inputs);\n this.shiftInputBuffers();\n this.prepareInputBuffersToSend();\n this.processOLA(this.inputBuffersToSend, this.outputBuffersToRetrieve, parameters);\n this.handleOutputBuffersToRetrieve();\n this.writeOutputs(outputs);\n this.shiftOutputBuffers();\n\n return true;\n }\n\n abstract processOLA(inputs: Float32Array[][], outputs: Float32Array[][], parameters: AudioParamMap): void;\n}\n","'use strict';\n\nfunction FFT(size) {\n this.size = size | 0;\n if (this.size <= 1 || (this.size & (this.size - 1)) !== 0)\n throw new Error('FFT size must be a power of two and bigger than 1');\n\n this._csize = size << 1;\n\n // NOTE: Use of `var` is intentional for old V8 versions\n var table = new Array(this.size * 2);\n for (var i = 0; i < table.length; i += 2) {\n const angle = Math.PI * i / this.size;\n table[i] = Math.cos(angle);\n table[i + 1] = -Math.sin(angle);\n }\n this.table = table;\n\n // Find size's power of two\n var power = 0;\n for (var t = 1; this.size > t; t <<= 1)\n power++;\n\n // Calculate initial step's width:\n // * If we are full radix-4 - it is 2x smaller to give inital len=8\n // * Otherwise it is the same as `power` to give len=4\n this._width = power % 2 === 0 ? power - 1 : power;\n\n // Pre-compute bit-reversal patterns\n this._bitrev = new Array(1 << this._width);\n for (var j = 0; j < this._bitrev.length; j++) {\n this._bitrev[j] = 0;\n for (var shift = 0; shift < this._width; shift += 2) {\n var revShift = this._width - shift - 2;\n this._bitrev[j] |= ((j >>> shift) & 3) << revShift;\n }\n }\n\n this._out = null;\n this._data = null;\n this._inv = 0;\n}\nmodule.exports = FFT;\n\nFFT.prototype.fromComplexArray = function fromComplexArray(complex, storage) {\n var res = storage || new Array(complex.length >>> 1);\n for (var i = 0; i < complex.length; i += 2)\n res[i >>> 1] = complex[i];\n return res;\n};\n\nFFT.prototype.createComplexArray = function createComplexArray() {\n const res = new Array(this._csize);\n for (var i = 0; i < res.length; i++)\n res[i] = 0;\n return res;\n};\n\nFFT.prototype.toComplexArray = function toComplexArray(input, storage) {\n var res = storage || this.createComplexArray();\n for (var i = 0; i < res.length; i += 2) {\n res[i] = input[i >>> 1];\n res[i + 1] = 0;\n }\n return res;\n};\n\nFFT.prototype.completeSpectrum = function completeSpectrum(spectrum) {\n var size = this._csize;\n var half = size >>> 1;\n for (var i = 2; i < half; i += 2) {\n spectrum[size - i] = spectrum[i];\n spectrum[size - i + 1] = -spectrum[i + 1];\n }\n};\n\nFFT.prototype.transform = function transform(out, data) {\n if (out === data)\n throw new Error('Input and output buffers must be different');\n\n this._out = out;\n this._data = data;\n this._inv = 0;\n this._transform4();\n this._out = null;\n this._data = null;\n};\n\nFFT.prototype.realTransform = function realTransform(out, data) {\n if (out === data)\n throw new Error('Input and output buffers must be different');\n\n this._out = out;\n this._data = data;\n this._inv = 0;\n this._realTransform4();\n this._out = null;\n this._data = null;\n};\n\nFFT.prototype.inverseTransform = function inverseTransform(out, data) {\n if (out === data)\n throw new Error('Input and output buffers must be different');\n\n this._out = out;\n this._data = data;\n this._inv = 1;\n this._transform4();\n for (var i = 0; i < out.length; i++)\n out[i] /= this.size;\n this._out = null;\n this._data = null;\n};\n\n// radix-4 implementation\n//\n// NOTE: Uses of `var` are intentional for older V8 version that do not\n// support both `let compound assignments` and `const phi`\nFFT.prototype._transform4 = function _transform4() {\n var out = this._out;\n var size = this._csize;\n\n // Initial step (permute and transform)\n var width = this._width;\n var step = 1 << width;\n var len = (size / step) << 1;\n\n var outOff;\n var t;\n var bitrev = this._bitrev;\n if (len === 4) {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform2(outOff, off, step);\n }\n } else {\n // len === 8\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleTransform4(outOff, off, step);\n }\n }\n\n // Loop through steps in decreasing order\n var inv = this._inv ? -1 : 1;\n var table = this.table;\n for (step >>= 2; step >= 2; step >>= 2) {\n len = (size / step) << 1;\n var quarterLen = len >>> 2;\n\n // Loop through offsets in the data\n for (outOff = 0; outOff < size; outOff += len) {\n // Full case\n var limit = outOff + quarterLen;\n for (var i = outOff, k = 0; i < limit; i += 2, k += step) {\n const A = i;\n const B = A + quarterLen;\n const C = B + quarterLen;\n const D = C + quarterLen;\n\n // Original values\n const Ar = out[A];\n const Ai = out[A + 1];\n const Br = out[B];\n const Bi = out[B + 1];\n const Cr = out[C];\n const Ci = out[C + 1];\n const Dr = out[D];\n const Di = out[D + 1];\n\n // Middle values\n const MAr = Ar;\n const MAi = Ai;\n\n const tableBr = table[k];\n const tableBi = inv * table[k + 1];\n const MBr = Br * tableBr - Bi * tableBi;\n const MBi = Br * tableBi + Bi * tableBr;\n\n const tableCr = table[2 * k];\n const tableCi = inv * table[2 * k + 1];\n const MCr = Cr * tableCr - Ci * tableCi;\n const MCi = Cr * tableCi + Ci * tableCr;\n\n const tableDr = table[3 * k];\n const tableDi = inv * table[3 * k + 1];\n const MDr = Dr * tableDr - Di * tableDi;\n const MDi = Dr * tableDi + Di * tableDr;\n\n // Pre-Final values\n const T0r = MAr + MCr;\n const T0i = MAi + MCi;\n const T1r = MAr - MCr;\n const T1i = MAi - MCi;\n const T2r = MBr + MDr;\n const T2i = MBi + MDi;\n const T3r = inv * (MBr - MDr);\n const T3i = inv * (MBi - MDi);\n\n // Final values\n const FAr = T0r + T2r;\n const FAi = T0i + T2i;\n\n const FCr = T0r - T2r;\n const FCi = T0i - T2i;\n\n const FBr = T1r + T3i;\n const FBi = T1i - T3r;\n\n const FDr = T1r - T3i;\n const FDi = T1i + T3r;\n\n out[A] = FAr;\n out[A + 1] = FAi;\n out[B] = FBr;\n out[B + 1] = FBi;\n out[C] = FCr;\n out[C + 1] = FCi;\n out[D] = FDr;\n out[D + 1] = FDi;\n }\n }\n }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT.prototype._singleTransform2 = function _singleTransform2(outOff, off,\n step) {\n const out = this._out;\n const data = this._data;\n\n const evenR = data[off];\n const evenI = data[off + 1];\n const oddR = data[off + step];\n const oddI = data[off + step + 1];\n\n const leftR = evenR + oddR;\n const leftI = evenI + oddI;\n const rightR = evenR - oddR;\n const rightI = evenI - oddI;\n\n out[outOff] = leftR;\n out[outOff + 1] = leftI;\n out[outOff + 2] = rightR;\n out[outOff + 3] = rightI;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT.prototype._singleTransform4 = function _singleTransform4(outOff, off,\n step) {\n const out = this._out;\n const data = this._data;\n const inv = this._inv ? -1 : 1;\n const step2 = step * 2;\n const step3 = step * 3;\n\n // Original values\n const Ar = data[off];\n const Ai = data[off + 1];\n const Br = data[off + step];\n const Bi = data[off + step + 1];\n const Cr = data[off + step2];\n const Ci = data[off + step2 + 1];\n const Dr = data[off + step3];\n const Di = data[off + step3 + 1];\n\n // Pre-Final values\n const T0r = Ar + Cr;\n const T0i = Ai + Ci;\n const T1r = Ar - Cr;\n const T1i = Ai - Ci;\n const T2r = Br + Dr;\n const T2i = Bi + Di;\n const T3r = inv * (Br - Dr);\n const T3i = inv * (Bi - Di);\n\n // Final values\n const FAr = T0r + T2r;\n const FAi = T0i + T2i;\n\n const FBr = T1r + T3i;\n const FBi = T1i - T3r;\n\n const FCr = T0r - T2r;\n const FCi = T0i - T2i;\n\n const FDr = T1r - T3i;\n const FDi = T1i + T3r;\n\n out[outOff] = FAr;\n out[outOff + 1] = FAi;\n out[outOff + 2] = FBr;\n out[outOff + 3] = FBi;\n out[outOff + 4] = FCr;\n out[outOff + 5] = FCi;\n out[outOff + 6] = FDr;\n out[outOff + 7] = FDi;\n};\n\n// Real input radix-4 implementation\nFFT.prototype._realTransform4 = function _realTransform4() {\n var out = this._out;\n var size = this._csize;\n\n // Initial step (permute and transform)\n var width = this._width;\n var step = 1 << width;\n var len = (size / step) << 1;\n\n var outOff;\n var t;\n var bitrev = this._bitrev;\n if (len === 4) {\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleRealTransform2(outOff, off >>> 1, step >>> 1);\n }\n } else {\n // len === 8\n for (outOff = 0, t = 0; outOff < size; outOff += len, t++) {\n const off = bitrev[t];\n this._singleRealTransform4(outOff, off >>> 1, step >>> 1);\n }\n }\n\n // Loop through steps in decreasing order\n var inv = this._inv ? -1 : 1;\n var table = this.table;\n for (step >>= 2; step >= 2; step >>= 2) {\n len = (size / step) << 1;\n var halfLen = len >>> 1;\n var quarterLen = halfLen >>> 1;\n var hquarterLen = quarterLen >>> 1;\n\n // Loop through offsets in the data\n for (outOff = 0; outOff < size; outOff += len) {\n for (var i = 0, k = 0; i <= hquarterLen; i += 2, k += step) {\n var A = outOff + i;\n var B = A + quarterLen;\n var C = B + quarterLen;\n var D = C + quarterLen;\n\n // Original values\n var Ar = out[A];\n var Ai = out[A + 1];\n var Br = out[B];\n var Bi = out[B + 1];\n var Cr = out[C];\n var Ci = out[C + 1];\n var Dr = out[D];\n var Di = out[D + 1];\n\n // Middle values\n var MAr = Ar;\n var MAi = Ai;\n\n var tableBr = table[k];\n var tableBi = inv * table[k + 1];\n var MBr = Br * tableBr - Bi * tableBi;\n var MBi = Br * tableBi + Bi * tableBr;\n\n var tableCr = table[2 * k];\n var tableCi = inv * table[2 * k + 1];\n var MCr = Cr * tableCr - Ci * tableCi;\n var MCi = Cr * tableCi + Ci * tableCr;\n\n var tableDr = table[3 * k];\n var tableDi = inv * table[3 * k + 1];\n var MDr = Dr * tableDr - Di * tableDi;\n var MDi = Dr * tableDi + Di * tableDr;\n\n // Pre-Final values\n var T0r = MAr + MCr;\n var T0i = MAi + MCi;\n var T1r = MAr - MCr;\n var T1i = MAi - MCi;\n var T2r = MBr + MDr;\n var T2i = MBi + MDi;\n var T3r = inv * (MBr - MDr);\n var T3i = inv * (MBi - MDi);\n\n // Final values\n var FAr = T0r + T2r;\n var FAi = T0i + T2i;\n\n var FBr = T1r + T3i;\n var FBi = T1i - T3r;\n\n out[A] = FAr;\n out[A + 1] = FAi;\n out[B] = FBr;\n out[B + 1] = FBi;\n\n // Output final middle point\n if (i === 0) {\n var FCr = T0r - T2r;\n var FCi = T0i - T2i;\n out[C] = FCr;\n out[C + 1] = FCi;\n continue;\n }\n\n // Do not overwrite ourselves\n if (i === hquarterLen)\n continue;\n\n // In the flipped case:\n // MAi = -MAi\n // MBr=-MBi, MBi=-MBr\n // MCr=-MCr\n // MDr=MDi, MDi=MDr\n var ST0r = T1r;\n var ST0i = -T1i;\n var ST1r = T0r;\n var ST1i = -T0i;\n var ST2r = -inv * T3i;\n var ST2i = -inv * T3r;\n var ST3r = -inv * T2i;\n var ST3i = -inv * T2r;\n\n var SFAr = ST0r + ST2r;\n var SFAi = ST0i + ST2i;\n\n var SFBr = ST1r + ST3i;\n var SFBi = ST1i - ST3r;\n\n var SA = outOff + quarterLen - i;\n var SB = outOff + halfLen - i;\n\n out[SA] = SFAr;\n out[SA + 1] = SFAi;\n out[SB] = SFBr;\n out[SB + 1] = SFBi;\n }\n }\n }\n};\n\n// radix-2 implementation\n//\n// NOTE: Only called for len=4\nFFT.prototype._singleRealTransform2 = function _singleRealTransform2(outOff,\n off,\n step) {\n const out = this._out;\n const data = this._data;\n\n const evenR = data[off];\n const oddR = data[off + step];\n\n const leftR = evenR + oddR;\n const rightR = evenR - oddR;\n\n out[outOff] = leftR;\n out[outOff + 1] = 0;\n out[outOff + 2] = rightR;\n out[outOff + 3] = 0;\n};\n\n// radix-4\n//\n// NOTE: Only called for len=8\nFFT.prototype._singleRealTransform4 = function _singleRealTransform4(outOff,\n off,\n step) {\n const out = this._out;\n const data = this._data;\n const inv = this._inv ? -1 : 1;\n const step2 = step * 2;\n const step3 = step * 3;\n\n // Original values\n const Ar = data[off];\n const Br = data[off + step];\n const Cr = data[off + step2];\n const Dr = data[off + step3];\n\n // Pre-Final values\n const T0r = Ar + Cr;\n const T1r = Ar - Cr;\n const T2r = Br + Dr;\n const T3r = inv * (Br - Dr);\n\n // Final values\n const FAr = T0r + T2r;\n\n const FBr = T1r;\n const FBi = -T3r;\n\n const FCr = T0r - T2r;\n\n const FDr = T1r;\n const FDi = T3r;\n\n out[outOff] = FAr;\n out[outOff + 1] = 0;\n out[outOff + 2] = FBr;\n out[outOff + 3] = FBi;\n out[outOff + 4] = FCr;\n out[outOff + 5] = 0;\n out[outOff + 6] = FDr;\n out[outOff + 7] = FDi;\n};\n","\"use strict\";\n\nimport OLAProcessor from './ola';\nimport FFT from 'fft.js';\n\nconst BUFFERED_BLOCK_SIZE = 2048;\n\nfunction genHannWindow(length: number): Float32Array {\n let win = new Float32Array(length);\n for (let i = 0; i < length; i++) {\n win[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / length));\n }\n return win;\n}\n\ninterface PhaseVocoderNodeOptions extends AudioWorkletNodeOptions {\n processorOptions: {\n blockSize: number;\n };\n}\n\nexport default class PhaseVocoderProcessor extends OLAProcessor {\n fftSize: number;\n timeCursor: number;\n hannWindow: Float32Array;\n fft: FFT;\n freqComplexBuffer: any;\n freqComplexBufferShifted: any;\n timeComplexBuffer: any;\n magnitudes: Float32Array;\n peakIndexes: Int32Array;\n nbPeaks: number;\n\n static get parameterDescriptors() {\n return [{\n name: 'pitchFactor',\n defaultValue: 1.0\n }];\n }\n\n constructor(options: PhaseVocoderNodeOptions) {\n options.processorOptions = {\n blockSize: BUFFERED_BLOCK_SIZE,\n };\n super(options);\n\n this.fftSize = this.blockSize;\n this.timeCursor = 0;\n\n this.hannWindow = genHannWindow(this.blockSize);\n\n // prepare FFT and pre-allocate buffers\n this.fft = new FFT(this.fftSize);\n this.freqComplexBuffer = this.fft.createComplexArray() as Float32Array[];\n this.freqComplexBufferShifted = this.fft.createComplexArray() as Float32Array[];\n this.timeComplexBuffer = this.fft.createComplexArray();\n this.magnitudes = new Float32Array(this.fftSize / 2 + 1);\n this.peakIndexes = new Int32Array(this.magnitudes.length);\n this.nbPeaks = 0;\n }\n\n processOLA(inputs: Float32Array[][], outputs: Float32Array[][], parameters: AudioParamMap) {\n //@ts-ignore\n const pitchFactor = parameters.get('pitchFactor')[parameters.get(\"pitchFactor\").length - 1];\n\n for (let i = 0; i < this.nbInputs; i++) {\n for (let j = 0; j < inputs[i].length; j++) {\n var input = inputs[i][j];\n var output = outputs[i][j];\n\n this.applyHannWindow(input);\n\n this.fft.realTransform(this.freqComplexBuffer, input);\n\n this.computeMagnitudes();\n this.findPeaks();\n this.shiftPeaks(pitchFactor);\n\n this.fft.completeSpectrum(this.freqComplexBufferShifted);\n this.fft.inverseTransform(this.timeComplexBuffer, this.freqComplexBufferShifted);\n this.fft.fromComplexArray(this.timeComplexBuffer, output);\n\n this.applyHannWindow(output);\n }\n }\n\n this.timeCursor += this.hopSize;\n return true;\n }\n\n private applyHannWindow(input: Float32Array) {\n for (let i = 0; i < this.blockSize; i++) {\n input[i] *= this.hannWindow[i];\n }\n }\n\n private computeMagnitudes() {\n for (let i = 0, j = 0; i < this.magnitudes.length; i++, j += 2) {\n const real = this.freqComplexBuffer[j];\n const imag = this.freqComplexBuffer[j + 1];\n this.magnitudes[i] = real ** 2 + imag ** 2;\n }\n }\n\n private findPeaks() {\n this.nbPeaks = 0;\n for (let i = 2, end = this.magnitudes.length - 2; i < end; i++) {\n const mag = this.magnitudes[i];\n\n if (this.magnitudes[i - 1] >= mag || this.magnitudes[i - 2] >= mag || this.magnitudes[i + 1] >= mag || this.magnitudes[i + 2] >= mag) {\n continue;\n }\n\n this.peakIndexes[this.nbPeaks++] = i;\n }\n }\n\n private shiftPeaks(pitchFactor: number) {\n this.freqComplexBufferShifted.fill(0);\n\n for (let i = 0; i < this.nbPeaks; i++) {\n const peakIndex = this.peakIndexes[i];\n const peakIndexShifted = Math.round(peakIndex * pitchFactor);\n\n if (peakIndexShifted > this.magnitudes.length) {\n break;\n }\n\n let startIndex = (i > 0) ? peakIndex - Math.floor((peakIndex - this.peakIndexes[i - 1]) / 2) : 0;\n let endIndex = (i < this.nbPeaks - 1) ? peakIndex + Math.ceil((this.peakIndexes[i + 1] - peakIndex) / 2) : this.fftSize;\n\n for (let j = startIndex - peakIndex; j < endIndex - peakIndex; j++) {\n const binIndex = peakIndex + j;\n const binIndexShifted = peakIndexShifted + j;\n\n if (binIndexShifted >= this.magnitudes.length) {\n break;\n }\n\n const omegaDelta = 2 * Math.PI * (binIndexShifted - binIndex) / this.fftSize;\n const phaseShiftReal = Math.cos(omegaDelta * this.timeCursor);\n const phaseShiftImag = Math.sin(omegaDelta * this.timeCursor);\n\n const indexReal = binIndex * 2;\n const indexImag = indexReal + 1;\n const valueReal = this.freqComplexBuffer[indexReal];\n const valueImag = this.freqComplexBuffer[indexImag];\n\n const valueShiftedReal = valueReal * phaseShiftReal - valueImag * phaseShiftImag;\n const valueShiftedImag = valueReal * phaseShiftImag + valueImag * phaseShiftReal;\n\n const indexShiftedReal = binIndexShifted * 2;\n const indexShiftedImag = indexShiftedReal + 1;\n this.freqComplexBufferShifted[indexShiftedReal] += valueShiftedReal;\n this.freqComplexBufferShifted[indexShiftedImag] += valueShiftedImag;\n }\n }\n }\n}\n\n// @ts-ignore\nregisterProcessor(\"phase-vocoder-processor\", PhaseVocoderProcessor);\n"],"names":["OLAProcessor","options","i","inputIndex","nbChannels","outputIndex","inputs","outputs","j","webAudioBlock","k","parameters","FFT","size","table","angle","power","t","shift","revShift","fft","complex","storage","res","input","spectrum","half","out","data","width","step","len","outOff","bitrev","off","inv","quarterLen","limit","A","B","C","D","Ar","Ai","Br","Bi","Cr","Ci","Dr","Di","MAr","MAi","tableBr","tableBi","MBr","MBi","tableCr","tableCi","MCr","MCi","tableDr","tableDi","MDr","MDi","T0r","T0i","T1r","T1i","T2r","T2i","T3r","T3i","FAr","FAi","FCr","FCi","FBr","FBi","FDr","FDi","evenR","evenI","oddR","oddI","leftR","leftI","rightR","rightI","step2","step3","halfLen","hquarterLen","ST0r","ST0i","ST1r","ST1i","ST2r","ST2i","ST3r","ST3i","SFAr","SFAi","SFBr","SFBi","SA","SB","BUFFERED_BLOCK_SIZE","genHannWindow","length","win","PhaseVocoderProcessor","pitchFactor","output","real","imag","end","mag","peakIndex","peakIndexShifted","startIndex","endIndex","binIndex","binIndexShifted","omegaDelta","phaseShiftReal","phaseShiftImag","indexReal","indexImag","valueReal","valueImag","valueShiftedReal","valueShiftedImag","indexShiftedReal","indexShiftedImag"],"mappings":"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","x_google_ignoreList":[1]}
|
package/dist/cacophony.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("standardized-audio-context");class f{static pendingRequests=new Map;static async openCache(){try{return await caches.open("audio-cache")}catch(e){throw console.error("Failed to open cache:",e),e}}static async getAudioBufferFromCache(e,t,i){try{const n=await t.match(e);if(n){const s=await n.arrayBuffer();return i.decodeAudioData(s)}return null}catch(n){throw console.error("Failed to get audio data from cache:",n),n}}static async fetchAndCacheAudioBuffer(e,t,i){try{const n=await fetch(e),s=n.clone();t.put(e,s);const a=await n.arrayBuffer();return i.decodeAudioData(a)}catch(n){throw console.error("Failed to fetch and cache audio data:",n),n}}static async getAudioBuffer(e,t){const i=await this.openCache();let n=this.pendingRequests.get(e);if(n)return n;const s=await this.getAudioBufferFromCache(e,i,t);return s||(n=this.fetchAndCacheAudioBuffer(e,i,t),this.pendingRequests.set(e,n),n)}}const y=(o,e)=>{var t=new Uint8Array(o.byteLength+e.byteLength);return t.set(new Uint8Array(o),0),t.set(new Uint8Array(e),o.byteLength),t.buffer};function G(o,e){const t=[];let i=0;fetch(o).then(function(s){if(!s.ok)throw new Error("HTTP error, status = "+s.status);if(!s.body)throw new Error("Missing body");var a=s.body.getReader();let h=new ArrayBuffer(0);function c(){return a.read().then(({value:r,done:Z})=>{let g=null;if(r){if(h.byteLength?g=y(h,r.buffer):(h=r.buffer.slice(0,44),g=r.buffer),e.decodeAudioData(g,function(C){t.push(C),t.length&&n()},function(C){console.log("err(decodeAudioData): "+C)}),Z){console.log("done");return}c()}})}c()});function n(){for(;t.length;){let s=t.shift();const a=e.createBufferSource();if(!s)return;a.buffer=s,a.connect(e.destination),i==0&&(i=e.currentTime+.02),a.start(i),i+=a.buffer.duration}}}const w="data:video/mp2t;base64,InVzZSBzdHJpY3QiOwoKaW1wb3J0IE9MQVByb2Nlc3NvciBmcm9tICcuL29sYSc7CmltcG9ydCBGRlQgZnJvbSAnZmZ0LmpzJzsKCmNvbnN0IEJVRkZFUkVEX0JMT0NLX1NJWkUgPSAyMDQ4OwoKZnVuY3Rpb24gZ2VuSGFubldpbmRvdyhsZW5ndGg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7CiAgICBsZXQgd2luID0gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHdpbltpXSA9IDAuNSAqICgxIC0gTWF0aC5jb3MoMiAqIE1hdGguUEkgKiBpIC8gbGVuZ3RoKSk7CiAgICB9CiAgICByZXR1cm4gd2luOwp9CgppbnRlcmZhY2UgUGhhc2VWb2NvZGVyTm9kZU9wdGlvbnMgZXh0ZW5kcyBBdWRpb1dvcmtsZXROb2RlT3B0aW9ucyB7CiAgICBwcm9jZXNzb3JPcHRpb25zOiB7CiAgICAgICAgYmxvY2tTaXplOiBudW1iZXI7CiAgICB9Owp9CgpleHBvcnQgZGVmYXVsdCBjbGFzcyBQaGFzZVZvY29kZXJQcm9jZXNzb3IgZXh0ZW5kcyBPTEFQcm9jZXNzb3IgewogICAgZmZ0U2l6ZTogbnVtYmVyOwogICAgdGltZUN1cnNvcjogbnVtYmVyOwogICAgaGFubldpbmRvdzogRmxvYXQzMkFycmF5OwogICAgZmZ0OiBGRlQ7CiAgICBmcmVxQ29tcGxleEJ1ZmZlcjogYW55OwogICAgZnJlcUNvbXBsZXhCdWZmZXJTaGlmdGVkOiBhbnk7CiAgICB0aW1lQ29tcGxleEJ1ZmZlcjogYW55OwogICAgbWFnbml0dWRlczogRmxvYXQzMkFycmF5OwogICAgcGVha0luZGV4ZXM6IEludDMyQXJyYXk7CiAgICBuYlBlYWtzOiBudW1iZXI7CgogICAgc3RhdGljIGdldCBwYXJhbWV0ZXJEZXNjcmlwdG9ycygpIHsKICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgbmFtZTogJ3BpdGNoRmFjdG9yJywKICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAxLjAKICAgICAgICB9XTsKICAgIH0KCiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQaGFzZVZvY29kZXJOb2RlT3B0aW9ucykgewogICAgICAgIG9wdGlvbnMucHJvY2Vzc29yT3B0aW9ucyA9IHsKICAgICAgICAgICAgYmxvY2tTaXplOiBCVUZGRVJFRF9CTE9DS19TSVpFLAogICAgICAgIH07CiAgICAgICAgc3VwZXIob3B0aW9ucyk7CgogICAgICAgIHRoaXMuZmZ0U2l6ZSA9IHRoaXMuYmxvY2tTaXplOwogICAgICAgIHRoaXMudGltZUN1cnNvciA9IDA7CgogICAgICAgIHRoaXMuaGFubldpbmRvdyA9IGdlbkhhbm5XaW5kb3codGhpcy5ibG9ja1NpemUpOwoKICAgICAgICAvLyBwcmVwYXJlIEZGVCBhbmQgcHJlLWFsbG9jYXRlIGJ1ZmZlcnMKICAgICAgICB0aGlzLmZmdCA9IG5ldyBGRlQodGhpcy5mZnRTaXplKTsKICAgICAgICB0aGlzLmZyZXFDb21wbGV4QnVmZmVyID0gdGhpcy5mZnQuY3JlYXRlQ29tcGxleEFycmF5KCkgYXMgRmxvYXQzMkFycmF5W107CiAgICAgICAgdGhpcy5mcmVxQ29tcGxleEJ1ZmZlclNoaWZ0ZWQgPSB0aGlzLmZmdC5jcmVhdGVDb21wbGV4QXJyYXkoKSBhcyBGbG9hdDMyQXJyYXlbXTsKICAgICAgICB0aGlzLnRpbWVDb21wbGV4QnVmZmVyID0gdGhpcy5mZnQuY3JlYXRlQ29tcGxleEFycmF5KCk7CiAgICAgICAgdGhpcy5tYWduaXR1ZGVzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmZmdFNpemUgLyAyICsgMSk7CiAgICAgICAgdGhpcy5wZWFrSW5kZXhlcyA9IG5ldyBJbnQzMkFycmF5KHRoaXMubWFnbml0dWRlcy5sZW5ndGgpOwogICAgICAgIHRoaXMubmJQZWFrcyA9IDA7CiAgICB9CgogICAgcHJvY2Vzc09MQShpbnB1dHM6IEZsb2F0MzJBcnJheVtdW10sIG91dHB1dHM6IEZsb2F0MzJBcnJheVtdW10sIHBhcmFtZXRlcnM6IEF1ZGlvUGFyYW1NYXApIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBjb25zdCBwaXRjaEZhY3RvciA9IHBhcmFtZXRlcnMuZ2V0KCdwaXRjaEZhY3RvcicpW3BhcmFtZXRlcnMuZ2V0KCJwaXRjaEZhY3RvciIpLmxlbmd0aCAtIDFdOwoKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmJJbnB1dHM7IGkrKykgewogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlucHV0c1tpXS5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gaW5wdXRzW2ldW2pdOwogICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IG91dHB1dHNbaV1bal07CgogICAgICAgICAgICAgICAgdGhpcy5hcHBseUhhbm5XaW5kb3coaW5wdXQpOwoKICAgICAgICAgICAgICAgIHRoaXMuZmZ0LnJlYWxUcmFuc2Zvcm0odGhpcy5mcmVxQ29tcGxleEJ1ZmZlciwgaW5wdXQpOwoKICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZU1hZ25pdHVkZXMoKTsKICAgICAgICAgICAgICAgIHRoaXMuZmluZFBlYWtzKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0UGVha3MocGl0Y2hGYWN0b3IpOwoKICAgICAgICAgICAgICAgIHRoaXMuZmZ0LmNvbXBsZXRlU3BlY3RydW0odGhpcy5mcmVxQ29tcGxleEJ1ZmZlclNoaWZ0ZWQpOwogICAgICAgICAgICAgICAgdGhpcy5mZnQuaW52ZXJzZVRyYW5zZm9ybSh0aGlzLnRpbWVDb21wbGV4QnVmZmVyLCB0aGlzLmZyZXFDb21wbGV4QnVmZmVyU2hpZnRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLmZmdC5mcm9tQ29tcGxleEFycmF5KHRoaXMudGltZUNvbXBsZXhCdWZmZXIsIG91dHB1dCk7CgogICAgICAgICAgICAgICAgdGhpcy5hcHBseUhhbm5XaW5kb3cob3V0cHV0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy50aW1lQ3Vyc29yICs9IHRoaXMuaG9wU2l6ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwcml2YXRlIGFwcGx5SGFubldpbmRvdyhpbnB1dDogRmxvYXQzMkFycmF5KSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGlucHV0W2ldICo9IHRoaXMuaGFubldpbmRvd1tpXTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBjb21wdXRlTWFnbml0dWRlcygpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB0aGlzLm1hZ25pdHVkZXMubGVuZ3RoOyBpKyssIGogKz0gMikgewogICAgICAgICAgICBjb25zdCByZWFsID0gdGhpcy5mcmVxQ29tcGxleEJ1ZmZlcltqXTsKICAgICAgICAgICAgY29uc3QgaW1hZyA9IHRoaXMuZnJlcUNvbXBsZXhCdWZmZXJbaiArIDFdOwogICAgICAgICAgICB0aGlzLm1hZ25pdHVkZXNbaV0gPSByZWFsICoqIDIgKyBpbWFnICoqIDI7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgZmluZFBlYWtzKCkgewogICAgICAgIHRoaXMubmJQZWFrcyA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDIsIGVuZCA9IHRoaXMubWFnbml0dWRlcy5sZW5ndGggLSAyOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgbWFnID0gdGhpcy5tYWduaXR1ZGVzW2ldOwoKICAgICAgICAgICAgaWYgKHRoaXMubWFnbml0dWRlc1tpIC0gMV0gPj0gbWFnIHx8IHRoaXMubWFnbml0dWRlc1tpIC0gMl0gPj0gbWFnIHx8IHRoaXMubWFnbml0dWRlc1tpICsgMV0gPj0gbWFnIHx8IHRoaXMubWFnbml0dWRlc1tpICsgMl0gPj0gbWFnKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5wZWFrSW5kZXhlc1t0aGlzLm5iUGVha3MrK10gPSBpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHNoaWZ0UGVha3MocGl0Y2hGYWN0b3I6IG51bWJlcikgewogICAgICAgIHRoaXMuZnJlcUNvbXBsZXhCdWZmZXJTaGlmdGVkLmZpbGwoMCk7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uYlBlYWtzOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcGVha0luZGV4ID0gdGhpcy5wZWFrSW5kZXhlc1tpXTsKICAgICAgICAgICAgY29uc3QgcGVha0luZGV4U2hpZnRlZCA9IE1hdGgucm91bmQocGVha0luZGV4ICogcGl0Y2hGYWN0b3IpOwoKICAgICAgICAgICAgaWYgKHBlYWtJbmRleFNoaWZ0ZWQgPiB0aGlzLm1hZ25pdHVkZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAoaSA+IDApID8gcGVha0luZGV4IC0gTWF0aC5mbG9vcigocGVha0luZGV4IC0gdGhpcy5wZWFrSW5kZXhlc1tpIC0gMV0pIC8gMikgOiAwOwogICAgICAgICAgICBsZXQgZW5kSW5kZXggPSAoaSA8IHRoaXMubmJQZWFrcyAtIDEpID8gcGVha0luZGV4ICsgTWF0aC5jZWlsKCh0aGlzLnBlYWtJbmRleGVzW2kgKyAxXSAtIHBlYWtJbmRleCkgLyAyKSA6IHRoaXMuZmZ0U2l6ZTsKCiAgICAgICAgICAgIGZvciAobGV0IGogPSBzdGFydEluZGV4IC0gcGVha0luZGV4OyBqIDwgZW5kSW5kZXggLSBwZWFrSW5kZXg7IGorKykgewogICAgICAgICAgICAgICAgY29uc3QgYmluSW5kZXggPSBwZWFrSW5kZXggKyBqOwogICAgICAgICAgICAgICAgY29uc3QgYmluSW5kZXhTaGlmdGVkID0gcGVha0luZGV4U2hpZnRlZCArIGo7CgogICAgICAgICAgICAgICAgaWYgKGJpbkluZGV4U2hpZnRlZCA+PSB0aGlzLm1hZ25pdHVkZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY29uc3Qgb21lZ2FEZWx0YSA9IDIgKiBNYXRoLlBJICogKGJpbkluZGV4U2hpZnRlZCAtIGJpbkluZGV4KSAvIHRoaXMuZmZ0U2l6ZTsKICAgICAgICAgICAgICAgIGNvbnN0IHBoYXNlU2hpZnRSZWFsID0gTWF0aC5jb3Mob21lZ2FEZWx0YSAqIHRoaXMudGltZUN1cnNvcik7CiAgICAgICAgICAgICAgICBjb25zdCBwaGFzZVNoaWZ0SW1hZyA9IE1hdGguc2luKG9tZWdhRGVsdGEgKiB0aGlzLnRpbWVDdXJzb3IpOwoKICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4UmVhbCA9IGJpbkluZGV4ICogMjsKICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4SW1hZyA9IGluZGV4UmVhbCArIDE7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVJlYWwgPSB0aGlzLmZyZXFDb21wbGV4QnVmZmVyW2luZGV4UmVhbF07CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUltYWcgPSB0aGlzLmZyZXFDb21wbGV4QnVmZmVyW2luZGV4SW1hZ107CgogICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTaGlmdGVkUmVhbCA9IHZhbHVlUmVhbCAqIHBoYXNlU2hpZnRSZWFsIC0gdmFsdWVJbWFnICogcGhhc2VTaGlmdEltYWc7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVNoaWZ0ZWRJbWFnID0gdmFsdWVSZWFsICogcGhhc2VTaGlmdEltYWcgKyB2YWx1ZUltYWcgKiBwaGFzZVNoaWZ0UmVhbDsKCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleFNoaWZ0ZWRSZWFsID0gYmluSW5kZXhTaGlmdGVkICogMjsKICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4U2hpZnRlZEltYWcgPSBpbmRleFNoaWZ0ZWRSZWFsICsgMTsKICAgICAgICAgICAgICAgIHRoaXMuZnJlcUNvbXBsZXhCdWZmZXJTaGlmdGVkW2luZGV4U2hpZnRlZFJlYWxdICs9IHZhbHVlU2hpZnRlZFJlYWw7CiAgICAgICAgICAgICAgICB0aGlzLmZyZXFDb21wbGV4QnVmZmVyU2hpZnRlZFtpbmRleFNoaWZ0ZWRJbWFnXSArPSB2YWx1ZVNoaWZ0ZWRJbWFnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyBAdHMtaWdub3JlCnJlZ2lzdGVyUHJvY2Vzc29yKCJwaGFzZS12b2NvZGVyLXByb2Nlc3NvciIsIFBoYXNlVm9jb2RlclByb2Nlc3Nvcik7Cg==";var d=(o=>(o.HTML="HTML",o.Streaming="Streaming",o.Buffer="Buffer",o))(d||{});class V{context;globalGainNode;listener;prevVolume=1;finalizationRegistry;constructor(e){this.context=e||new I.AudioContext,this.listener=this.context.listener,this.globalGainNode=this.context.createGain(),this.globalGainNode.connect(this.context.destination),this.finalizationRegistry=new FinalizationRegistry(t=>{t.cleanup()})}async loadWorklets(){this.context.audioWorklet?await W(this.context,"phase-vocoder",w):console.warn("AudioWorklet not supported")}async createSound(e,t="Buffer"){if(e instanceof AudioBuffer)return Promise.resolve(new l("",e,this.context,this.globalGainNode,"Buffer"));const i=e;if(t==="HTML"){const n=new Audio;return n.src=i,n.crossOrigin="anonymous",new l(i,void 0,this.context,this.globalGainNode,"HTML")}return f.getAudioBuffer(i,this.context).then(n=>new l(i,n,this.context,this.globalGainNode,t))}async createGroup(e){const t=new p;return e.forEach(i=>t.addSound(i)),t}async createGroupFromUrls(e){const t=new p;return(await Promise.all(e.map(n=>this.createSound(n)))).forEach(n=>t.addSound(n)),t}async createStream(e){return await G(e,this.context),new l(e,void 0,this.context,this.globalGainNode,"Streaming")}createBiquadFilter(e){const t=this.context.createBiquadFilter();return t.type=e,t}pause(){"suspend"in this.context&&this.context.suspend()}resume(){"resume"in this.context&&this.context.resume()}setGlobalVolume(e){this.globalGainNode.gain.value=e}get volume(){return this.globalGainNode.gain.value}set volume(e){if(this.muted){this.prevVolume=e;return}this.setGlobalVolume(e)}mute(){this.muted||(this.prevVolume=this.globalGainNode.gain.value,this.setGlobalVolume(0))}unmute(){this.muted&&this.setGlobalVolume(this.prevVolume)}get muted(){return this.globalGainNode.gain.value===0}set muted(e){e!==this.muted&&(e?this.mute():this.unmute())}getMicrophoneStream(){return new Promise((e,t)=>{navigator.mediaDevices.getUserMedia({audio:!0}).then(i=>{const n=new b(this.context);n.play(),e(n)}).catch(i=>{t(i)})})}get listenerOrientation(){return{forward:[this.listener.forwardX.value,this.listener.forwardY.value,this.listener.forwardZ.value],up:[this.listener.upX.value,this.listener.upY.value,this.listener.upZ.value]}}set listenerOrientation(e){const{forward:t,up:i}=e,[n,s,a]=t,[h,c,r]=i;this.listener.forwardX.setValueAtTime(n,this.context.currentTime),this.listener.forwardY.setValueAtTime(s,this.context.currentTime),this.listener.forwardZ.setValueAtTime(a,this.context.currentTime),this.listener.upX.setValueAtTime(h,this.context.currentTime),this.listener.upY.setValueAtTime(c,this.context.currentTime),this.listener.upZ.setValueAtTime(r,this.context.currentTime)}get listenerUpOrientation(){return[this.listener.upX.value,this.listener.upY.value,this.listener.upZ.value]}set listenerUpOrientation(e){const[t,i,n]=e;this.listener.upX.setValueAtTime(t,this.context.currentTime),this.listener.upY.setValueAtTime(i,this.context.currentTime),this.listener.upZ.setValueAtTime(n,this.context.currentTime)}get listenerForwardOrientation(){return[this.listener.forwardX.value,this.listener.forwardY.value,this.listener.forwardZ.value]}set listenerForwardOrientation(e){const[t,i,n]=e;this.listener.forwardX.setValueAtTime(t,this.context.currentTime),this.listener.forwardY.setValueAtTime(i,this.context.currentTime),this.listener.forwardZ.setValueAtTime(n,this.context.currentTime)}get listenerPosition(){return[this.listener.positionX.value,this.listener.positionY.value,this.listener.positionZ.value]}set listenerPosition(e){const[t,i,n]=e;this.listener.positionX.setValueAtTime(t,this.context.currentTime),this.listener.positionY.setValueAtTime(i,this.context.currentTime),this.listener.positionZ.setValueAtTime(n,this.context.currentTime)}}class u{filters=[];addFilter(e){this.filters.push(e)}removeFilter(e){this.filters=this.filters.filter(t=>t!==e)}applyFilters(e){return this.filters.reduce((t,i)=>(t.connect(i),i),e),this.filters.length>0?this.filters[this.filters.length-1]:e}}class l extends u{constructor(e,t,i,n,s="Buffer"){super(),this.url=e,this.type=s,this.buffer=t,this.context=i,this.globalGainNode=n,this._position=[0,0,0]}buffer;context;playbacks=[];globalGainNode;_position=[0,0,0];_threeDOptions={coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0,distanceModel:"inverse",maxDistance:1e4,channelCount:2,channelCountMode:"clamped-max",channelInterpretation:"speakers",panningModel:"HRTF",refDistance:1,rolloffFactor:1,positionX:0,positionY:0,positionZ:0,orientationX:0,orientationY:0,orientationZ:0};loopCount=0;_playbackRate=1;_volume=1;preplay(){let e;if(this.buffer)e=this.context.createBufferSource(),e.buffer=this.buffer;else{const n=new Audio;n.crossOrigin="anonymous",n.src=this.url,n.preload="auto",e=this.context.createMediaElementSource(n)}const t=this.context.createGain();t.connect(this.globalGainNode);const i=new A(e,t,this.context,this.loopCount);return i.volume=this.volume,i.playbackRate=this.playbackRate,this.filters.forEach(n=>i.addFilter(n)),i.threeDOptions=this.threeDOptions,i.position=this.position,this.playbacks.push(i),[i]}play(){const e=this.preplay();return e.forEach(t=>t.play()),e}stop(){this.playbacks.forEach(e=>e.stop())}pause(){"suspend"in this.context&&this.context.suspend()}resume(){"resume"in this.context&&this.context.resume()}seek(e){this.playbacks.forEach(t=>t.seek(e))}set position(e){this._threeDOptions.positionX=e[0],this._threeDOptions.positionY=e[1],this._threeDOptions.positionZ=e[2],this.playbacks.forEach(t=>t.position=e)}get position(){return[this._threeDOptions.positionX,this._threeDOptions.positionY,this._threeDOptions.positionZ]}get threeDOptions(){return this._threeDOptions}set threeDOptions(e){this._threeDOptions={...this._threeDOptions,...e},this.playbacks.forEach(t=>t.threeDOptions=this._threeDOptions)}loop(e){return e===void 0?this.loopCount:(this.loopCount=e,this.playbacks.forEach(t=>t.sourceLoop=!0),this.loopCount)}addFilter(e){super.addFilter(e),this.playbacks.forEach(t=>t.addFilter(e))}removeFilter(e){super.removeFilter(e),this.playbacks.forEach(t=>t.removeFilter(e))}get volume(){return this._volume}set volume(e){this._volume=e,this.playbacks.forEach(t=>t.volume=e)}isPlaying(){return this.playbacks.some(e=>e.isPlaying())}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this.playbacks.forEach(t=>t.playbackRate=e)}}class A extends u{context;source;gainNode;panner;loopCount=0;currentLoop=0;buffer;playing=!1;constructor(e,t,i,n=0){super(),this.loopCount=n,this.source=e,"buffer"in e&&e.buffer&&(this.buffer=e.buffer),"mediaElement"in e&&e.mediaElement?e.mediaElement.onended=this.handleLoop.bind(this):"onended"in e&&(e.onended=this.handleLoop.bind(this)),this.gainNode=t,this.context=i,this.panner=i.createPanner(),e.connect(this.panner),this.panner.connect(this.gainNode),this.refreshFilters()}get playbackRate(){if(!this.source)throw new Error("Cannot get playback rate of a sound that has been cleaned up");if("playbackRate"in this.source)return this.source.playbackRate.value;if("mediaElement"in this.source&&this.source.mediaElement)return this.source.mediaElement.playbackRate;throw new Error("Unsupported source type")}set playbackRate(e){if(!this.source)throw new Error("Cannot set playback rate of a sound that has been cleaned up");"playbackRate"in this.source&&(this.source.playbackRate.value=e),"mediaElement"in this.source&&this.source.mediaElement&&(this.source.mediaElement.playbackRate=e)}handleLoop(){this.buffer?(this.source=this.context.createBufferSource(),this.source.buffer=this.buffer):this.seek(0),this.loopCount==="infinite"||this.currentLoop<this.loopCount?(this.currentLoop++,this.playing&&this.play()):this.playing=!1}play(){if(!this.source)throw new Error("Cannot play a sound that has been cleaned up");return"mediaElement"in this.source&&this.source.mediaElement?this.source.mediaElement.play():"start"in this.source&&this.source.start&&this.source.start(),this.playing=!0,[this]}get threeDOptions(){if(!this.panner)throw new Error("Cannot get 3D options of a sound that has been cleaned up");return{coneInnerAngle:this.panner.coneInnerAngle,coneOuterAngle:this.panner.coneOuterAngle,coneOuterGain:this.panner.coneOuterGain,distanceModel:this.panner.distanceModel,maxDistance:this.panner.maxDistance,channelCount:this.panner.channelCount,channelCountMode:this.panner.channelCountMode,channelInterpretation:this.panner.channelInterpretation,panningModel:this.panner.panningModel,refDistance:this.panner.refDistance,rolloffFactor:this.panner.rolloffFactor,positionX:this.panner.positionX.value,positionY:this.panner.positionY.value,positionZ:this.panner.positionZ.value,orientationX:this.panner.orientationX.value,orientationY:this.panner.orientationY.value,orientationZ:this.panner.orientationZ.value}}set threeDOptions(e){if(!this.panner)throw new Error("Cannot set 3D options of a sound that has been cleaned up");this.panner.coneInnerAngle=e.coneInnerAngle||this.panner.coneInnerAngle,this.panner.coneOuterAngle=e.coneOuterAngle||this.panner.coneOuterAngle,this.panner.coneOuterGain=e.coneOuterGain||this.panner.coneOuterGain,this.panner.distanceModel=e.distanceModel||this.panner.distanceModel,this.panner.maxDistance=e.maxDistance||this.panner.maxDistance,this.panner.channelCount=e.channelCount||this.panner.channelCount,this.panner.channelCountMode=e.channelCountMode||this.panner.channelCountMode,this.panner.channelInterpretation=e.channelInterpretation||this.panner.channelInterpretation,this.panner.panningModel=e.panningModel||this.panner.panningModel,this.panner.refDistance=e.refDistance||this.panner.refDistance,this.panner.rolloffFactor=e.rolloffFactor||this.panner.rolloffFactor,this.panner.positionX.value=e.positionX||this.panner.positionX.value,this.panner.positionY.value=e.positionY||this.panner.positionY.value,this.panner.positionZ.value=e.positionZ||this.panner.positionZ.value,this.panner.orientationX.value=e.orientationX||this.panner.orientationX.value,this.panner.orientationY.value=e.orientationY||this.panner.orientationY.value,this.panner.orientationZ.value=e.orientationZ||this.panner.orientationZ.value}seek(e){if(!this.source||!this.buffer||!this.gainNode||!this.panner)throw new Error("Cannot seek a sound that has been cleaned up");const t=this.isPlaying();this.stop(),this.source=this.context.createBufferSource(),this.source.buffer=this.buffer,this.refreshFilters(),this.source.connect(this.panner).connect(this.gainNode),t&&this.source.start(0,e)}get volume(){if(!this.gainNode)throw new Error("Cannot get volume of a sound that has been cleaned up");return this.gainNode.gain.value}set volume(e){if(!this.gainNode)throw new Error("Cannot set volume of a sound that has been cleaned up");this.gainNode.gain.value=e}set sourceLoop(e){if(!this.source)throw new Error("Cannot set loop on a sound that has been cleaned up");"loop"in this.source&&(this.source.loop=e),"mediaElement"in this.source&&this.source.mediaElement&&(this.source.mediaElement.loop=e)}fadeIn(e,t="linear"){return new Promise(i=>{if(!this.gainNode)throw new Error("Cannot fade in a sound that has been cleaned up");this.gainNode.gain.value;const n=1;switch(this.gainNode.gain.value=0,t){case"exponential":this.gainNode.gain.setValueAtTime(.01,this.context.currentTime),this.gainNode.gain.exponentialRampToValueAtTime(n,this.context.currentTime+e);break;case"linear":this.gainNode.gain.linearRampToValueAtTime(n,this.context.currentTime+e);break}setTimeout(()=>{if(!this.gainNode)throw new Error("Cannot fade in a sound that has been cleaned up");this.gainNode.gain.value=n,i()},e*1e3)})}fadeOut(e,t="linear"){return new Promise(i=>{if(!this.gainNode)throw new Error("Cannot fade out a sound that has been cleaned up");switch(this.gainNode.gain.value,t){case"exponential":this.gainNode.gain.exponentialRampToValueAtTime(.01,this.context.currentTime+e);break;case"linear":this.gainNode.gain.linearRampToValueAtTime(0,this.context.currentTime+e)}setTimeout(()=>i(),e*1e3)})}isPlaying(){if(!this.source)throw new Error("Cannot check if a sound is playing that has been cleaned up");return this.playing}cleanup(){this.source&&(this.source.disconnect(),this.source=void 0),this.gainNode&&(this.gainNode.disconnect(),this.gainNode=void 0),this.filters.forEach(e=>{e&&e.disconnect()}),this.filters=[]}loop(e){if(!this.source)throw new Error("Cannot loop a sound that has been cleaned up");if(this.source instanceof AudioBufferSourceNode)return e===void 0?this.source.loop===!0?"infinite":0:(this.source.loop=!0,this.source.loopEnd=this.source.buffer?.duration||0,this.source.loopStart=0,this.source.loop===!0?"infinite":0);if("mediaElement"in this.source&&this.source.mediaElement){const t=this.source.mediaElement;return e===void 0||(t.loop=!0),t.loop===!0?"infinite":0}throw new Error("Unsupported source type")}stop(){if(!this.source)throw new Error("Cannot stop a sound that has been cleaned up");this.isPlaying()&&("stop"in this.source&&this.source.stop(),"mediaElement"in this.source&&this.source.mediaElement&&(this.source.mediaElement.pause(),this.source.mediaElement.currentTime=0),this.playing=!1)}pause(){if(!this.source)throw new Error("Cannot pause a sound that has been cleaned up");"suspend"in this.source.context&&this.source.context.suspend()}resume(){if(!this.source)throw new Error("Cannot resume a sound that has been cleaned up");"resume"in this.source.context&&this.source.context.resume()}addFilter(e){super.addFilter(e),this.refreshFilters()}removeFilter(e){super.removeFilter(e),this.refreshFilters()}set position(e){if(!this.panner)throw new Error("Cannot move a sound that has been cleaned up");const[t,i,n]=e;this.panner.positionX.setValueAtTime(t,this.context.currentTime),this.panner.positionY.setValueAtTime(i,this.context.currentTime),this.panner.positionZ.setValueAtTime(n,this.context.currentTime)}get position(){if(!this.panner)throw new Error("Cannot get position of a sound that has been cleaned up");return[this.panner.positionX.value,this.panner.positionY.value,this.panner.positionZ.value]}refreshFilters(){if(!this.panner||!this.gainNode)throw new Error("Cannot update filters on a sound that has been cleaned up");let e=this.panner;e.disconnect(),e=this.applyFilters(e),e.connect(this.gainNode)}}class p{sounds=[];_position=[0,0,0];loopCount=0;seek(e){this.sounds.forEach(t=>t.seek&&t.seek(e))}addSound(e){this.sounds.push(e)}preplay(){return this.sounds.reduce((e,t)=>(t.loop&&t.loop(this.loopCount),e.concat(t.preplay())),[])}play(){return this.preplay().map(e=>(e.play(),e))}isPlaying(){return this.sounds.some(e=>e.isPlaying())}stop(){this.sounds.forEach(e=>e.stop())}pause(){this.sounds.forEach(e=>e.pause())}resume(){this.sounds.forEach(e=>e.resume())}loop(e){return e===void 0?this.loopCount:(this.loopCount=e,this.sounds.forEach(t=>t.loop&&t.loop(e)),this.loopCount)}addFilter(e){this.sounds.forEach(t=>t.addFilter(e))}removeFilter(e){this.sounds.forEach(t=>t.removeFilter(e))}set position(e){this._position=e,this.sounds.forEach(t=>t.position=this._position)}get position(){return this._position}get volume(){return this.sounds.map(e=>e.volume).reduce((e,t)=>e+t,0)/this.sounds.length}set volume(e){this.sounds.forEach(t=>t.volume=e)}get playbackRate(){return this.sounds.length===0?1:this.sounds[0].playbackRate}set playbackRate(e){this.sounds.forEach(t=>t.playbackRate=e)}}class m extends u{context;source;gainNode;panner;constructor(e,t,i,n=0){super(),this.source=e,this.gainNode=t,this.context=i,this.panner=i.createPanner(),e.connect(this.panner).connect(this.gainNode),this.refreshFilters()}play(){if(!this.source)throw new Error("Cannot play a sound that has been cleaned up");return[this]}isPlaying(){return!!this.source}get volume(){if(!this.gainNode)throw new Error("Cannot get volume of a sound that has been cleaned up");return this.gainNode.gain.value}set volume(e){if(!this.gainNode)throw new Error("Cannot set volume of a sound that has been cleaned up");this.gainNode.gain.value=e}stop(){if(!this.source)throw new Error("Cannot stop a sound that has been cleaned up");this.source.mediaStream.getTracks().forEach(e=>e.stop())}pause(){if(!this.source)throw new Error("Cannot pause a sound that has been cleaned up");this.source.mediaStream.getTracks().forEach(e=>e.enabled=!1)}resume(){if(!this.source)throw new Error("Cannot resume a sound that has been cleaned up");this.source.mediaStream.getTracks().forEach(e=>e.enabled=!0)}addFilter(e){super.addFilter(e),this.refreshFilters()}removeFilter(e){super.removeFilter(e),this.refreshFilters()}set position(e){if(!this.panner)throw new Error("Cannot move a sound that has been cleaned up");const[t,i,n]=e;this.panner.positionX.value=t,this.panner.positionY.value=i,this.panner.positionZ.value=n}get position(){if(!this.panner)throw new Error("Cannot get position of a sound that has been cleaned up");return[this.panner.positionX.value,this.panner.positionY.value,this.panner.positionZ.value]}refreshFilters(){if(!this.source||!this.gainNode)throw new Error("Cannot update filters on a sound that has been cleaned up");let e=this.source;this.source.disconnect(),e=this.applyFilters(e),e.connect(this.gainNode)}get playbackRate(){return 1}set playbackRate(e){}}class b extends u{context;_position=[0,0,0];loopCount=0;prevVolume=1;microphoneGainNode;streamPlayback;stream;streamSource;constructor(e){super(),this.context=e,this.microphoneGainNode=this.context.createGain()}play(){return this.stream||navigator.mediaDevices.getUserMedia({audio:!0}).then(e=>{this.stream=e,this.streamSource=this.context.createMediaStreamSource(this.stream),this.streamPlayback=new m(this.streamSource,this.microphoneGainNode,this.context),this.streamPlayback.play()}).catch(e=>{console.error("Error initializing microphone stream:",e)}),this.streamPlayback?[this.streamPlayback]:[]}seek(e){}isPlaying(){return!!this.streamPlayback}stop(){this.streamPlayback&&(this.streamPlayback.stop(),this.streamPlayback=void 0)}pause(){this.streamPlayback&&this.streamPlayback.pause()}resume(){this.streamPlayback&&this.streamPlayback.resume()}addFilter(e){this.streamPlayback&&this.streamPlayback.addFilter(e)}removeFilter(e){this.streamPlayback&&this.streamPlayback.removeFilter(e)}get volume(){return this.streamPlayback?this.streamPlayback.volume:0}set volume(e){this.streamPlayback&&(this.streamPlayback.volume=e)}get position(){return[0,0,0]}set position(e){}loop(e){return 0}get playbackRate(){return 1}set playbackRate(e){}}async function W(o,e,t){if(!o.audioWorklet)throw new Error("AudioWorklet not supported");try{return new I.AudioWorkletNode(o,e)}catch{return await o.audioWorklet.addModule(t),new I.AudioWorkletNode(o,e)}}exports.Cacophony=V;exports.Group=p;exports.MicrophonePlayback=m;exports.MicrophoneStream=b;exports.Playback=A;exports.Sound=l;exports.SoundType=d;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("standardized-audio-context");class k{static pendingRequests=new Map;static async openCache(){try{return await caches.open("audio-cache")}catch(e){throw console.error("Failed to open cache:",e),e}}static async getAudioBufferFromCache(e,t,i){try{const n=await t.match(e);if(n){const r=await n.arrayBuffer();return i.decodeAudioData(r)}return null}catch(n){throw console.error("Failed to get audio data from cache:",n),n}}static async fetchAndCacheAudioBuffer(e,t,i){try{const n=await fetch(e),r=n.clone();t.put(e,r);const o=await n.arrayBuffer();return i.decodeAudioData(o)}catch(n){throw console.error("Failed to fetch and cache audio data:",n),n}}static async getAudioBuffer(e,t){const i=await this.openCache();let n=this.pendingRequests.get(e);if(n)return n;const r=await this.getAudioBufferFromCache(e,i,t);return r||(n=this.fetchAndCacheAudioBuffer(e,i,t),this.pendingRequests.set(e,n),n)}}const E=(s,e)=>{var t=new Uint8Array(s.byteLength+e.byteLength);return t.set(new Uint8Array(s),0),t.set(new Uint8Array(e),s.byteLength),t.buffer};function x(s,e){const t=[];let i=0;fetch(s).then(function(r){if(!r.ok)throw new Error("HTTP error, status = "+r.status);if(!r.body)throw new Error("Missing body");var o=r.body.getReader();let h=new ArrayBuffer(0);function c(){return o.read().then(({value:a,done:v})=>{let p=null;if(a){if(h.byteLength?p=E(h,a.buffer):(h=a.buffer.slice(0,44),p=a.buffer),e.decodeAudioData(p,function(d){t.push(d),t.length&&n()},function(d){console.log("err(decodeAudioData): "+d)}),v){console.log("done");return}c()}})}c()});function n(){for(;t.length;){let r=t.shift();const o=e.createBufferSource();if(!r)return;o.buffer=r,o.connect(e.destination),i==0&&(i=e.currentTime+.02),o.start(i),i+=o.buffer.duration}}}const C="/assets/phase-vocoder-5mfSKiHe.js";var g=(s=>(s.HTML="HTML",s.Streaming="Streaming",s.Buffer="Buffer",s))(g||{});class T{context;globalGainNode;listener;prevVolume=1;finalizationRegistry;constructor(e){this.context=e||new f.AudioContext,this.listener=this.context.listener,this.globalGainNode=this.context.createGain(),this.globalGainNode.connect(this.context.destination),this.finalizationRegistry=new FinalizationRegistry(t=>{t.cleanup()})}async loadWorklets(){this.context.audioWorklet?await A(this.context,"phase-vocoder",C):console.warn("AudioWorklet not supported")}async createSound(e,t="Buffer"){if(e instanceof AudioBuffer)return Promise.resolve(new u("",e,this.context,this.globalGainNode,"Buffer"));const i=e;if(t==="HTML"){const n=new Audio;return n.src=i,n.crossOrigin="anonymous",new u(i,void 0,this.context,this.globalGainNode,"HTML")}return k.getAudioBuffer(i,this.context).then(n=>new u(i,n,this.context,this.globalGainNode,t))}async createGroup(e){const t=new m;return e.forEach(i=>t.addSound(i)),t}async createGroupFromUrls(e){const t=new m;return(await Promise.all(e.map(n=>this.createSound(n)))).forEach(n=>t.addSound(n)),t}async createStream(e){return await x(e,this.context),new u(e,void 0,this.context,this.globalGainNode,"Streaming")}createBiquadFilter(e){const t=this.context.createBiquadFilter();return t.type=e,t}pause(){"suspend"in this.context&&this.context.suspend()}resume(){"resume"in this.context&&this.context.resume()}setGlobalVolume(e){this.globalGainNode.gain.value=e}get volume(){return this.globalGainNode.gain.value}set volume(e){if(this.muted){this.prevVolume=e;return}this.setGlobalVolume(e)}mute(){this.muted||(this.prevVolume=this.globalGainNode.gain.value,this.setGlobalVolume(0))}unmute(){this.muted&&this.setGlobalVolume(this.prevVolume)}get muted(){return this.globalGainNode.gain.value===0}set muted(e){e!==this.muted&&(e?this.mute():this.unmute())}getMicrophoneStream(){return new Promise((e,t)=>{navigator.mediaDevices.getUserMedia({audio:!0}).then(i=>{const n=new w(this.context);n.play(),e(n)}).catch(i=>{t(i)})})}get listenerOrientation(){return{forward:[this.listener.forwardX.value,this.listener.forwardY.value,this.listener.forwardZ.value],up:[this.listener.upX.value,this.listener.upY.value,this.listener.upZ.value]}}set listenerOrientation(e){const{forward:t,up:i}=e,[n,r,o]=t,[h,c,a]=i;this.listener.forwardX.setValueAtTime(n,this.context.currentTime),this.listener.forwardY.setValueAtTime(r,this.context.currentTime),this.listener.forwardZ.setValueAtTime(o,this.context.currentTime),this.listener.upX.setValueAtTime(h,this.context.currentTime),this.listener.upY.setValueAtTime(c,this.context.currentTime),this.listener.upZ.setValueAtTime(a,this.context.currentTime)}get listenerUpOrientation(){return[this.listener.upX.value,this.listener.upY.value,this.listener.upZ.value]}set listenerUpOrientation(e){const[t,i,n]=e;this.listener.upX.setValueAtTime(t,this.context.currentTime),this.listener.upY.setValueAtTime(i,this.context.currentTime),this.listener.upZ.setValueAtTime(n,this.context.currentTime)}get listenerForwardOrientation(){return[this.listener.forwardX.value,this.listener.forwardY.value,this.listener.forwardZ.value]}set listenerForwardOrientation(e){const[t,i,n]=e;this.listener.forwardX.setValueAtTime(t,this.context.currentTime),this.listener.forwardY.setValueAtTime(i,this.context.currentTime),this.listener.forwardZ.setValueAtTime(n,this.context.currentTime)}get listenerPosition(){return[this.listener.positionX.value,this.listener.positionY.value,this.listener.positionZ.value]}set listenerPosition(e){const[t,i,n]=e;this.listener.positionX.setValueAtTime(t,this.context.currentTime),this.listener.positionY.setValueAtTime(i,this.context.currentTime),this.listener.positionZ.setValueAtTime(n,this.context.currentTime)}}class l{filters=[];addFilter(e){this.filters.push(e)}removeFilter(e){this.filters=this.filters.filter(t=>t!==e)}applyFilters(e){return this.filters.reduce((t,i)=>(t.connect(i),i),e),this.filters.length>0?this.filters[this.filters.length-1]:e}}class u extends l{constructor(e,t,i,n,r="Buffer"){super(),this.url=e,this.type=r,this.buffer=t,this.context=i,this.globalGainNode=n,this._position=[0,0,0]}buffer;context;playbacks=[];globalGainNode;_position=[0,0,0];_threeDOptions={coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0,distanceModel:"inverse",maxDistance:1e4,channelCount:2,channelCountMode:"clamped-max",channelInterpretation:"speakers",panningModel:"HRTF",refDistance:1,rolloffFactor:1,positionX:0,positionY:0,positionZ:0,orientationX:0,orientationY:0,orientationZ:0};loopCount=0;_playbackRate=1;_volume=1;preplay(){let e;if(this.buffer)e=this.context.createBufferSource(),e.buffer=this.buffer;else{const n=new Audio;n.crossOrigin="anonymous",n.src=this.url,n.preload="auto",e=this.context.createMediaElementSource(n)}const t=this.context.createGain();t.connect(this.globalGainNode);const i=new b(e,t,this.context,this.loopCount);return i.volume=this.volume,i.playbackRate=this.playbackRate,this.filters.forEach(n=>i.addFilter(n)),i.threeDOptions=this.threeDOptions,i.position=this.position,this.playbacks.push(i),[i]}play(){const e=this.preplay();return e.forEach(t=>t.play()),e}stop(){this.playbacks.forEach(e=>e.stop())}pause(){"suspend"in this.context&&this.context.suspend()}resume(){"resume"in this.context&&this.context.resume()}seek(e){this.playbacks.forEach(t=>t.seek(e))}set position(e){this._threeDOptions.positionX=e[0],this._threeDOptions.positionY=e[1],this._threeDOptions.positionZ=e[2],this.playbacks.forEach(t=>t.position=e)}get position(){return[this._threeDOptions.positionX,this._threeDOptions.positionY,this._threeDOptions.positionZ]}get threeDOptions(){return this._threeDOptions}set threeDOptions(e){this._threeDOptions={...this._threeDOptions,...e},this.playbacks.forEach(t=>t.threeDOptions=this._threeDOptions)}loop(e){return e===void 0?this.loopCount:(this.loopCount=e,this.playbacks.forEach(t=>t.sourceLoop=!0),this.loopCount)}addFilter(e){super.addFilter(e),this.playbacks.forEach(t=>t.addFilter(e))}removeFilter(e){super.removeFilter(e),this.playbacks.forEach(t=>t.removeFilter(e))}get volume(){return this._volume}set volume(e){this._volume=e,this.playbacks.forEach(t=>t.volume=e)}isPlaying(){return this.playbacks.some(e=>e.isPlaying())}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this.playbacks.forEach(t=>t.playbackRate=e)}}class b extends l{context;source;gainNode;panner;loopCount=0;currentLoop=0;buffer;playing=!1;constructor(e,t,i,n=0){super(),this.loopCount=n,this.source=e,"buffer"in e&&e.buffer&&(this.buffer=e.buffer),"mediaElement"in e&&e.mediaElement?e.mediaElement.onended=this.handleLoop.bind(this):"onended"in e&&(e.onended=this.handleLoop.bind(this)),this.gainNode=t,this.context=i,this.panner=i.createPanner(),e.connect(this.panner),this.panner.connect(this.gainNode),this.refreshFilters()}get playbackRate(){if(!this.source)throw new Error("Cannot get playback rate of a sound that has been cleaned up");if("playbackRate"in this.source)return this.source.playbackRate.value;if("mediaElement"in this.source&&this.source.mediaElement)return this.source.mediaElement.playbackRate;throw new Error("Unsupported source type")}set playbackRate(e){if(!this.source)throw new Error("Cannot set playback rate of a sound that has been cleaned up");"playbackRate"in this.source&&(this.source.playbackRate.value=e),"mediaElement"in this.source&&this.source.mediaElement&&(this.source.mediaElement.playbackRate=e)}handleLoop(){this.buffer?(this.source=this.context.createBufferSource(),this.source.buffer=this.buffer):this.seek(0),this.loopCount==="infinite"||this.currentLoop<this.loopCount?(this.currentLoop++,this.playing&&this.play()):this.playing=!1}play(){if(!this.source)throw new Error("Cannot play a sound that has been cleaned up");return"mediaElement"in this.source&&this.source.mediaElement?this.source.mediaElement.play():"start"in this.source&&this.source.start&&this.source.start(),this.playing=!0,[this]}get threeDOptions(){if(!this.panner)throw new Error("Cannot get 3D options of a sound that has been cleaned up");return{coneInnerAngle:this.panner.coneInnerAngle,coneOuterAngle:this.panner.coneOuterAngle,coneOuterGain:this.panner.coneOuterGain,distanceModel:this.panner.distanceModel,maxDistance:this.panner.maxDistance,channelCount:this.panner.channelCount,channelCountMode:this.panner.channelCountMode,channelInterpretation:this.panner.channelInterpretation,panningModel:this.panner.panningModel,refDistance:this.panner.refDistance,rolloffFactor:this.panner.rolloffFactor,positionX:this.panner.positionX.value,positionY:this.panner.positionY.value,positionZ:this.panner.positionZ.value,orientationX:this.panner.orientationX.value,orientationY:this.panner.orientationY.value,orientationZ:this.panner.orientationZ.value}}set threeDOptions(e){if(!this.panner)throw new Error("Cannot set 3D options of a sound that has been cleaned up");this.panner.coneInnerAngle=e.coneInnerAngle||this.panner.coneInnerAngle,this.panner.coneOuterAngle=e.coneOuterAngle||this.panner.coneOuterAngle,this.panner.coneOuterGain=e.coneOuterGain||this.panner.coneOuterGain,this.panner.distanceModel=e.distanceModel||this.panner.distanceModel,this.panner.maxDistance=e.maxDistance||this.panner.maxDistance,this.panner.channelCount=e.channelCount||this.panner.channelCount,this.panner.channelCountMode=e.channelCountMode||this.panner.channelCountMode,this.panner.channelInterpretation=e.channelInterpretation||this.panner.channelInterpretation,this.panner.panningModel=e.panningModel||this.panner.panningModel,this.panner.refDistance=e.refDistance||this.panner.refDistance,this.panner.rolloffFactor=e.rolloffFactor||this.panner.rolloffFactor,this.panner.positionX.value=e.positionX||this.panner.positionX.value,this.panner.positionY.value=e.positionY||this.panner.positionY.value,this.panner.positionZ.value=e.positionZ||this.panner.positionZ.value,this.panner.orientationX.value=e.orientationX||this.panner.orientationX.value,this.panner.orientationY.value=e.orientationY||this.panner.orientationY.value,this.panner.orientationZ.value=e.orientationZ||this.panner.orientationZ.value}seek(e){if(!this.source||!this.buffer||!this.gainNode||!this.panner)throw new Error("Cannot seek a sound that has been cleaned up");const t=this.isPlaying();this.stop(),this.source=this.context.createBufferSource(),this.source.buffer=this.buffer,this.refreshFilters(),this.source.connect(this.panner).connect(this.gainNode),t&&this.source.start(0,e)}get volume(){if(!this.gainNode)throw new Error("Cannot get volume of a sound that has been cleaned up");return this.gainNode.gain.value}set volume(e){if(!this.gainNode)throw new Error("Cannot set volume of a sound that has been cleaned up");this.gainNode.gain.value=e}set sourceLoop(e){if(!this.source)throw new Error("Cannot set loop on a sound that has been cleaned up");"loop"in this.source&&(this.source.loop=e),"mediaElement"in this.source&&this.source.mediaElement&&(this.source.mediaElement.loop=e)}fadeIn(e,t="linear"){return new Promise(i=>{if(!this.gainNode)throw new Error("Cannot fade in a sound that has been cleaned up");this.gainNode.gain.value;const n=1;switch(this.gainNode.gain.value=0,t){case"exponential":this.gainNode.gain.setValueAtTime(.01,this.context.currentTime),this.gainNode.gain.exponentialRampToValueAtTime(n,this.context.currentTime+e);break;case"linear":this.gainNode.gain.linearRampToValueAtTime(n,this.context.currentTime+e);break}setTimeout(()=>{if(!this.gainNode)throw new Error("Cannot fade in a sound that has been cleaned up");this.gainNode.gain.value=n,i()},e*1e3)})}fadeOut(e,t="linear"){return new Promise(i=>{if(!this.gainNode)throw new Error("Cannot fade out a sound that has been cleaned up");switch(this.gainNode.gain.value,t){case"exponential":this.gainNode.gain.exponentialRampToValueAtTime(.01,this.context.currentTime+e);break;case"linear":this.gainNode.gain.linearRampToValueAtTime(0,this.context.currentTime+e)}setTimeout(()=>i(),e*1e3)})}isPlaying(){if(!this.source)throw new Error("Cannot check if a sound is playing that has been cleaned up");return this.playing}cleanup(){this.source&&(this.source.disconnect(),this.source=void 0),this.gainNode&&(this.gainNode.disconnect(),this.gainNode=void 0),this.filters.forEach(e=>{e&&e.disconnect()}),this.filters=[]}loop(e){if(!this.source)throw new Error("Cannot loop a sound that has been cleaned up");if(this.source instanceof AudioBufferSourceNode)return e===void 0?this.source.loop===!0?"infinite":0:(this.source.loop=!0,this.source.loopEnd=this.source.buffer?.duration||0,this.source.loopStart=0,this.source.loop===!0?"infinite":0);if("mediaElement"in this.source&&this.source.mediaElement){const t=this.source.mediaElement;return e===void 0||(t.loop=!0),t.loop===!0?"infinite":0}throw new Error("Unsupported source type")}stop(){if(!this.source)throw new Error("Cannot stop a sound that has been cleaned up");this.isPlaying()&&("stop"in this.source&&this.source.stop(),"mediaElement"in this.source&&this.source.mediaElement&&(this.source.mediaElement.pause(),this.source.mediaElement.currentTime=0),this.playing=!1)}pause(){if(!this.source)throw new Error("Cannot pause a sound that has been cleaned up");"suspend"in this.source.context&&this.source.context.suspend()}resume(){if(!this.source)throw new Error("Cannot resume a sound that has been cleaned up");"resume"in this.source.context&&this.source.context.resume()}addFilter(e){super.addFilter(e),this.refreshFilters()}removeFilter(e){super.removeFilter(e),this.refreshFilters()}set position(e){if(!this.panner)throw new Error("Cannot move a sound that has been cleaned up");const[t,i,n]=e;this.panner.positionX.setValueAtTime(t,this.context.currentTime),this.panner.positionY.setValueAtTime(i,this.context.currentTime),this.panner.positionZ.setValueAtTime(n,this.context.currentTime)}get position(){if(!this.panner)throw new Error("Cannot get position of a sound that has been cleaned up");return[this.panner.positionX.value,this.panner.positionY.value,this.panner.positionZ.value]}refreshFilters(){if(!this.panner||!this.gainNode)throw new Error("Cannot update filters on a sound that has been cleaned up");let e=this.panner;e.disconnect(),e=this.applyFilters(e),e.connect(this.gainNode)}}class m{sounds=[];_position=[0,0,0];loopCount=0;seek(e){this.sounds.forEach(t=>t.seek&&t.seek(e))}addSound(e){this.sounds.push(e)}preplay(){return this.sounds.reduce((e,t)=>(t.loop&&t.loop(this.loopCount),e.concat(t.preplay())),[])}play(){return this.preplay().map(e=>(e.play(),e))}isPlaying(){return this.sounds.some(e=>e.isPlaying())}stop(){this.sounds.forEach(e=>e.stop())}pause(){this.sounds.forEach(e=>e.pause())}resume(){this.sounds.forEach(e=>e.resume())}loop(e){return e===void 0?this.loopCount:(this.loopCount=e,this.sounds.forEach(t=>t.loop&&t.loop(e)),this.loopCount)}addFilter(e){this.sounds.forEach(t=>t.addFilter(e))}removeFilter(e){this.sounds.forEach(t=>t.removeFilter(e))}set position(e){this._position=e,this.sounds.forEach(t=>t.position=this._position)}get position(){return this._position}get volume(){return this.sounds.map(e=>e.volume).reduce((e,t)=>e+t,0)/this.sounds.length}set volume(e){this.sounds.forEach(t=>t.volume=e)}get playbackRate(){return this.sounds.length===0?1:this.sounds[0].playbackRate}set playbackRate(e){this.sounds.forEach(t=>t.playbackRate=e)}}class y extends l{context;source;gainNode;panner;constructor(e,t,i,n=0){super(),this.source=e,this.gainNode=t,this.context=i,this.panner=i.createPanner(),e.connect(this.panner).connect(this.gainNode),this.refreshFilters()}play(){if(!this.source)throw new Error("Cannot play a sound that has been cleaned up");return[this]}isPlaying(){return!!this.source}get volume(){if(!this.gainNode)throw new Error("Cannot get volume of a sound that has been cleaned up");return this.gainNode.gain.value}set volume(e){if(!this.gainNode)throw new Error("Cannot set volume of a sound that has been cleaned up");this.gainNode.gain.value=e}stop(){if(!this.source)throw new Error("Cannot stop a sound that has been cleaned up");this.source.mediaStream.getTracks().forEach(e=>e.stop())}pause(){if(!this.source)throw new Error("Cannot pause a sound that has been cleaned up");this.source.mediaStream.getTracks().forEach(e=>e.enabled=!1)}resume(){if(!this.source)throw new Error("Cannot resume a sound that has been cleaned up");this.source.mediaStream.getTracks().forEach(e=>e.enabled=!0)}addFilter(e){super.addFilter(e),this.refreshFilters()}removeFilter(e){super.removeFilter(e),this.refreshFilters()}set position(e){if(!this.panner)throw new Error("Cannot move a sound that has been cleaned up");const[t,i,n]=e;this.panner.positionX.value=t,this.panner.positionY.value=i,this.panner.positionZ.value=n}get position(){if(!this.panner)throw new Error("Cannot get position of a sound that has been cleaned up");return[this.panner.positionX.value,this.panner.positionY.value,this.panner.positionZ.value]}refreshFilters(){if(!this.source||!this.gainNode)throw new Error("Cannot update filters on a sound that has been cleaned up");let e=this.source;this.source.disconnect(),e=this.applyFilters(e),e.connect(this.gainNode)}get playbackRate(){return 1}set playbackRate(e){}}class w extends l{context;_position=[0,0,0];loopCount=0;prevVolume=1;microphoneGainNode;streamPlayback;stream;streamSource;constructor(e){super(),this.context=e,this.microphoneGainNode=this.context.createGain()}play(){return this.stream||navigator.mediaDevices.getUserMedia({audio:!0}).then(e=>{this.stream=e,this.streamSource=this.context.createMediaStreamSource(this.stream),this.streamPlayback=new y(this.streamSource,this.microphoneGainNode,this.context),this.streamPlayback.play()}).catch(e=>{console.error("Error initializing microphone stream:",e)}),this.streamPlayback?[this.streamPlayback]:[]}seek(e){}isPlaying(){return!!this.streamPlayback}stop(){this.streamPlayback&&(this.streamPlayback.stop(),this.streamPlayback=void 0)}pause(){this.streamPlayback&&this.streamPlayback.pause()}resume(){this.streamPlayback&&this.streamPlayback.resume()}addFilter(e){this.streamPlayback&&this.streamPlayback.addFilter(e)}removeFilter(e){this.streamPlayback&&this.streamPlayback.removeFilter(e)}get volume(){return this.streamPlayback?this.streamPlayback.volume:0}set volume(e){this.streamPlayback&&(this.streamPlayback.volume=e)}get position(){return[0,0,0]}set position(e){}loop(e){return 0}get playbackRate(){return 1}set playbackRate(e){}}async function A(s,e,t){if(!s.audioWorklet)throw new Error("AudioWorklet not supported");try{return new f.AudioWorkletNode(s,e)}catch{return await s.audioWorklet.addModule(t),new f.AudioWorkletNode(s,e)}}exports.Cacophony=T;exports.Group=m;exports.MicrophonePlayback=y;exports.MicrophoneStream=w;exports.Playback=b;exports.Sound=u;exports.SoundType=g;
|
|
2
2
|
//# sourceMappingURL=cacophony.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacophony.cjs.js","sources":["../src/cache.ts","../src/stream.ts","../src/processors/phase-vocoder.ts?url","../src/cacophony.ts"],"sourcesContent":["import { IAudioContext } from \"standardized-audio-context\";\n\nexport class CacheManager {\n private static pendingRequests = new Map<string, Promise<AudioBuffer>>();\n\n private static async openCache(): Promise<Cache> {\n try {\n return await caches.open('audio-cache');\n } catch (error) {\n console.error('Failed to open cache:', error);\n throw error;\n }\n }\n\n private static async getAudioBufferFromCache(url: string, cache: Cache, context: IAudioContext): Promise<AudioBuffer | null> {\n try {\n const response = await cache.match(url);\n if (response) {\n const arrayBuffer = await response.arrayBuffer();\n return context.decodeAudioData(arrayBuffer);\n }\n return null;\n } catch (error) {\n console.error('Failed to get audio data from cache:', error);\n throw error;\n }\n }\n\n private static async fetchAndCacheAudioBuffer(url: string, cache: Cache, context: IAudioContext): Promise<AudioBuffer> {\n try {\n const fetchResponse = await fetch(url);\n const responseClone = fetchResponse.clone();\n cache.put(url, responseClone);\n const arrayBuffer = await fetchResponse.arrayBuffer();\n return context.decodeAudioData(arrayBuffer);\n } catch (error) {\n console.error('Failed to fetch and cache audio data:', error);\n throw error;\n }\n }\n\n public static async getAudioBuffer(url: string, context: IAudioContext): Promise<AudioBuffer> {\n const cache = await this.openCache();\n\n // First, check if there's a pending request.\n let pendingRequest = this.pendingRequests.get(url);\n if (pendingRequest) {\n return pendingRequest;\n }\n\n // Try getting the buffer from cache.\n const bufferFromCache = await this.getAudioBufferFromCache(url, cache, context);\n if (bufferFromCache) {\n return bufferFromCache;\n }\n\n // If it's not in the cache, fetch and cache it.\n pendingRequest = this.fetchAndCacheAudioBuffer(url, cache, context);\n this.pendingRequests.set(url, pendingRequest);\n\n return pendingRequest;\n }\n}\n","import { AudioContext, IAudioBuffer, IAudioBufferSourceNode, IAudioListener, IBiquadFilterNode, IGainNode, IMediaElementAudioSourceNode, IMediaStreamAudioSourceNode, IPannerNode, IPannerOptions } from 'standardized-audio-context';\n\n\nconst appendBuffer = (buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer => {\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp.buffer;\n}\n\n\nexport function createStream(url: string, context: AudioContext) {\n const audioStack: IAudioBuffer[] = [];\n let nextTime = 0;\n\n fetch(url).then(function (response) {\n if (!response.ok) {\n throw new Error('HTTP error, status = ' + response.status);\n }\n if (!response.body) {\n throw new Error('Missing body');\n }\n\n var reader = response.body.getReader();\n let header = new ArrayBuffer(0);//first 44bytes\n\n function read() {\n return reader.read().then(({ value, done }) => {\n let audioBuffer = null;\n if (!value) {\n return;\n }\n\n if (!header.byteLength) {\n //copy first 44 bytes (wav header)\n header = value.buffer.slice(0, 44);\n audioBuffer = value.buffer;\n } else {\n audioBuffer = appendBuffer(header, value.buffer);\n }\n\n context.decodeAudioData(audioBuffer, function (buffer) {\n\n audioStack.push(buffer);\n if (audioStack.length) {\n scheduleBuffers();\n }\n }, function (err) {\n console.log(\"err(decodeAudioData): \" + err);\n });\n if (done) {\n console.log('done');\n return;\n }\n //read next buffer\n read();\n });\n }\n read();\n })\n\n function scheduleBuffers() {\n while (audioStack.length) {\n let buffer = audioStack.shift();\n const source = context.createBufferSource();\n if (!buffer) {\n return;\n }\n source.buffer = buffer;\n source.connect(context.destination);\n if (nextTime == 0)\n nextTime = context.currentTime + 0.02; /// add 50ms latency to work well across systems - tune this if you like\n source.start(nextTime);\n nextTime += source.buffer.duration; // Make the next buffer wait the length of the last buffer before being played\n };\n }\n}\n\n","export default \"data:video/mp2t;base64,InVzZSBzdHJpY3QiOwoKaW1wb3J0IE9MQVByb2Nlc3NvciBmcm9tICcuL29sYSc7CmltcG9ydCBGRlQgZnJvbSAnZmZ0LmpzJzsKCmNvbnN0IEJVRkZFUkVEX0JMT0NLX1NJWkUgPSAyMDQ4OwoKZnVuY3Rpb24gZ2VuSGFubldpbmRvdyhsZW5ndGg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7CiAgICBsZXQgd2luID0gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHdpbltpXSA9IDAuNSAqICgxIC0gTWF0aC5jb3MoMiAqIE1hdGguUEkgKiBpIC8gbGVuZ3RoKSk7CiAgICB9CiAgICByZXR1cm4gd2luOwp9CgppbnRlcmZhY2UgUGhhc2VWb2NvZGVyTm9kZU9wdGlvbnMgZXh0ZW5kcyBBdWRpb1dvcmtsZXROb2RlT3B0aW9ucyB7CiAgICBwcm9jZXNzb3JPcHRpb25zOiB7CiAgICAgICAgYmxvY2tTaXplOiBudW1iZXI7CiAgICB9Owp9CgpleHBvcnQgZGVmYXVsdCBjbGFzcyBQaGFzZVZvY29kZXJQcm9jZXNzb3IgZXh0ZW5kcyBPTEFQcm9jZXNzb3IgewogICAgZmZ0U2l6ZTogbnVtYmVyOwogICAgdGltZUN1cnNvcjogbnVtYmVyOwogICAgaGFubldpbmRvdzogRmxvYXQzMkFycmF5OwogICAgZmZ0OiBGRlQ7CiAgICBmcmVxQ29tcGxleEJ1ZmZlcjogYW55OwogICAgZnJlcUNvbXBsZXhCdWZmZXJTaGlmdGVkOiBhbnk7CiAgICB0aW1lQ29tcGxleEJ1ZmZlcjogYW55OwogICAgbWFnbml0dWRlczogRmxvYXQzMkFycmF5OwogICAgcGVha0luZGV4ZXM6IEludDMyQXJyYXk7CiAgICBuYlBlYWtzOiBudW1iZXI7CgogICAgc3RhdGljIGdldCBwYXJhbWV0ZXJEZXNjcmlwdG9ycygpIHsKICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgbmFtZTogJ3BpdGNoRmFjdG9yJywKICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAxLjAKICAgICAgICB9XTsKICAgIH0KCiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQaGFzZVZvY29kZXJOb2RlT3B0aW9ucykgewogICAgICAgIG9wdGlvbnMucHJvY2Vzc29yT3B0aW9ucyA9IHsKICAgICAgICAgICAgYmxvY2tTaXplOiBCVUZGRVJFRF9CTE9DS19TSVpFLAogICAgICAgIH07CiAgICAgICAgc3VwZXIob3B0aW9ucyk7CgogICAgICAgIHRoaXMuZmZ0U2l6ZSA9IHRoaXMuYmxvY2tTaXplOwogICAgICAgIHRoaXMudGltZUN1cnNvciA9IDA7CgogICAgICAgIHRoaXMuaGFubldpbmRvdyA9IGdlbkhhbm5XaW5kb3codGhpcy5ibG9ja1NpemUpOwoKICAgICAgICAvLyBwcmVwYXJlIEZGVCBhbmQgcHJlLWFsbG9jYXRlIGJ1ZmZlcnMKICAgICAgICB0aGlzLmZmdCA9IG5ldyBGRlQodGhpcy5mZnRTaXplKTsKICAgICAgICB0aGlzLmZyZXFDb21wbGV4QnVmZmVyID0gdGhpcy5mZnQuY3JlYXRlQ29tcGxleEFycmF5KCkgYXMgRmxvYXQzMkFycmF5W107CiAgICAgICAgdGhpcy5mcmVxQ29tcGxleEJ1ZmZlclNoaWZ0ZWQgPSB0aGlzLmZmdC5jcmVhdGVDb21wbGV4QXJyYXkoKSBhcyBGbG9hdDMyQXJyYXlbXTsKICAgICAgICB0aGlzLnRpbWVDb21wbGV4QnVmZmVyID0gdGhpcy5mZnQuY3JlYXRlQ29tcGxleEFycmF5KCk7CiAgICAgICAgdGhpcy5tYWduaXR1ZGVzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmZmdFNpemUgLyAyICsgMSk7CiAgICAgICAgdGhpcy5wZWFrSW5kZXhlcyA9IG5ldyBJbnQzMkFycmF5KHRoaXMubWFnbml0dWRlcy5sZW5ndGgpOwogICAgICAgIHRoaXMubmJQZWFrcyA9IDA7CiAgICB9CgogICAgcHJvY2Vzc09MQShpbnB1dHM6IEZsb2F0MzJBcnJheVtdW10sIG91dHB1dHM6IEZsb2F0MzJBcnJheVtdW10sIHBhcmFtZXRlcnM6IEF1ZGlvUGFyYW1NYXApIHsKICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICBjb25zdCBwaXRjaEZhY3RvciA9IHBhcmFtZXRlcnMuZ2V0KCdwaXRjaEZhY3RvcicpW3BhcmFtZXRlcnMuZ2V0KCJwaXRjaEZhY3RvciIpLmxlbmd0aCAtIDFdOwoKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmJJbnB1dHM7IGkrKykgewogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlucHV0c1tpXS5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gaW5wdXRzW2ldW2pdOwogICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IG91dHB1dHNbaV1bal07CgogICAgICAgICAgICAgICAgdGhpcy5hcHBseUhhbm5XaW5kb3coaW5wdXQpOwoKICAgICAgICAgICAgICAgIHRoaXMuZmZ0LnJlYWxUcmFuc2Zvcm0odGhpcy5mcmVxQ29tcGxleEJ1ZmZlciwgaW5wdXQpOwoKICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZU1hZ25pdHVkZXMoKTsKICAgICAgICAgICAgICAgIHRoaXMuZmluZFBlYWtzKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0UGVha3MocGl0Y2hGYWN0b3IpOwoKICAgICAgICAgICAgICAgIHRoaXMuZmZ0LmNvbXBsZXRlU3BlY3RydW0odGhpcy5mcmVxQ29tcGxleEJ1ZmZlclNoaWZ0ZWQpOwogICAgICAgICAgICAgICAgdGhpcy5mZnQuaW52ZXJzZVRyYW5zZm9ybSh0aGlzLnRpbWVDb21wbGV4QnVmZmVyLCB0aGlzLmZyZXFDb21wbGV4QnVmZmVyU2hpZnRlZCk7CiAgICAgICAgICAgICAgICB0aGlzLmZmdC5mcm9tQ29tcGxleEFycmF5KHRoaXMudGltZUNvbXBsZXhCdWZmZXIsIG91dHB1dCk7CgogICAgICAgICAgICAgICAgdGhpcy5hcHBseUhhbm5XaW5kb3cob3V0cHV0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy50aW1lQ3Vyc29yICs9IHRoaXMuaG9wU2l6ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwcml2YXRlIGFwcGx5SGFubldpbmRvdyhpbnB1dDogRmxvYXQzMkFycmF5KSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGlucHV0W2ldICo9IHRoaXMuaGFubldpbmRvd1tpXTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBjb21wdXRlTWFnbml0dWRlcygpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB0aGlzLm1hZ25pdHVkZXMubGVuZ3RoOyBpKyssIGogKz0gMikgewogICAgICAgICAgICBjb25zdCByZWFsID0gdGhpcy5mcmVxQ29tcGxleEJ1ZmZlcltqXTsKICAgICAgICAgICAgY29uc3QgaW1hZyA9IHRoaXMuZnJlcUNvbXBsZXhCdWZmZXJbaiArIDFdOwogICAgICAgICAgICB0aGlzLm1hZ25pdHVkZXNbaV0gPSByZWFsICoqIDIgKyBpbWFnICoqIDI7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgZmluZFBlYWtzKCkgewogICAgICAgIHRoaXMubmJQZWFrcyA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDIsIGVuZCA9IHRoaXMubWFnbml0dWRlcy5sZW5ndGggLSAyOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgbWFnID0gdGhpcy5tYWduaXR1ZGVzW2ldOwoKICAgICAgICAgICAgaWYgKHRoaXMubWFnbml0dWRlc1tpIC0gMV0gPj0gbWFnIHx8IHRoaXMubWFnbml0dWRlc1tpIC0gMl0gPj0gbWFnIHx8IHRoaXMubWFnbml0dWRlc1tpICsgMV0gPj0gbWFnIHx8IHRoaXMubWFnbml0dWRlc1tpICsgMl0gPj0gbWFnKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5wZWFrSW5kZXhlc1t0aGlzLm5iUGVha3MrK10gPSBpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHNoaWZ0UGVha3MocGl0Y2hGYWN0b3I6IG51bWJlcikgewogICAgICAgIHRoaXMuZnJlcUNvbXBsZXhCdWZmZXJTaGlmdGVkLmZpbGwoMCk7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uYlBlYWtzOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcGVha0luZGV4ID0gdGhpcy5wZWFrSW5kZXhlc1tpXTsKICAgICAgICAgICAgY29uc3QgcGVha0luZGV4U2hpZnRlZCA9IE1hdGgucm91bmQocGVha0luZGV4ICogcGl0Y2hGYWN0b3IpOwoKICAgICAgICAgICAgaWYgKHBlYWtJbmRleFNoaWZ0ZWQgPiB0aGlzLm1hZ25pdHVkZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAoaSA+IDApID8gcGVha0luZGV4IC0gTWF0aC5mbG9vcigocGVha0luZGV4IC0gdGhpcy5wZWFrSW5kZXhlc1tpIC0gMV0pIC8gMikgOiAwOwogICAgICAgICAgICBsZXQgZW5kSW5kZXggPSAoaSA8IHRoaXMubmJQZWFrcyAtIDEpID8gcGVha0luZGV4ICsgTWF0aC5jZWlsKCh0aGlzLnBlYWtJbmRleGVzW2kgKyAxXSAtIHBlYWtJbmRleCkgLyAyKSA6IHRoaXMuZmZ0U2l6ZTsKCiAgICAgICAgICAgIGZvciAobGV0IGogPSBzdGFydEluZGV4IC0gcGVha0luZGV4OyBqIDwgZW5kSW5kZXggLSBwZWFrSW5kZXg7IGorKykgewogICAgICAgICAgICAgICAgY29uc3QgYmluSW5kZXggPSBwZWFrSW5kZXggKyBqOwogICAgICAgICAgICAgICAgY29uc3QgYmluSW5kZXhTaGlmdGVkID0gcGVha0luZGV4U2hpZnRlZCArIGo7CgogICAgICAgICAgICAgICAgaWYgKGJpbkluZGV4U2hpZnRlZCA+PSB0aGlzLm1hZ25pdHVkZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY29uc3Qgb21lZ2FEZWx0YSA9IDIgKiBNYXRoLlBJICogKGJpbkluZGV4U2hpZnRlZCAtIGJpbkluZGV4KSAvIHRoaXMuZmZ0U2l6ZTsKICAgICAgICAgICAgICAgIGNvbnN0IHBoYXNlU2hpZnRSZWFsID0gTWF0aC5jb3Mob21lZ2FEZWx0YSAqIHRoaXMudGltZUN1cnNvcik7CiAgICAgICAgICAgICAgICBjb25zdCBwaGFzZVNoaWZ0SW1hZyA9IE1hdGguc2luKG9tZWdhRGVsdGEgKiB0aGlzLnRpbWVDdXJzb3IpOwoKICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4UmVhbCA9IGJpbkluZGV4ICogMjsKICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4SW1hZyA9IGluZGV4UmVhbCArIDE7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVJlYWwgPSB0aGlzLmZyZXFDb21wbGV4QnVmZmVyW2luZGV4UmVhbF07CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUltYWcgPSB0aGlzLmZyZXFDb21wbGV4QnVmZmVyW2luZGV4SW1hZ107CgogICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTaGlmdGVkUmVhbCA9IHZhbHVlUmVhbCAqIHBoYXNlU2hpZnRSZWFsIC0gdmFsdWVJbWFnICogcGhhc2VTaGlmdEltYWc7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVNoaWZ0ZWRJbWFnID0gdmFsdWVSZWFsICogcGhhc2VTaGlmdEltYWcgKyB2YWx1ZUltYWcgKiBwaGFzZVNoaWZ0UmVhbDsKCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleFNoaWZ0ZWRSZWFsID0gYmluSW5kZXhTaGlmdGVkICogMjsKICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4U2hpZnRlZEltYWcgPSBpbmRleFNoaWZ0ZWRSZWFsICsgMTsKICAgICAgICAgICAgICAgIHRoaXMuZnJlcUNvbXBsZXhCdWZmZXJTaGlmdGVkW2luZGV4U2hpZnRlZFJlYWxdICs9IHZhbHVlU2hpZnRlZFJlYWw7CiAgICAgICAgICAgICAgICB0aGlzLmZyZXFDb21wbGV4QnVmZmVyU2hpZnRlZFtpbmRleFNoaWZ0ZWRJbWFnXSArPSB2YWx1ZVNoaWZ0ZWRJbWFnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovLyBAdHMtaWdub3JlCnJlZ2lzdGVyUHJvY2Vzc29yKCJwaGFzZS12b2NvZGVyLXByb2Nlc3NvciIsIFBoYXNlVm9jb2RlclByb2Nlc3Nvcik7Cg==\"","import { AudioContext, AudioWorkletNode, IAudioBuffer, IAudioBufferSourceNode, IAudioListener, IBiquadFilterNode, IGainNode, IMediaElementAudioSourceNode, IMediaStreamAudioSourceNode, IPannerNode, IPannerOptions } from 'standardized-audio-context';\nimport { CacheManager } from './cache';\nimport { createStream } from './stream';\nimport PhaseVocoderProcessorUrl from './processors/phase-vocoder.ts?url';\n\nexport enum SoundType {\n HTML = 'HTML',\n Streaming = 'Streaming',\n Buffer = 'Buffer'\n}\n\n\ntype GainNode = IGainNode<AudioContext>;\ntype BiquadFilterNode = IBiquadFilterNode<AudioContext>;\n\ntype AudioBufferSourceNode = IAudioBufferSourceNode<AudioContext>;\ntype MediaElementSourceNode = IMediaElementAudioSourceNode<AudioContext>;\n\ntype SourceNode = AudioBufferSourceNode | MediaElementSourceNode;\n\ntype PannerNode = IPannerNode<AudioContext>;\ntype MediaStreamAudioSourceNode = IMediaStreamAudioSourceNode<AudioContext>;\n\n\nexport type Position = [number, number, number];\n\nexport type Orientation = {\n forward: Position;\n up: Position;\n}\n\n\nexport type LoopCount = number | 'infinite';\n\nexport type FadeType = 'linear' | 'exponential'\n\nexport interface BaseSound {\n // the stuff you should be able to do with anything that makes sound including groups, sounds, and playbacks.\n isPlaying(): boolean;\n play(): BaseSound[];\n seek?(time: number): void;\n stop(): void;\n pause(): void;\n resume(): void;\n addFilter(filter: BiquadFilterNode): void;\n removeFilter(filter: BiquadFilterNode): void;\n volume: number;\n playbackRate: number;\n position: Position;\n loop?(loopCount?: LoopCount): LoopCount;\n // Getter and setter for threeDOptions representing PannerNode attributes\n threeDOptions?: IPannerOptions;\n}\n\nexport class Cacophony {\n context: AudioContext;\n globalGainNode: GainNode;\n listener: IAudioListener;\n private prevVolume: number = 1;\n private finalizationRegistry: FinalizationRegistry<Playback>;\n\n constructor(context?: AudioContext) {\n this.context = context || new AudioContext();\n this.listener = this.context.listener;\n this.globalGainNode = this.context.createGain();\n this.globalGainNode.connect(this.context.destination);\n\n this.finalizationRegistry = new FinalizationRegistry((heldValue) => {\n // Cleanup callback for Playbacks\n heldValue.cleanup();\n });\n }\n\n async loadWorklets() {\n if (this.context.audioWorklet) {\n await createWorkletNode(this.context, 'phase-vocoder', PhaseVocoderProcessorUrl);\n }\n else {\n console.warn('AudioWorklet not supported');\n }\n }\n\n async createSound(buffer: AudioBuffer, type?: SoundType): Promise<Sound>\n\n async createSound(url: string, type?: SoundType): Promise<Sound>\n\n async createSound(bufferOrUrl: AudioBuffer | string, type: SoundType = SoundType.Buffer): Promise<BaseSound> {\n if (bufferOrUrl instanceof AudioBuffer) {\n return Promise.resolve(new Sound(\"\", bufferOrUrl, this.context, this.globalGainNode, SoundType.Buffer));\n }\n const url = bufferOrUrl;\n if (type === SoundType.HTML) {\n const audio = new Audio();\n audio.src = url;\n audio.crossOrigin = 'anonymous';\n return new Sound(url, undefined, this.context, this.globalGainNode, SoundType.HTML);\n }\n return CacheManager.getAudioBuffer(url, this.context).then(buffer => new Sound(url, buffer, this.context, this.globalGainNode, type));\n }\n\n async createGroup(sounds: Sound[]): Promise<Group> {\n const group = new Group();\n sounds.forEach(sound => group.addSound(sound));\n return group;\n }\n\n async createGroupFromUrls(urls: string[]): Promise<Group> {\n const group = new Group();\n const sounds = await Promise.all(urls.map(url => this.createSound(url)));\n sounds.forEach(sound => group.addSound(sound));\n return group;\n }\n\n async createStream(url: string): Promise<Sound> {\n const stream = await createStream(url, this.context);\n const sound = new Sound(url, undefined, this.context, this.globalGainNode, SoundType.Streaming);\n return sound;\n }\n\n createBiquadFilter(type: BiquadFilterType): BiquadFilterNode {\n const filter = this.context.createBiquadFilter();\n filter.type = type;\n return filter;\n }\n\n pause() {\n if ('suspend' in this.context) {\n this.context.suspend();\n }\n }\n\n resume() {\n if ('resume' in this.context) {\n this.context.resume();\n }\n }\n\n setGlobalVolume(volume: number) {\n this.globalGainNode.gain.value = volume;\n }\n\n get volume(): number {\n return this.globalGainNode.gain.value;\n }\n\n set volume(volume: number) {\n if (this.muted) {\n this.prevVolume = volume;\n return;\n }\n this.setGlobalVolume(volume);\n }\n\n mute() {\n if (!this.muted) {\n this.prevVolume = this.globalGainNode.gain.value;\n this.setGlobalVolume(0);\n }\n }\n\n unmute() {\n if (this.muted) {\n this.setGlobalVolume(this.prevVolume);\n }\n }\n\n get muted(): boolean {\n return this.globalGainNode.gain.value === 0;\n }\n\n set muted(muted: boolean) {\n if (muted !== this.muted) {\n if (muted) {\n this.mute();\n } else {\n this.unmute();\n }\n }\n }\n\n getMicrophoneStream(): Promise<MicrophoneStream> {\n return new Promise((resolve, reject) => {\n navigator.mediaDevices.getUserMedia({ audio: true })\n .then(stream => {\n const microphoneStream = new MicrophoneStream(this.context);\n microphoneStream.play();\n resolve(microphoneStream);\n })\n .catch(err => {\n reject(err);\n });\n });\n }\n\n get listenerOrientation(): Orientation {\n return {\n forward: [this.listener.forwardX.value, this.listener.forwardY.value, this.listener.forwardZ.value],\n up: [this.listener.upX.value, this.listener.upY.value, this.listener.upZ.value]\n };\n }\n\n set listenerOrientation(orientation: Orientation) {\n const { forward, up } = orientation;\n const [forwardX, forwardY, forwardZ] = forward;\n const [upX, upY, upZ] = up;\n this.listener.forwardX.setValueAtTime(forwardX, this.context.currentTime);\n this.listener.forwardY.setValueAtTime(forwardY, this.context.currentTime);\n this.listener.forwardZ.setValueAtTime(forwardZ, this.context.currentTime);\n this.listener.upX.setValueAtTime(upX, this.context.currentTime);\n this.listener.upY.setValueAtTime(upY, this.context.currentTime);\n this.listener.upZ.setValueAtTime(upZ, this.context.currentTime);\n }\n\n get listenerUpOrientation(): Position {\n return [this.listener.upX.value, this.listener.upY.value, this.listener.upZ.value];\n }\n\n set listenerUpOrientation(up: Position) {\n const [x, y, z] = up;\n this.listener.upX.setValueAtTime(x, this.context.currentTime);\n this.listener.upY.setValueAtTime(y, this.context.currentTime);\n this.listener.upZ.setValueAtTime(z, this.context.currentTime);\n }\n\n get listenerForwardOrientation(): Position {\n return [this.listener.forwardX.value, this.listener.forwardY.value, this.listener.forwardZ.value];\n }\n\n set listenerForwardOrientation(forward: Position) {\n const [x, y, z] = forward;\n this.listener.forwardX.setValueAtTime(x, this.context.currentTime);\n this.listener.forwardY.setValueAtTime(y, this.context.currentTime);\n this.listener.forwardZ.setValueAtTime(z, this.context.currentTime);\n }\n\n get listenerPosition(): Position {\n return [this.listener.positionX.value, this.listener.positionY.value, this.listener.positionZ.value];\n }\n\n set listenerPosition(position: Position) {\n const [x, y, z] = position;\n this.listener.positionX.setValueAtTime(x, this.context.currentTime);\n this.listener.positionY.setValueAtTime(y, this.context.currentTime);\n this.listener.positionZ.setValueAtTime(z, this.context.currentTime);\n }\n\n}\n\n\nabstract class FilterManager {\n protected filters: BiquadFilterNode[] = [];\n\n addFilter(filter: BiquadFilterNode) {\n this.filters.push(filter);\n }\n\n removeFilter(filter: BiquadFilterNode) {\n this.filters = this.filters.filter(f => f !== filter);\n }\n\n applyFilters(connection: any): any {\n this.filters.reduce((prevConnection, filter) => {\n prevConnection.connect(filter);\n return filter;\n }, connection);\n return this.filters.length > 0 ? this.filters[this.filters.length - 1] : connection;\n }\n}\n\n\nexport class Sound extends FilterManager implements BaseSound {\n buffer?: IAudioBuffer;\n context: AudioContext;\n playbacks: Playback[] = [];\n private globalGainNode: GainNode;\n private _position: Position = [0, 0, 0];\n private _threeDOptions: IPannerOptions = {\n coneInnerAngle: 360,\n coneOuterAngle: 360,\n coneOuterGain: 0,\n distanceModel: 'inverse',\n maxDistance: 10000,\n channelCount: 2,\n channelCountMode: 'clamped-max',\n channelInterpretation: 'speakers',\n panningModel: 'HRTF',\n refDistance: 1,\n rolloffFactor: 1,\n positionX: 0,\n positionY: 0,\n positionZ: 0,\n orientationX: 0,\n orientationY: 0,\n orientationZ: 0\n };\n loopCount: LoopCount = 0;\n private _playbackRate: number = 1;\n private _volume: number = 1;\n\n constructor(public url: string, buffer: AudioBuffer | undefined, context: AudioContext, globalGainNode: GainNode, public type: SoundType = SoundType.Buffer) {\n super();\n this.buffer = buffer;\n this.context = context;\n this.globalGainNode = globalGainNode;\n this._position = [0, 0, 0];\n }\n\n preplay(): Playback[] {\n let source: SourceNode;\n if (this.buffer) {\n source = this.context.createBufferSource();\n source.buffer = this.buffer;\n } else {\n const audio = new Audio();\n audio.crossOrigin = 'anonymous';\n audio.src = this.url;\n audio.preload = \"auto\"\n // we have the audio, let's make a buffer source node out of it\n source = this.context.createMediaElementSource(audio);\n }\n const gainNode = this.context.createGain();\n gainNode.connect(this.globalGainNode);\n const playback = new Playback(source, gainNode, this.context, this.loopCount);\n // this.finalizationRegistry.register(playback, playback);\n playback.volume = this.volume;\n playback.playbackRate = this.playbackRate;\n this.filters.forEach(filter => playback.addFilter(filter));\n playback.threeDOptions = this.threeDOptions;\n playback.position = this.position;\n this.playbacks.push(playback);\n return [playback];\n }\n\n play(): Playback[] {\n const playback = this.preplay();\n playback.forEach(p => p.play());\n return playback;\n }\n\n stop() {\n this.playbacks.forEach(p => p.stop());\n }\n\n pause() {\n if ('suspend' in this.context) {\n this.context.suspend();\n }\n }\n\n resume(): void {\n if ('resume' in this.context) {\n this.context.resume();\n }\n }\n\n seek(time: number): void {\n this.playbacks.forEach(playback => playback.seek(time));\n }\n\n set position(position: Position) {\n this._threeDOptions.positionX = position[0];\n this._threeDOptions.positionY = position[1];\n this._threeDOptions.positionZ = position[2];\n this.playbacks.forEach(p => p.position = position);\n }\n\n get position(): Position {\n return [this._threeDOptions.positionX, this._threeDOptions.positionY, this._threeDOptions.positionZ]\n }\n\n get threeDOptions(): IPannerOptions {\n return this._threeDOptions;\n }\n\n set threeDOptions(options: Partial<IPannerOptions>) {\n this._threeDOptions = { ...this._threeDOptions, ...options };\n this.playbacks.forEach(p => p.threeDOptions = this._threeDOptions);\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n if (loopCount === undefined) {\n return this.loopCount;\n }\n this.loopCount = loopCount;\n this.playbacks.forEach(p => p.sourceLoop = true);\n return this.loopCount;\n }\n\n addFilter(filter: BiquadFilterNode): void {\n super.addFilter(filter);\n this.playbacks.forEach(p => p.addFilter(filter));\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n super.removeFilter(filter);\n this.playbacks.forEach(p => p.removeFilter(filter));\n }\n\n get volume(): number {\n return this._volume;\n }\n\n set volume(volume: number) {\n this._volume = volume;\n this.playbacks.forEach(p => p.volume = volume);\n }\n\n isPlaying(): boolean {\n return this.playbacks.some(p => p.isPlaying());\n }\n\n get playbackRate(): number {\n return this._playbackRate;\n }\n\n set playbackRate(rate: number) {\n this._playbackRate = rate;\n this.playbacks.forEach(p => p.playbackRate = rate);\n }\n\n}\n\nexport class Playback extends FilterManager implements BaseSound {\n private context: AudioContext;\n private source?: SourceNode;\n private gainNode?: GainNode;\n private panner?: PannerNode;\n loopCount: LoopCount = 0;\n currentLoop: number = 0;\n private buffer?: IAudioBuffer;\n private playing: boolean = false;\n\n constructor(source: SourceNode, gainNode: GainNode, context: AudioContext, loopCount: LoopCount = 0) {\n super();\n this.loopCount = loopCount;\n this.source = source;\n if ('buffer' in source && source.buffer) {\n this.buffer = source.buffer;\n }\n if ('mediaElement' in source && source.mediaElement) {\n source.mediaElement.onended = this.handleLoop.bind(this);\n } else if ('onended' in source) {\n source.onended = this.handleLoop.bind(this);\n }\n this.gainNode = gainNode;\n this.context = context;\n this.panner = context.createPanner();\n source.connect(this.panner);\n this.panner.connect(this.gainNode);\n this.refreshFilters();\n }\n\n get playbackRate() {\n if (!this.source) {\n throw new Error('Cannot get playback rate of a sound that has been cleaned up');\n }\n if ('playbackRate' in this.source) {\n return this.source.playbackRate.value;\n }\n if ('mediaElement' in this.source && this.source.mediaElement) {\n return this.source.mediaElement.playbackRate;\n }\n throw new Error('Unsupported source type');\n }\n set playbackRate(rate: number) {\n if (!this.source) {\n throw new Error('Cannot set playback rate of a sound that has been cleaned up');\n }\n if ('playbackRate' in this.source) {\n this.source.playbackRate.value = rate;\n }\n if ('mediaElement' in this.source && this.source.mediaElement) {\n this.source.mediaElement.playbackRate = rate;\n }\n }\n\n handleLoop() {\n if (this.buffer) {\n this.source = this.context.createBufferSource();\n this.source.buffer = this.buffer;\n } else {\n this.seek(0);\n }\n if (this.loopCount === 'infinite' || this.currentLoop < this.loopCount) {\n this.currentLoop++;\n if (this.playing) {\n this.play();\n }\n } else {\n this.playing = false;\n }\n }\n\n\n play(): [this] {\n if (!this.source) {\n throw new Error('Cannot play a sound that has been cleaned up');\n }\n if ('mediaElement' in this.source && this.source.mediaElement) {\n this.source.mediaElement.play();\n } else if ('start' in this.source && this.source.start) {\n this.source.start();\n }\n this.playing = true;\n return [this];\n }\n\n get threeDOptions(): IPannerOptions {\n if (!this.panner) {\n throw new Error('Cannot get 3D options of a sound that has been cleaned up');\n }\n return {\n coneInnerAngle: this.panner.coneInnerAngle,\n coneOuterAngle: this.panner.coneOuterAngle,\n coneOuterGain: this.panner.coneOuterGain,\n distanceModel: this.panner.distanceModel,\n maxDistance: this.panner.maxDistance,\n channelCount: this.panner.channelCount,\n channelCountMode: this.panner.channelCountMode,\n channelInterpretation: this.panner.channelInterpretation,\n panningModel: this.panner.panningModel,\n refDistance: this.panner.refDistance,\n rolloffFactor: this.panner.rolloffFactor,\n positionX: this.panner.positionX.value,\n positionY: this.panner.positionY.value,\n positionZ: this.panner.positionZ.value,\n orientationX: this.panner.orientationX.value,\n orientationY: this.panner.orientationY.value,\n orientationZ: this.panner.orientationZ.value\n }\n }\n\n set threeDOptions(options: Partial<IPannerOptions>) {\n if (!this.panner) {\n throw new Error('Cannot set 3D options of a sound that has been cleaned up');\n }\n this.panner.coneInnerAngle = options.coneInnerAngle || this.panner.coneInnerAngle;\n this.panner.coneOuterAngle = options.coneOuterAngle || this.panner.coneOuterAngle;\n this.panner.coneOuterGain = options.coneOuterGain || this.panner.coneOuterGain;\n this.panner.distanceModel = options.distanceModel || this.panner.distanceModel;\n this.panner.maxDistance = options.maxDistance || this.panner.maxDistance;\n this.panner.channelCount = options.channelCount || this.panner.channelCount;\n this.panner.channelCountMode = options.channelCountMode || this.panner.channelCountMode;\n this.panner.channelInterpretation = options.channelInterpretation || this.panner.channelInterpretation;\n this.panner.panningModel = options.panningModel || this.panner.panningModel;\n this.panner.refDistance = options.refDistance || this.panner.refDistance;\n this.panner.rolloffFactor = options.rolloffFactor || this.panner.rolloffFactor;\n this.panner.positionX.value = options.positionX || this.panner.positionX.value;\n this.panner.positionY.value = options.positionY || this.panner.positionY.value;\n this.panner.positionZ.value = options.positionZ || this.panner.positionZ.value;\n this.panner.orientationX.value = options.orientationX || this.panner.orientationX.value;\n this.panner.orientationY.value = options.orientationY || this.panner.orientationY.value;\n this.panner.orientationZ.value = options.orientationZ || this.panner.orientationZ.value;\n }\n\n seek(time: number): void {\n if (!this.source || !this.buffer || !this.gainNode || !this.panner) {\n throw new Error('Cannot seek a sound that has been cleaned up');\n }\n const playing = this.isPlaying();\n // Stop the current playback\n this.stop(); // Create a new source to start from the desired time\n this.source = this.context.createBufferSource();\n this.source.buffer = this.buffer;\n this.refreshFilters();\n this.source.connect(this.panner).connect(this.gainNode);\n if (playing) {\n this.source.start(0, time);\n }\n }\n\n get volume(): number {\n if (!this.gainNode) {\n throw new Error('Cannot get volume of a sound that has been cleaned up');\n }\n return this.gainNode.gain.value;\n }\n\n set volume(v: number) {\n if (!this.gainNode) {\n throw new Error('Cannot set volume of a sound that has been cleaned up');\n }\n this.gainNode.gain.value = v;\n }\n\n set sourceLoop(loop: boolean) {\n if (!this.source) {\n throw new Error('Cannot set loop on a sound that has been cleaned up');\n }\n if ('loop' in this.source) {\n this.source.loop = loop;\n }\n if (\"mediaElement\" in this.source && this.source.mediaElement) {\n this.source.mediaElement.loop = loop;\n }\n }\n\n fadeIn(time: number, fadeType: FadeType = 'linear'): Promise<void> {\n return new Promise(resolve => {\n if (!this.gainNode) {\n throw new Error('Cannot fade in a sound that has been cleaned up');\n }\n\n const initialVolume = this.gainNode.gain.value;\n const targetVolume = 1; // Assuming the target volume after fade-in is 1 (full volume)\n\n // Reset volume to 0 to start the fade-in process\n this.gainNode.gain.value = 0;\n\n switch (fadeType) {\n case 'exponential':\n // Start at a low value (0.01) because exponentialRampToValueAtTime cannot ramp from 0\n this.gainNode.gain.setValueAtTime(0.01, this.context.currentTime);\n this.gainNode.gain.exponentialRampToValueAtTime(targetVolume, this.context.currentTime + time);\n break;\n case 'linear':\n this.gainNode.gain.linearRampToValueAtTime(targetVolume, this.context.currentTime + time);\n break;\n }\n\n // Resolve the Promise after the fade-in time\n setTimeout(() => {\n // Ensure the final volume is set to the target volume\n if (!this.gainNode) {\n throw new Error('Cannot fade in a sound that has been cleaned up');\n }\n this.gainNode.gain.value = targetVolume;\n resolve();\n }, time * 1000);\n });\n }\n\n fadeOut(time: number, fadeType: FadeType = 'linear'): Promise<void> {\n return new Promise(resolve => {\n // Storing the current gain value\n if (!this.gainNode) {\n throw new Error('Cannot fade out a sound that has been cleaned up');\n }\n const initialVolume = this.gainNode.gain.value;\n switch (fadeType) {\n case 'exponential':\n // Scheduling an exponential fade down\n this.gainNode.gain.exponentialRampToValueAtTime(0.01, this.context.currentTime + time);\n break;\n case 'linear':\n\n // Scheduling a linear ramp to 0 over the given duration\n this.gainNode.gain.linearRampToValueAtTime(0, this.context.currentTime + time);\n }\n // Resolving the Promise after the fade-out time\n setTimeout(() => resolve(), time * 1000);\n });\n }\n\n isPlaying(): boolean {\n if (!this.source) {\n throw new Error('Cannot check if a sound is playing that has been cleaned up');\n }\n return this.playing;\n }\n\n cleanup(): void {\n // Ensure cleanup is idempotent\n if (this.source) {\n this.source.disconnect();\n this.source = undefined;\n }\n if (this.gainNode) {\n this.gainNode.disconnect();\n this.gainNode = undefined;\n }\n this.filters.forEach(filter => {\n if (filter) {\n filter.disconnect();\n }\n });\n this.filters = [];\n // Additional cleanup logic if needed\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n if (!this.source) {\n throw new Error('Cannot loop a sound that has been cleaned up');\n }\n\n // Check if the source is an AudioBufferSourceNode\n if (this.source instanceof AudioBufferSourceNode) {\n if (loopCount === undefined) {\n return this.source.loop === true ? 'infinite' : 0;\n }\n this.source.loop = true;\n this.source.loopEnd = this.source.buffer?.duration || 0;\n this.source.loopStart = 0;\n return this.source.loop === true ? 'infinite' : 0;\n }\n\n // Check if the source is a MediaElementSourceNode\n if (\"mediaElement\" in this.source && this.source.mediaElement) {\n const mediaElement = this.source.mediaElement;\n if (loopCount === undefined) {\n return mediaElement.loop === true ? 'infinite' : 0;\n }\n mediaElement.loop = true;\n // Looping for HTMLMediaElement is controlled by the 'loop' attribute, no need for loopStart or loopEnd\n return mediaElement.loop === true ? 'infinite' : 0;\n }\n\n throw new Error('Unsupported source type');\n }\n\n stop(): void {\n if (!this.source) {\n throw new Error('Cannot stop a sound that has been cleaned up');\n }\n if (!this.isPlaying()) {\n return;\n }\n if ('stop' in this.source) {\n this.source.stop();\n }\n if (\"mediaElement\" in this.source && this.source.mediaElement) {\n this.source.mediaElement.pause();\n this.source.mediaElement.currentTime = 0;\n }\n this.playing = false;\n }\n\n pause(): void {\n if (!this.source) {\n throw new Error('Cannot pause a sound that has been cleaned up');\n }\n if ('suspend' in this.source.context) {\n this.source.context.suspend();\n }\n }\n\n resume(): void {\n if (!this.source) {\n throw new Error('Cannot resume a sound that has been cleaned up');\n }\n if ('resume' in this.source.context) {\n this.source.context.resume();\n }\n }\n\n addFilter(filter: BiquadFilterNode): void {\n super.addFilter(filter);\n this.refreshFilters();\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n super.removeFilter(filter);\n this.refreshFilters();\n }\n\n set position(position: Position) {\n if (!this.panner) {\n throw new Error('Cannot move a sound that has been cleaned up');\n }\n const [x, y, z] = position;\n this.panner.positionX.setValueAtTime(x, this.context.currentTime);\n this.panner.positionY.setValueAtTime(y, this.context.currentTime);\n this.panner.positionZ.setValueAtTime(z, this.context.currentTime);\n }\n\n get position(): Position {\n if (!this.panner) {\n throw new Error('Cannot get position of a sound that has been cleaned up');\n }\n return [this.panner.positionX.value, this.panner.positionY.value, this.panner.positionZ.value];\n }\n\n private refreshFilters(): void {\n if (!this.panner || !this.gainNode) {\n throw new Error('Cannot update filters on a sound that has been cleaned up');\n }\n let connection = this.panner;\n connection.disconnect();\n connection = this.applyFilters(connection);\n connection.connect(this.gainNode);\n }\n}\n\n\nexport class Group implements BaseSound {\n sounds: BaseSound[] = [];\n private _position: Position = [0, 0, 0];\n loopCount: LoopCount = 0;\n\n seek(time: number): void {\n this.sounds.forEach(sound => sound.seek && sound.seek(time));\n }\n\n addSound(sound: BaseSound): void {\n this.sounds.push(sound);\n }\n\n preplay(): Playback[] {\n return (this.sounds as Sound[]).reduce<Playback[]>((playbacks, sound) => {\n sound.loop && sound.loop(this.loopCount);\n return playbacks.concat(sound.preplay());\n }, []);\n }\n\n play(): Playback[] {\n return this.preplay().map(playback => {\n playback.play();\n return playback;\n });\n }\n\n isPlaying(): boolean {\n return this.sounds.some(sound => sound.isPlaying());\n }\n\n stop(): void {\n this.sounds.forEach(sound => sound.stop());\n }\n\n pause(): void {\n this.sounds.forEach(sound => sound.pause());\n }\n\n resume(): void {\n this.sounds.forEach(sound => sound.resume());\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n if (loopCount === undefined) {\n return this.loopCount;\n }\n this.loopCount = loopCount;\n this.sounds.forEach(sound => sound.loop && sound.loop(loopCount));\n return this.loopCount;\n }\n\n addFilter(filter: BiquadFilterNode): void {\n this.sounds.forEach(sound => sound.addFilter(filter));\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n this.sounds.forEach(sound => sound.removeFilter(filter));\n }\n\n set position(position: [number, number, number]) {\n this._position = position;\n this.sounds.forEach(sound => sound.position = this._position);\n }\n\n get position(): [number, number, number] {\n return this._position;\n }\n\n get volume(): number {\n return this.sounds.map(sound => sound.volume).reduce((a, b) => a + b, 0) / this.sounds.length;\n }\n\n set volume(volume: number) {\n this.sounds.forEach(sound => sound.volume = volume);\n }\n\n get playbackRate(): number {\n if (this.sounds.length === 0) {\n return 1;\n }\n return this.sounds[0].playbackRate\n }\n\n set playbackRate(rate: number) {\n this.sounds.forEach(sound => sound.playbackRate = rate);\n }\n\n\n}\n\nexport class MicrophonePlayback extends FilterManager {\n private context: AudioContext;\n private source?: MediaStreamAudioSourceNode;\n private gainNode?: GainNode;\n private panner?: PannerNode;\n\n constructor(source: MediaStreamAudioSourceNode, gainNode: GainNode, context: AudioContext, loopCount: LoopCount = 0) {\n super();\n this.source = source;\n this.gainNode = gainNode;\n this.context = context;\n this.panner = context.createPanner();\n source.connect(this.panner).connect(this.gainNode);\n this.refreshFilters();\n }\n\n play() {\n if (!this.source) {\n throw new Error('Cannot play a sound that has been cleaned up');\n }\n return [this];\n }\n\n isPlaying() {\n return Boolean(this.source);\n }\n\n get volume(): number {\n if (!this.gainNode) {\n throw new Error('Cannot get volume of a sound that has been cleaned up');\n }\n return this.gainNode.gain.value;\n }\n\n set volume(v: number) {\n if (!this.gainNode) {\n throw new Error('Cannot set volume of a sound that has been cleaned up');\n }\n this.gainNode.gain.value = v;\n }\n\n stop(): void {\n if (!this.source) {\n throw new Error('Cannot stop a sound that has been cleaned up');\n }\n this.source.mediaStream.getTracks().forEach(track => track.stop());\n }\n\n pause(): void {\n if (!this.source) {\n throw new Error('Cannot pause a sound that has been cleaned up');\n }\n this.source.mediaStream.getTracks().forEach(track => track.enabled = false);\n }\n\n resume(): void {\n if (!this.source) {\n throw new Error('Cannot resume a sound that has been cleaned up');\n }\n this.source.mediaStream.getTracks().forEach(track => track.enabled = true);\n }\n\n addFilter(filter: BiquadFilterNode): void {\n super.addFilter(filter);\n this.refreshFilters();\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n super.removeFilter(filter);\n this.refreshFilters();\n }\n\n set position(position: Position) {\n if (!this.panner) {\n throw new Error('Cannot move a sound that has been cleaned up');\n }\n const [x, y, z] = position;\n this.panner.positionX.value = x;\n this.panner.positionY.value = y;\n this.panner.positionZ.value = z;\n }\n\n get position(): Position {\n if (!this.panner) {\n throw new Error('Cannot get position of a sound that has been cleaned up');\n }\n return [this.panner.positionX.value, this.panner.positionY.value, this.panner.positionZ.value];\n }\n\n private refreshFilters(): void {\n if (!this.source || !this.gainNode) {\n throw new Error('Cannot update filters on a sound that has been cleaned up');\n }\n let connection = this.source;\n this.source.disconnect();\n connection = this.applyFilters(connection);\n connection.connect(this.gainNode);\n }\n\n get playbackRate(): number {\n // Playback rate is not applicable for live microphone stream\n return 1;\n }\n\n set playbackRate(rate: number) {\n }\n\n\n\n}\n\nexport class MicrophoneStream extends FilterManager implements BaseSound {\n context: AudioContext;\n private _position: Position = [0, 0, 0];\n loopCount: LoopCount = 0;\n private prevVolume: number = 1;\n private microphoneGainNode: GainNode;\n private streamPlayback?: MicrophonePlayback;\n private stream: MediaStream | undefined;\n private streamSource?: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext) {\n super();\n this.context = context;\n this.microphoneGainNode = this.context.createGain();\n }\n\n play(): MicrophonePlayback[] {\n if (!this.stream) {\n navigator.mediaDevices.getUserMedia({ audio: true })\n .then(stream => {\n this.stream = stream;\n this.streamSource = this.context.createMediaStreamSource(this.stream);\n this.streamPlayback = new MicrophonePlayback(this.streamSource, this.microphoneGainNode, this.context);\n this.streamPlayback.play();\n })\n .catch(err => {\n console.error('Error initializing microphone stream:', err);\n });\n }\n return this.streamPlayback ? [this.streamPlayback] : [];\n }\n\n seek(time: number) {\n // Seeking is not applicable for live microphone stream\n }\n\n isPlaying(): boolean {\n return Boolean(this.streamPlayback);\n }\n\n stop() {\n if (this.streamPlayback) {\n this.streamPlayback.stop();\n this.streamPlayback = undefined;\n }\n }\n\n pause() {\n if (this.streamPlayback) {\n this.streamPlayback.pause();\n }\n }\n\n resume() {\n if (this.streamPlayback) {\n this.streamPlayback.resume();\n }\n }\n\n addFilter(filter: BiquadFilterNode): void {\n if (this.streamPlayback) {\n this.streamPlayback.addFilter(filter);\n }\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n if (this.streamPlayback) {\n this.streamPlayback.removeFilter(filter);\n }\n }\n\n get volume(): number {\n return this.streamPlayback ? this.streamPlayback.volume : 0;\n }\n\n set volume(volume: number) {\n if (this.streamPlayback) {\n this.streamPlayback.volume = volume;\n }\n }\n\n get position(): Position {\n // Position is not applicable for live microphone stream\n return [0, 0, 0];\n }\n\n set position(position: Position) {\n // Position is not applicable for live microphone stream\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n // Looping is not applicable for live microphone stream\n return 0;\n }\n\n\n get playbackRate(): number {\n // Playback rate is not applicable for live microphone stream\n return 1;\n }\n\n set playbackRate(rate: number) {\n }\n\n}\n\nasync function createWorkletNode(\n context: AudioContext,\n name: string,\n url: string\n) {\n // ensure audioWorklet has been loaded\n if (!context.audioWorklet) {\n throw new Error('AudioWorklet not supported');\n }\n\n try {\n return new AudioWorkletNode!(context, name);\n } catch (err) {\n await context.audioWorklet.addModule(url);\n return new AudioWorkletNode!(context, name);\n }\n}\n\n"],"names":["CacheManager","error","url","cache","context","response","arrayBuffer","fetchResponse","responseClone","pendingRequest","bufferFromCache","appendBuffer","buffer1","buffer2","tmp","createStream","audioStack","nextTime","reader","header","read","value","done","audioBuffer","buffer","scheduleBuffers","err","source","PhaseVocoderProcessorUrl","SoundType","Cacophony","AudioContext","heldValue","createWorkletNode","bufferOrUrl","type","Sound","audio","sounds","group","Group","sound","urls","filter","volume","muted","resolve","reject","stream","microphoneStream","MicrophoneStream","orientation","forward","up","forwardX","forwardY","forwardZ","upX","upY","upZ","x","y","z","position","FilterManager","f","connection","prevConnection","globalGainNode","gainNode","playback","Playback","p","time","options","loopCount","rate","playing","v","loop","fadeType","targetVolume","mediaElement","playbacks","a","b","MicrophonePlayback","track","name","AudioWorkletNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cacophony.cjs.js","sources":["../src/cache.ts","../src/stream.ts","../src/cacophony.ts"],"sourcesContent":["import { IAudioContext } from \"standardized-audio-context\";\n\nexport class CacheManager {\n private static pendingRequests = new Map<string, Promise<AudioBuffer>>();\n\n private static async openCache(): Promise<Cache> {\n try {\n return await caches.open('audio-cache');\n } catch (error) {\n console.error('Failed to open cache:', error);\n throw error;\n }\n }\n\n private static async getAudioBufferFromCache(url: string, cache: Cache, context: IAudioContext): Promise<AudioBuffer | null> {\n try {\n const response = await cache.match(url);\n if (response) {\n const arrayBuffer = await response.arrayBuffer();\n return context.decodeAudioData(arrayBuffer);\n }\n return null;\n } catch (error) {\n console.error('Failed to get audio data from cache:', error);\n throw error;\n }\n }\n\n private static async fetchAndCacheAudioBuffer(url: string, cache: Cache, context: IAudioContext): Promise<AudioBuffer> {\n try {\n const fetchResponse = await fetch(url);\n const responseClone = fetchResponse.clone();\n cache.put(url, responseClone);\n const arrayBuffer = await fetchResponse.arrayBuffer();\n return context.decodeAudioData(arrayBuffer);\n } catch (error) {\n console.error('Failed to fetch and cache audio data:', error);\n throw error;\n }\n }\n\n public static async getAudioBuffer(url: string, context: IAudioContext): Promise<AudioBuffer> {\n const cache = await this.openCache();\n\n // First, check if there's a pending request.\n let pendingRequest = this.pendingRequests.get(url);\n if (pendingRequest) {\n return pendingRequest;\n }\n\n // Try getting the buffer from cache.\n const bufferFromCache = await this.getAudioBufferFromCache(url, cache, context);\n if (bufferFromCache) {\n return bufferFromCache;\n }\n\n // If it's not in the cache, fetch and cache it.\n pendingRequest = this.fetchAndCacheAudioBuffer(url, cache, context);\n this.pendingRequests.set(url, pendingRequest);\n\n return pendingRequest;\n }\n}\n","import { AudioContext, IAudioBuffer, IAudioBufferSourceNode, IAudioListener, IBiquadFilterNode, IGainNode, IMediaElementAudioSourceNode, IMediaStreamAudioSourceNode, IPannerNode, IPannerOptions } from 'standardized-audio-context';\n\n\nconst appendBuffer = (buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer => {\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp.buffer;\n}\n\n\nexport function createStream(url: string, context: AudioContext) {\n const audioStack: IAudioBuffer[] = [];\n let nextTime = 0;\n\n fetch(url).then(function (response) {\n if (!response.ok) {\n throw new Error('HTTP error, status = ' + response.status);\n }\n if (!response.body) {\n throw new Error('Missing body');\n }\n\n var reader = response.body.getReader();\n let header = new ArrayBuffer(0);//first 44bytes\n\n function read() {\n return reader.read().then(({ value, done }) => {\n let audioBuffer = null;\n if (!value) {\n return;\n }\n\n if (!header.byteLength) {\n //copy first 44 bytes (wav header)\n header = value.buffer.slice(0, 44);\n audioBuffer = value.buffer;\n } else {\n audioBuffer = appendBuffer(header, value.buffer);\n }\n\n context.decodeAudioData(audioBuffer, function (buffer) {\n\n audioStack.push(buffer);\n if (audioStack.length) {\n scheduleBuffers();\n }\n }, function (err) {\n console.log(\"err(decodeAudioData): \" + err);\n });\n if (done) {\n console.log('done');\n return;\n }\n //read next buffer\n read();\n });\n }\n read();\n })\n\n function scheduleBuffers() {\n while (audioStack.length) {\n let buffer = audioStack.shift();\n const source = context.createBufferSource();\n if (!buffer) {\n return;\n }\n source.buffer = buffer;\n source.connect(context.destination);\n if (nextTime == 0)\n nextTime = context.currentTime + 0.02; /// add 50ms latency to work well across systems - tune this if you like\n source.start(nextTime);\n nextTime += source.buffer.duration; // Make the next buffer wait the length of the last buffer before being played\n };\n }\n}\n\n","import { AudioContext, AudioWorkletNode, IAudioBuffer, IAudioBufferSourceNode, IAudioListener, IBiquadFilterNode, IGainNode, IMediaElementAudioSourceNode, IMediaStreamAudioSourceNode, IPannerNode, IPannerOptions } from 'standardized-audio-context';\nimport { CacheManager } from './cache';\nimport { createStream } from './stream';\nimport PhaseVocoderProcessorUrl from './processors/phase-vocoder.ts?worker&url';\n\nexport enum SoundType {\n HTML = 'HTML',\n Streaming = 'Streaming',\n Buffer = 'Buffer'\n}\n\n\ntype GainNode = IGainNode<AudioContext>;\ntype BiquadFilterNode = IBiquadFilterNode<AudioContext>;\n\ntype AudioBufferSourceNode = IAudioBufferSourceNode<AudioContext>;\ntype MediaElementSourceNode = IMediaElementAudioSourceNode<AudioContext>;\n\ntype SourceNode = AudioBufferSourceNode | MediaElementSourceNode;\n\ntype PannerNode = IPannerNode<AudioContext>;\ntype MediaStreamAudioSourceNode = IMediaStreamAudioSourceNode<AudioContext>;\n\n\nexport type Position = [number, number, number];\n\nexport type Orientation = {\n forward: Position;\n up: Position;\n}\n\n\nexport type LoopCount = number | 'infinite';\n\nexport type FadeType = 'linear' | 'exponential'\n\nexport interface BaseSound {\n // the stuff you should be able to do with anything that makes sound including groups, sounds, and playbacks.\n isPlaying(): boolean;\n play(): BaseSound[];\n seek?(time: number): void;\n stop(): void;\n pause(): void;\n resume(): void;\n addFilter(filter: BiquadFilterNode): void;\n removeFilter(filter: BiquadFilterNode): void;\n volume: number;\n playbackRate: number;\n position: Position;\n loop?(loopCount?: LoopCount): LoopCount;\n // Getter and setter for threeDOptions representing PannerNode attributes\n threeDOptions?: IPannerOptions;\n}\n\nexport class Cacophony {\n context: AudioContext;\n globalGainNode: GainNode;\n listener: IAudioListener;\n private prevVolume: number = 1;\n private finalizationRegistry: FinalizationRegistry<Playback>;\n\n constructor(context?: AudioContext) {\n this.context = context || new AudioContext();\n this.listener = this.context.listener;\n this.globalGainNode = this.context.createGain();\n this.globalGainNode.connect(this.context.destination);\n\n this.finalizationRegistry = new FinalizationRegistry((heldValue) => {\n // Cleanup callback for Playbacks\n heldValue.cleanup();\n });\n }\n\n async loadWorklets() {\n if (this.context.audioWorklet) {\n await createWorkletNode(this.context, 'phase-vocoder', PhaseVocoderProcessorUrl);\n }\n else {\n console.warn('AudioWorklet not supported');\n }\n }\n\n async createSound(buffer: AudioBuffer, type?: SoundType): Promise<Sound>\n\n async createSound(url: string, type?: SoundType): Promise<Sound>\n\n async createSound(bufferOrUrl: AudioBuffer | string, type: SoundType = SoundType.Buffer): Promise<BaseSound> {\n if (bufferOrUrl instanceof AudioBuffer) {\n return Promise.resolve(new Sound(\"\", bufferOrUrl, this.context, this.globalGainNode, SoundType.Buffer));\n }\n const url = bufferOrUrl;\n if (type === SoundType.HTML) {\n const audio = new Audio();\n audio.src = url;\n audio.crossOrigin = 'anonymous';\n return new Sound(url, undefined, this.context, this.globalGainNode, SoundType.HTML);\n }\n return CacheManager.getAudioBuffer(url, this.context).then(buffer => new Sound(url, buffer, this.context, this.globalGainNode, type));\n }\n\n async createGroup(sounds: Sound[]): Promise<Group> {\n const group = new Group();\n sounds.forEach(sound => group.addSound(sound));\n return group;\n }\n\n async createGroupFromUrls(urls: string[]): Promise<Group> {\n const group = new Group();\n const sounds = await Promise.all(urls.map(url => this.createSound(url)));\n sounds.forEach(sound => group.addSound(sound));\n return group;\n }\n\n async createStream(url: string): Promise<Sound> {\n const stream = await createStream(url, this.context);\n const sound = new Sound(url, undefined, this.context, this.globalGainNode, SoundType.Streaming);\n return sound;\n }\n\n createBiquadFilter(type: BiquadFilterType): BiquadFilterNode {\n const filter = this.context.createBiquadFilter();\n filter.type = type;\n return filter;\n }\n\n pause() {\n if ('suspend' in this.context) {\n this.context.suspend();\n }\n }\n\n resume() {\n if ('resume' in this.context) {\n this.context.resume();\n }\n }\n\n setGlobalVolume(volume: number) {\n this.globalGainNode.gain.value = volume;\n }\n\n get volume(): number {\n return this.globalGainNode.gain.value;\n }\n\n set volume(volume: number) {\n if (this.muted) {\n this.prevVolume = volume;\n return;\n }\n this.setGlobalVolume(volume);\n }\n\n mute() {\n if (!this.muted) {\n this.prevVolume = this.globalGainNode.gain.value;\n this.setGlobalVolume(0);\n }\n }\n\n unmute() {\n if (this.muted) {\n this.setGlobalVolume(this.prevVolume);\n }\n }\n\n get muted(): boolean {\n return this.globalGainNode.gain.value === 0;\n }\n\n set muted(muted: boolean) {\n if (muted !== this.muted) {\n if (muted) {\n this.mute();\n } else {\n this.unmute();\n }\n }\n }\n\n getMicrophoneStream(): Promise<MicrophoneStream> {\n return new Promise((resolve, reject) => {\n navigator.mediaDevices.getUserMedia({ audio: true })\n .then(stream => {\n const microphoneStream = new MicrophoneStream(this.context);\n microphoneStream.play();\n resolve(microphoneStream);\n })\n .catch(err => {\n reject(err);\n });\n });\n }\n\n get listenerOrientation(): Orientation {\n return {\n forward: [this.listener.forwardX.value, this.listener.forwardY.value, this.listener.forwardZ.value],\n up: [this.listener.upX.value, this.listener.upY.value, this.listener.upZ.value]\n };\n }\n\n set listenerOrientation(orientation: Orientation) {\n const { forward, up } = orientation;\n const [forwardX, forwardY, forwardZ] = forward;\n const [upX, upY, upZ] = up;\n this.listener.forwardX.setValueAtTime(forwardX, this.context.currentTime);\n this.listener.forwardY.setValueAtTime(forwardY, this.context.currentTime);\n this.listener.forwardZ.setValueAtTime(forwardZ, this.context.currentTime);\n this.listener.upX.setValueAtTime(upX, this.context.currentTime);\n this.listener.upY.setValueAtTime(upY, this.context.currentTime);\n this.listener.upZ.setValueAtTime(upZ, this.context.currentTime);\n }\n\n get listenerUpOrientation(): Position {\n return [this.listener.upX.value, this.listener.upY.value, this.listener.upZ.value];\n }\n\n set listenerUpOrientation(up: Position) {\n const [x, y, z] = up;\n this.listener.upX.setValueAtTime(x, this.context.currentTime);\n this.listener.upY.setValueAtTime(y, this.context.currentTime);\n this.listener.upZ.setValueAtTime(z, this.context.currentTime);\n }\n\n get listenerForwardOrientation(): Position {\n return [this.listener.forwardX.value, this.listener.forwardY.value, this.listener.forwardZ.value];\n }\n\n set listenerForwardOrientation(forward: Position) {\n const [x, y, z] = forward;\n this.listener.forwardX.setValueAtTime(x, this.context.currentTime);\n this.listener.forwardY.setValueAtTime(y, this.context.currentTime);\n this.listener.forwardZ.setValueAtTime(z, this.context.currentTime);\n }\n\n get listenerPosition(): Position {\n return [this.listener.positionX.value, this.listener.positionY.value, this.listener.positionZ.value];\n }\n\n set listenerPosition(position: Position) {\n const [x, y, z] = position;\n this.listener.positionX.setValueAtTime(x, this.context.currentTime);\n this.listener.positionY.setValueAtTime(y, this.context.currentTime);\n this.listener.positionZ.setValueAtTime(z, this.context.currentTime);\n }\n\n}\n\n\nabstract class FilterManager {\n protected filters: BiquadFilterNode[] = [];\n\n addFilter(filter: BiquadFilterNode) {\n this.filters.push(filter);\n }\n\n removeFilter(filter: BiquadFilterNode) {\n this.filters = this.filters.filter(f => f !== filter);\n }\n\n applyFilters(connection: any): any {\n this.filters.reduce((prevConnection, filter) => {\n prevConnection.connect(filter);\n return filter;\n }, connection);\n return this.filters.length > 0 ? this.filters[this.filters.length - 1] : connection;\n }\n}\n\n\nexport class Sound extends FilterManager implements BaseSound {\n buffer?: IAudioBuffer;\n context: AudioContext;\n playbacks: Playback[] = [];\n private globalGainNode: GainNode;\n private _position: Position = [0, 0, 0];\n private _threeDOptions: IPannerOptions = {\n coneInnerAngle: 360,\n coneOuterAngle: 360,\n coneOuterGain: 0,\n distanceModel: 'inverse',\n maxDistance: 10000,\n channelCount: 2,\n channelCountMode: 'clamped-max',\n channelInterpretation: 'speakers',\n panningModel: 'HRTF',\n refDistance: 1,\n rolloffFactor: 1,\n positionX: 0,\n positionY: 0,\n positionZ: 0,\n orientationX: 0,\n orientationY: 0,\n orientationZ: 0\n };\n loopCount: LoopCount = 0;\n private _playbackRate: number = 1;\n private _volume: number = 1;\n\n constructor(public url: string, buffer: AudioBuffer | undefined, context: AudioContext, globalGainNode: GainNode, public type: SoundType = SoundType.Buffer) {\n super();\n this.buffer = buffer;\n this.context = context;\n this.globalGainNode = globalGainNode;\n this._position = [0, 0, 0];\n }\n\n preplay(): Playback[] {\n let source: SourceNode;\n if (this.buffer) {\n source = this.context.createBufferSource();\n source.buffer = this.buffer;\n } else {\n const audio = new Audio();\n audio.crossOrigin = 'anonymous';\n audio.src = this.url;\n audio.preload = \"auto\"\n // we have the audio, let's make a buffer source node out of it\n source = this.context.createMediaElementSource(audio);\n }\n const gainNode = this.context.createGain();\n gainNode.connect(this.globalGainNode);\n const playback = new Playback(source, gainNode, this.context, this.loopCount);\n // this.finalizationRegistry.register(playback, playback);\n playback.volume = this.volume;\n playback.playbackRate = this.playbackRate;\n this.filters.forEach(filter => playback.addFilter(filter));\n playback.threeDOptions = this.threeDOptions;\n playback.position = this.position;\n this.playbacks.push(playback);\n return [playback];\n }\n\n play(): Playback[] {\n const playback = this.preplay();\n playback.forEach(p => p.play());\n return playback;\n }\n\n stop() {\n this.playbacks.forEach(p => p.stop());\n }\n\n pause() {\n if ('suspend' in this.context) {\n this.context.suspend();\n }\n }\n\n resume(): void {\n if ('resume' in this.context) {\n this.context.resume();\n }\n }\n\n seek(time: number): void {\n this.playbacks.forEach(playback => playback.seek(time));\n }\n\n set position(position: Position) {\n this._threeDOptions.positionX = position[0];\n this._threeDOptions.positionY = position[1];\n this._threeDOptions.positionZ = position[2];\n this.playbacks.forEach(p => p.position = position);\n }\n\n get position(): Position {\n return [this._threeDOptions.positionX, this._threeDOptions.positionY, this._threeDOptions.positionZ]\n }\n\n get threeDOptions(): IPannerOptions {\n return this._threeDOptions;\n }\n\n set threeDOptions(options: Partial<IPannerOptions>) {\n this._threeDOptions = { ...this._threeDOptions, ...options };\n this.playbacks.forEach(p => p.threeDOptions = this._threeDOptions);\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n if (loopCount === undefined) {\n return this.loopCount;\n }\n this.loopCount = loopCount;\n this.playbacks.forEach(p => p.sourceLoop = true);\n return this.loopCount;\n }\n\n addFilter(filter: BiquadFilterNode): void {\n super.addFilter(filter);\n this.playbacks.forEach(p => p.addFilter(filter));\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n super.removeFilter(filter);\n this.playbacks.forEach(p => p.removeFilter(filter));\n }\n\n get volume(): number {\n return this._volume;\n }\n\n set volume(volume: number) {\n this._volume = volume;\n this.playbacks.forEach(p => p.volume = volume);\n }\n\n isPlaying(): boolean {\n return this.playbacks.some(p => p.isPlaying());\n }\n\n get playbackRate(): number {\n return this._playbackRate;\n }\n\n set playbackRate(rate: number) {\n this._playbackRate = rate;\n this.playbacks.forEach(p => p.playbackRate = rate);\n }\n\n}\n\nexport class Playback extends FilterManager implements BaseSound {\n private context: AudioContext;\n private source?: SourceNode;\n private gainNode?: GainNode;\n private panner?: PannerNode;\n loopCount: LoopCount = 0;\n currentLoop: number = 0;\n private buffer?: IAudioBuffer;\n private playing: boolean = false;\n\n constructor(source: SourceNode, gainNode: GainNode, context: AudioContext, loopCount: LoopCount = 0) {\n super();\n this.loopCount = loopCount;\n this.source = source;\n if ('buffer' in source && source.buffer) {\n this.buffer = source.buffer;\n }\n if ('mediaElement' in source && source.mediaElement) {\n source.mediaElement.onended = this.handleLoop.bind(this);\n } else if ('onended' in source) {\n source.onended = this.handleLoop.bind(this);\n }\n this.gainNode = gainNode;\n this.context = context;\n this.panner = context.createPanner();\n source.connect(this.panner);\n this.panner.connect(this.gainNode);\n this.refreshFilters();\n }\n\n get playbackRate() {\n if (!this.source) {\n throw new Error('Cannot get playback rate of a sound that has been cleaned up');\n }\n if ('playbackRate' in this.source) {\n return this.source.playbackRate.value;\n }\n if ('mediaElement' in this.source && this.source.mediaElement) {\n return this.source.mediaElement.playbackRate;\n }\n throw new Error('Unsupported source type');\n }\n set playbackRate(rate: number) {\n if (!this.source) {\n throw new Error('Cannot set playback rate of a sound that has been cleaned up');\n }\n if ('playbackRate' in this.source) {\n this.source.playbackRate.value = rate;\n }\n if ('mediaElement' in this.source && this.source.mediaElement) {\n this.source.mediaElement.playbackRate = rate;\n }\n }\n\n handleLoop() {\n if (this.buffer) {\n this.source = this.context.createBufferSource();\n this.source.buffer = this.buffer;\n } else {\n this.seek(0);\n }\n if (this.loopCount === 'infinite' || this.currentLoop < this.loopCount) {\n this.currentLoop++;\n if (this.playing) {\n this.play();\n }\n } else {\n this.playing = false;\n }\n }\n\n\n play(): [this] {\n if (!this.source) {\n throw new Error('Cannot play a sound that has been cleaned up');\n }\n if ('mediaElement' in this.source && this.source.mediaElement) {\n this.source.mediaElement.play();\n } else if ('start' in this.source && this.source.start) {\n this.source.start();\n }\n this.playing = true;\n return [this];\n }\n\n get threeDOptions(): IPannerOptions {\n if (!this.panner) {\n throw new Error('Cannot get 3D options of a sound that has been cleaned up');\n }\n return {\n coneInnerAngle: this.panner.coneInnerAngle,\n coneOuterAngle: this.panner.coneOuterAngle,\n coneOuterGain: this.panner.coneOuterGain,\n distanceModel: this.panner.distanceModel,\n maxDistance: this.panner.maxDistance,\n channelCount: this.panner.channelCount,\n channelCountMode: this.panner.channelCountMode,\n channelInterpretation: this.panner.channelInterpretation,\n panningModel: this.panner.panningModel,\n refDistance: this.panner.refDistance,\n rolloffFactor: this.panner.rolloffFactor,\n positionX: this.panner.positionX.value,\n positionY: this.panner.positionY.value,\n positionZ: this.panner.positionZ.value,\n orientationX: this.panner.orientationX.value,\n orientationY: this.panner.orientationY.value,\n orientationZ: this.panner.orientationZ.value\n }\n }\n\n set threeDOptions(options: Partial<IPannerOptions>) {\n if (!this.panner) {\n throw new Error('Cannot set 3D options of a sound that has been cleaned up');\n }\n this.panner.coneInnerAngle = options.coneInnerAngle || this.panner.coneInnerAngle;\n this.panner.coneOuterAngle = options.coneOuterAngle || this.panner.coneOuterAngle;\n this.panner.coneOuterGain = options.coneOuterGain || this.panner.coneOuterGain;\n this.panner.distanceModel = options.distanceModel || this.panner.distanceModel;\n this.panner.maxDistance = options.maxDistance || this.panner.maxDistance;\n this.panner.channelCount = options.channelCount || this.panner.channelCount;\n this.panner.channelCountMode = options.channelCountMode || this.panner.channelCountMode;\n this.panner.channelInterpretation = options.channelInterpretation || this.panner.channelInterpretation;\n this.panner.panningModel = options.panningModel || this.panner.panningModel;\n this.panner.refDistance = options.refDistance || this.panner.refDistance;\n this.panner.rolloffFactor = options.rolloffFactor || this.panner.rolloffFactor;\n this.panner.positionX.value = options.positionX || this.panner.positionX.value;\n this.panner.positionY.value = options.positionY || this.panner.positionY.value;\n this.panner.positionZ.value = options.positionZ || this.panner.positionZ.value;\n this.panner.orientationX.value = options.orientationX || this.panner.orientationX.value;\n this.panner.orientationY.value = options.orientationY || this.panner.orientationY.value;\n this.panner.orientationZ.value = options.orientationZ || this.panner.orientationZ.value;\n }\n\n seek(time: number): void {\n if (!this.source || !this.buffer || !this.gainNode || !this.panner) {\n throw new Error('Cannot seek a sound that has been cleaned up');\n }\n const playing = this.isPlaying();\n // Stop the current playback\n this.stop(); // Create a new source to start from the desired time\n this.source = this.context.createBufferSource();\n this.source.buffer = this.buffer;\n this.refreshFilters();\n this.source.connect(this.panner).connect(this.gainNode);\n if (playing) {\n this.source.start(0, time);\n }\n }\n\n get volume(): number {\n if (!this.gainNode) {\n throw new Error('Cannot get volume of a sound that has been cleaned up');\n }\n return this.gainNode.gain.value;\n }\n\n set volume(v: number) {\n if (!this.gainNode) {\n throw new Error('Cannot set volume of a sound that has been cleaned up');\n }\n this.gainNode.gain.value = v;\n }\n\n set sourceLoop(loop: boolean) {\n if (!this.source) {\n throw new Error('Cannot set loop on a sound that has been cleaned up');\n }\n if ('loop' in this.source) {\n this.source.loop = loop;\n }\n if (\"mediaElement\" in this.source && this.source.mediaElement) {\n this.source.mediaElement.loop = loop;\n }\n }\n\n fadeIn(time: number, fadeType: FadeType = 'linear'): Promise<void> {\n return new Promise(resolve => {\n if (!this.gainNode) {\n throw new Error('Cannot fade in a sound that has been cleaned up');\n }\n\n const initialVolume = this.gainNode.gain.value;\n const targetVolume = 1; // Assuming the target volume after fade-in is 1 (full volume)\n\n // Reset volume to 0 to start the fade-in process\n this.gainNode.gain.value = 0;\n\n switch (fadeType) {\n case 'exponential':\n // Start at a low value (0.01) because exponentialRampToValueAtTime cannot ramp from 0\n this.gainNode.gain.setValueAtTime(0.01, this.context.currentTime);\n this.gainNode.gain.exponentialRampToValueAtTime(targetVolume, this.context.currentTime + time);\n break;\n case 'linear':\n this.gainNode.gain.linearRampToValueAtTime(targetVolume, this.context.currentTime + time);\n break;\n }\n\n // Resolve the Promise after the fade-in time\n setTimeout(() => {\n // Ensure the final volume is set to the target volume\n if (!this.gainNode) {\n throw new Error('Cannot fade in a sound that has been cleaned up');\n }\n this.gainNode.gain.value = targetVolume;\n resolve();\n }, time * 1000);\n });\n }\n\n fadeOut(time: number, fadeType: FadeType = 'linear'): Promise<void> {\n return new Promise(resolve => {\n // Storing the current gain value\n if (!this.gainNode) {\n throw new Error('Cannot fade out a sound that has been cleaned up');\n }\n const initialVolume = this.gainNode.gain.value;\n switch (fadeType) {\n case 'exponential':\n // Scheduling an exponential fade down\n this.gainNode.gain.exponentialRampToValueAtTime(0.01, this.context.currentTime + time);\n break;\n case 'linear':\n\n // Scheduling a linear ramp to 0 over the given duration\n this.gainNode.gain.linearRampToValueAtTime(0, this.context.currentTime + time);\n }\n // Resolving the Promise after the fade-out time\n setTimeout(() => resolve(), time * 1000);\n });\n }\n\n isPlaying(): boolean {\n if (!this.source) {\n throw new Error('Cannot check if a sound is playing that has been cleaned up');\n }\n return this.playing;\n }\n\n cleanup(): void {\n // Ensure cleanup is idempotent\n if (this.source) {\n this.source.disconnect();\n this.source = undefined;\n }\n if (this.gainNode) {\n this.gainNode.disconnect();\n this.gainNode = undefined;\n }\n this.filters.forEach(filter => {\n if (filter) {\n filter.disconnect();\n }\n });\n this.filters = [];\n // Additional cleanup logic if needed\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n if (!this.source) {\n throw new Error('Cannot loop a sound that has been cleaned up');\n }\n\n // Check if the source is an AudioBufferSourceNode\n if (this.source instanceof AudioBufferSourceNode) {\n if (loopCount === undefined) {\n return this.source.loop === true ? 'infinite' : 0;\n }\n this.source.loop = true;\n this.source.loopEnd = this.source.buffer?.duration || 0;\n this.source.loopStart = 0;\n return this.source.loop === true ? 'infinite' : 0;\n }\n\n // Check if the source is a MediaElementSourceNode\n if (\"mediaElement\" in this.source && this.source.mediaElement) {\n const mediaElement = this.source.mediaElement;\n if (loopCount === undefined) {\n return mediaElement.loop === true ? 'infinite' : 0;\n }\n mediaElement.loop = true;\n // Looping for HTMLMediaElement is controlled by the 'loop' attribute, no need for loopStart or loopEnd\n return mediaElement.loop === true ? 'infinite' : 0;\n }\n\n throw new Error('Unsupported source type');\n }\n\n stop(): void {\n if (!this.source) {\n throw new Error('Cannot stop a sound that has been cleaned up');\n }\n if (!this.isPlaying()) {\n return;\n }\n if ('stop' in this.source) {\n this.source.stop();\n }\n if (\"mediaElement\" in this.source && this.source.mediaElement) {\n this.source.mediaElement.pause();\n this.source.mediaElement.currentTime = 0;\n }\n this.playing = false;\n }\n\n pause(): void {\n if (!this.source) {\n throw new Error('Cannot pause a sound that has been cleaned up');\n }\n if ('suspend' in this.source.context) {\n this.source.context.suspend();\n }\n }\n\n resume(): void {\n if (!this.source) {\n throw new Error('Cannot resume a sound that has been cleaned up');\n }\n if ('resume' in this.source.context) {\n this.source.context.resume();\n }\n }\n\n addFilter(filter: BiquadFilterNode): void {\n super.addFilter(filter);\n this.refreshFilters();\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n super.removeFilter(filter);\n this.refreshFilters();\n }\n\n set position(position: Position) {\n if (!this.panner) {\n throw new Error('Cannot move a sound that has been cleaned up');\n }\n const [x, y, z] = position;\n this.panner.positionX.setValueAtTime(x, this.context.currentTime);\n this.panner.positionY.setValueAtTime(y, this.context.currentTime);\n this.panner.positionZ.setValueAtTime(z, this.context.currentTime);\n }\n\n get position(): Position {\n if (!this.panner) {\n throw new Error('Cannot get position of a sound that has been cleaned up');\n }\n return [this.panner.positionX.value, this.panner.positionY.value, this.panner.positionZ.value];\n }\n\n private refreshFilters(): void {\n if (!this.panner || !this.gainNode) {\n throw new Error('Cannot update filters on a sound that has been cleaned up');\n }\n let connection = this.panner;\n connection.disconnect();\n connection = this.applyFilters(connection);\n connection.connect(this.gainNode);\n }\n}\n\n\nexport class Group implements BaseSound {\n sounds: BaseSound[] = [];\n private _position: Position = [0, 0, 0];\n loopCount: LoopCount = 0;\n\n seek(time: number): void {\n this.sounds.forEach(sound => sound.seek && sound.seek(time));\n }\n\n addSound(sound: BaseSound): void {\n this.sounds.push(sound);\n }\n\n preplay(): Playback[] {\n return (this.sounds as Sound[]).reduce<Playback[]>((playbacks, sound) => {\n sound.loop && sound.loop(this.loopCount);\n return playbacks.concat(sound.preplay());\n }, []);\n }\n\n play(): Playback[] {\n return this.preplay().map(playback => {\n playback.play();\n return playback;\n });\n }\n\n isPlaying(): boolean {\n return this.sounds.some(sound => sound.isPlaying());\n }\n\n stop(): void {\n this.sounds.forEach(sound => sound.stop());\n }\n\n pause(): void {\n this.sounds.forEach(sound => sound.pause());\n }\n\n resume(): void {\n this.sounds.forEach(sound => sound.resume());\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n if (loopCount === undefined) {\n return this.loopCount;\n }\n this.loopCount = loopCount;\n this.sounds.forEach(sound => sound.loop && sound.loop(loopCount));\n return this.loopCount;\n }\n\n addFilter(filter: BiquadFilterNode): void {\n this.sounds.forEach(sound => sound.addFilter(filter));\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n this.sounds.forEach(sound => sound.removeFilter(filter));\n }\n\n set position(position: [number, number, number]) {\n this._position = position;\n this.sounds.forEach(sound => sound.position = this._position);\n }\n\n get position(): [number, number, number] {\n return this._position;\n }\n\n get volume(): number {\n return this.sounds.map(sound => sound.volume).reduce((a, b) => a + b, 0) / this.sounds.length;\n }\n\n set volume(volume: number) {\n this.sounds.forEach(sound => sound.volume = volume);\n }\n\n get playbackRate(): number {\n if (this.sounds.length === 0) {\n return 1;\n }\n return this.sounds[0].playbackRate\n }\n\n set playbackRate(rate: number) {\n this.sounds.forEach(sound => sound.playbackRate = rate);\n }\n\n\n}\n\nexport class MicrophonePlayback extends FilterManager {\n private context: AudioContext;\n private source?: MediaStreamAudioSourceNode;\n private gainNode?: GainNode;\n private panner?: PannerNode;\n\n constructor(source: MediaStreamAudioSourceNode, gainNode: GainNode, context: AudioContext, loopCount: LoopCount = 0) {\n super();\n this.source = source;\n this.gainNode = gainNode;\n this.context = context;\n this.panner = context.createPanner();\n source.connect(this.panner).connect(this.gainNode);\n this.refreshFilters();\n }\n\n play() {\n if (!this.source) {\n throw new Error('Cannot play a sound that has been cleaned up');\n }\n return [this];\n }\n\n isPlaying() {\n return Boolean(this.source);\n }\n\n get volume(): number {\n if (!this.gainNode) {\n throw new Error('Cannot get volume of a sound that has been cleaned up');\n }\n return this.gainNode.gain.value;\n }\n\n set volume(v: number) {\n if (!this.gainNode) {\n throw new Error('Cannot set volume of a sound that has been cleaned up');\n }\n this.gainNode.gain.value = v;\n }\n\n stop(): void {\n if (!this.source) {\n throw new Error('Cannot stop a sound that has been cleaned up');\n }\n this.source.mediaStream.getTracks().forEach(track => track.stop());\n }\n\n pause(): void {\n if (!this.source) {\n throw new Error('Cannot pause a sound that has been cleaned up');\n }\n this.source.mediaStream.getTracks().forEach(track => track.enabled = false);\n }\n\n resume(): void {\n if (!this.source) {\n throw new Error('Cannot resume a sound that has been cleaned up');\n }\n this.source.mediaStream.getTracks().forEach(track => track.enabled = true);\n }\n\n addFilter(filter: BiquadFilterNode): void {\n super.addFilter(filter);\n this.refreshFilters();\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n super.removeFilter(filter);\n this.refreshFilters();\n }\n\n set position(position: Position) {\n if (!this.panner) {\n throw new Error('Cannot move a sound that has been cleaned up');\n }\n const [x, y, z] = position;\n this.panner.positionX.value = x;\n this.panner.positionY.value = y;\n this.panner.positionZ.value = z;\n }\n\n get position(): Position {\n if (!this.panner) {\n throw new Error('Cannot get position of a sound that has been cleaned up');\n }\n return [this.panner.positionX.value, this.panner.positionY.value, this.panner.positionZ.value];\n }\n\n private refreshFilters(): void {\n if (!this.source || !this.gainNode) {\n throw new Error('Cannot update filters on a sound that has been cleaned up');\n }\n let connection = this.source;\n this.source.disconnect();\n connection = this.applyFilters(connection);\n connection.connect(this.gainNode);\n }\n\n get playbackRate(): number {\n // Playback rate is not applicable for live microphone stream\n return 1;\n }\n\n set playbackRate(rate: number) {\n }\n\n\n\n}\n\nexport class MicrophoneStream extends FilterManager implements BaseSound {\n context: AudioContext;\n private _position: Position = [0, 0, 0];\n loopCount: LoopCount = 0;\n private prevVolume: number = 1;\n private microphoneGainNode: GainNode;\n private streamPlayback?: MicrophonePlayback;\n private stream: MediaStream | undefined;\n private streamSource?: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext) {\n super();\n this.context = context;\n this.microphoneGainNode = this.context.createGain();\n }\n\n play(): MicrophonePlayback[] {\n if (!this.stream) {\n navigator.mediaDevices.getUserMedia({ audio: true })\n .then(stream => {\n this.stream = stream;\n this.streamSource = this.context.createMediaStreamSource(this.stream);\n this.streamPlayback = new MicrophonePlayback(this.streamSource, this.microphoneGainNode, this.context);\n this.streamPlayback.play();\n })\n .catch(err => {\n console.error('Error initializing microphone stream:', err);\n });\n }\n return this.streamPlayback ? [this.streamPlayback] : [];\n }\n\n seek(time: number) {\n // Seeking is not applicable for live microphone stream\n }\n\n isPlaying(): boolean {\n return Boolean(this.streamPlayback);\n }\n\n stop() {\n if (this.streamPlayback) {\n this.streamPlayback.stop();\n this.streamPlayback = undefined;\n }\n }\n\n pause() {\n if (this.streamPlayback) {\n this.streamPlayback.pause();\n }\n }\n\n resume() {\n if (this.streamPlayback) {\n this.streamPlayback.resume();\n }\n }\n\n addFilter(filter: BiquadFilterNode): void {\n if (this.streamPlayback) {\n this.streamPlayback.addFilter(filter);\n }\n }\n\n removeFilter(filter: BiquadFilterNode): void {\n if (this.streamPlayback) {\n this.streamPlayback.removeFilter(filter);\n }\n }\n\n get volume(): number {\n return this.streamPlayback ? this.streamPlayback.volume : 0;\n }\n\n set volume(volume: number) {\n if (this.streamPlayback) {\n this.streamPlayback.volume = volume;\n }\n }\n\n get position(): Position {\n // Position is not applicable for live microphone stream\n return [0, 0, 0];\n }\n\n set position(position: Position) {\n // Position is not applicable for live microphone stream\n }\n\n loop(loopCount?: LoopCount): LoopCount {\n // Looping is not applicable for live microphone stream\n return 0;\n }\n\n\n get playbackRate(): number {\n // Playback rate is not applicable for live microphone stream\n return 1;\n }\n\n set playbackRate(rate: number) {\n }\n\n}\n\nasync function createWorkletNode(\n context: AudioContext,\n name: string,\n url: string\n) {\n // ensure audioWorklet has been loaded\n if (!context.audioWorklet) {\n throw new Error('AudioWorklet not supported');\n }\n\n try {\n return new AudioWorkletNode!(context, name);\n } catch (err) {\n await context.audioWorklet.addModule(url);\n return new AudioWorkletNode!(context, name);\n }\n}\n\n"],"names":["CacheManager","error","url","cache","context","response","arrayBuffer","fetchResponse","responseClone","pendingRequest","bufferFromCache","appendBuffer","buffer1","buffer2","tmp","createStream","audioStack","nextTime","reader","header","read","value","done","audioBuffer","buffer","scheduleBuffers","err","source","SoundType","Cacophony","AudioContext","heldValue","createWorkletNode","PhaseVocoderProcessorUrl","bufferOrUrl","type","Sound","audio","sounds","group","Group","sound","urls","filter","volume","muted","resolve","reject","stream","microphoneStream","MicrophoneStream","orientation","forward","up","forwardX","forwardY","forwardZ","upX","upY","upZ","x","y","z","position","FilterManager","f","connection","prevConnection","globalGainNode","gainNode","playback","Playback","p","time","options","loopCount","rate","playing","v","loop","fadeType","targetVolume","mediaElement","playbacks","a","b","MicrophonePlayback","track","name","AudioWorkletNode"],"mappings":"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"}
|