cacophony 0.3.4 → 0.3.5

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.
@@ -1 +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]}
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":["const 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","import OLAProcessor from './ola.ts';\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\nclass 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]}
@@ -1,2 +1,2 @@
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;
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 console.log("Loading worklet from url",t),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