|
!(function t(e, s, r) { |
|
function i(o, f) { |
|
if (!s[o]) { |
|
if (!e[o]) { |
|
var h = "function" == typeof require && require; |
|
if (!f && h) return h(o, !0); |
|
if (n) return n(o, !0); |
|
var u = new Error("Cannot find module '" + o + "'"); |
|
throw ((u.code = "MODULE_NOT_FOUND"), u); |
|
} |
|
var a = (s[o] = { exports: {} }); |
|
e[o][0].call( |
|
a.exports, |
|
function (t) { |
|
return i(e[o][1][t] || t); |
|
}, |
|
a, |
|
a.exports, |
|
t, |
|
e, |
|
s, |
|
r, |
|
); |
|
} |
|
return s[o].exports; |
|
} |
|
for ( |
|
var n = "function" == typeof require && require, o = 0; |
|
o < r.length; |
|
o++ |
|
) |
|
i(r[o]); |
|
return i; |
|
})( |
|
{ |
|
1: [ |
|
function (t, e, s) { |
|
"use strict"; |
|
function r(t) { |
|
if ( |
|
((this.size = 0 | t), |
|
this.size <= 1 || 0 != (this.size & (this.size - 1))) |
|
) |
|
throw new Error( |
|
"FFT size must be a power of two and bigger than 1", |
|
); |
|
this._csize = t << 1; |
|
for (var e = new Array(2 * this.size), s = 0; s < e.length; s += 2) { |
|
const t = (Math.PI * s) / this.size; |
|
(e[s] = Math.cos(t)), (e[s + 1] = -Math.sin(t)); |
|
} |
|
this.table = e; |
|
for (var r = 0, i = 1; this.size > i; i <<= 1) r++; |
|
(this._width = r % 2 == 0 ? r - 1 : r), |
|
(this._bitrev = new Array(1 << this._width)); |
|
for (var n = 0; n < this._bitrev.length; n++) { |
|
this._bitrev[n] = 0; |
|
for (var o = 0; o < this._width; o += 2) { |
|
var f = this._width - o - 2; |
|
this._bitrev[n] |= ((n >>> o) & 3) << f; |
|
} |
|
} |
|
(this._out = null), (this._data = null), (this._inv = 0); |
|
} |
|
(e.exports = r), |
|
(r.prototype.fromComplexArray = function (t, e) { |
|
for ( |
|
var s = e || new Array(t.length >>> 1), r = 0; |
|
r < t.length; |
|
r += 2 |
|
) |
|
s[r >>> 1] = t[r]; |
|
return s; |
|
}), |
|
(r.prototype.createComplexArray = function () { |
|
const t = new Array(this._csize); |
|
for (var e = 0; e < t.length; e++) t[e] = 0; |
|
return t; |
|
}), |
|
(r.prototype.toComplexArray = function (t, e) { |
|
for ( |
|
var s = e || this.createComplexArray(), r = 0; |
|
r < s.length; |
|
r += 2 |
|
) |
|
(s[r] = t[r >>> 1]), (s[r + 1] = 0); |
|
return s; |
|
}), |
|
(r.prototype.completeSpectrum = function (t) { |
|
for (var e = this._csize, s = e >>> 1, r = 2; r < s; r += 2) |
|
(t[e - r] = t[r]), (t[e - r + 1] = -t[r + 1]); |
|
}), |
|
(r.prototype.transform = function (t, e) { |
|
if (t === e) |
|
throw new Error("Input and output buffers must be different"); |
|
(this._out = t), |
|
(this._data = e), |
|
(this._inv = 0), |
|
this._transform4(), |
|
(this._out = null), |
|
(this._data = null); |
|
}), |
|
(r.prototype.realTransform = function (t, e) { |
|
if (t === e) |
|
throw new Error("Input and output buffers must be different"); |
|
(this._out = t), |
|
(this._data = e), |
|
(this._inv = 0), |
|
this._realTransform4(), |
|
(this._out = null), |
|
(this._data = null); |
|
}), |
|
(r.prototype.inverseTransform = function (t, e) { |
|
if (t === e) |
|
throw new Error("Input and output buffers must be different"); |
|
(this._out = t), |
|
(this._data = e), |
|
(this._inv = 1), |
|
this._transform4(); |
|
for (var s = 0; s < t.length; s++) t[s] /= this.size; |
|
(this._out = null), (this._data = null); |
|
}), |
|
(r.prototype._transform4 = function () { |
|
var t, |
|
e, |
|
s = this._out, |
|
r = this._csize, |
|
i = 1 << this._width, |
|
n = (r / i) << 1, |
|
o = this._bitrev; |
|
if (4 === n) |
|
for (t = 0, e = 0; t < r; t += n, e++) { |
|
const s = o[e]; |
|
this._singleTransform2(t, s, i); |
|
} |
|
else |
|
for (t = 0, e = 0; t < r; t += n, e++) { |
|
const s = o[e]; |
|
this._singleTransform4(t, s, i); |
|
} |
|
var f = this._inv ? -1 : 1, |
|
h = this.table; |
|
for (i >>= 2; i >= 2; i >>= 2) { |
|
var u = (n = (r / i) << 1) >>> 2; |
|
for (t = 0; t < r; t += n) |
|
for (var a = t + u, p = t, l = 0; p < a; p += 2, l += i) { |
|
const t = p, |
|
e = t + u, |
|
r = e + u, |
|
i = r + u, |
|
n = s[t], |
|
o = s[t + 1], |
|
a = s[e], |
|
c = s[e + 1], |
|
d = s[r], |
|
v = s[r + 1], |
|
m = s[i], |
|
b = s[i + 1], |
|
_ = n, |
|
B = o, |
|
g = h[l], |
|
y = f * h[l + 1], |
|
w = a * g - c * y, |
|
S = a * y + c * g, |
|
z = h[2 * l], |
|
x = f * h[2 * l + 1], |
|
C = d * z - v * x, |
|
I = d * x + v * z, |
|
k = h[3 * l], |
|
A = f * h[3 * l + 1], |
|
T = m * k - b * A, |
|
O = m * A + b * k, |
|
q = _ + C, |
|
P = B + I, |
|
M = _ - C, |
|
F = B - I, |
|
R = w + T, |
|
W = S + O, |
|
H = f * (w - T), |
|
E = f * (S - O), |
|
N = q + R, |
|
j = P + W, |
|
L = q - R, |
|
D = P - W, |
|
U = M + E, |
|
V = F - H, |
|
G = M - E, |
|
J = F + H; |
|
(s[t] = N), |
|
(s[t + 1] = j), |
|
(s[e] = U), |
|
(s[e + 1] = V), |
|
(s[r] = L), |
|
(s[r + 1] = D), |
|
(s[i] = G), |
|
(s[i + 1] = J); |
|
} |
|
} |
|
}), |
|
(r.prototype._singleTransform2 = function (t, e, s) { |
|
const r = this._out, |
|
i = this._data, |
|
n = i[e], |
|
o = i[e + 1], |
|
f = i[e + s], |
|
h = i[e + s + 1], |
|
u = n + f, |
|
a = o + h, |
|
p = n - f, |
|
l = o - h; |
|
(r[t] = u), (r[t + 1] = a), (r[t + 2] = p), (r[t + 3] = l); |
|
}), |
|
(r.prototype._singleTransform4 = function (t, e, s) { |
|
const r = this._out, |
|
i = this._data, |
|
n = this._inv ? -1 : 1, |
|
o = 2 * s, |
|
f = 3 * s, |
|
h = i[e], |
|
u = i[e + 1], |
|
a = i[e + s], |
|
p = i[e + s + 1], |
|
l = i[e + o], |
|
c = i[e + o + 1], |
|
d = i[e + f], |
|
v = i[e + f + 1], |
|
m = h + l, |
|
b = u + c, |
|
_ = h - l, |
|
B = u - c, |
|
g = a + d, |
|
y = p + v, |
|
w = n * (a - d), |
|
S = n * (p - v), |
|
z = m + g, |
|
x = b + y, |
|
C = _ + S, |
|
I = B - w, |
|
k = m - g, |
|
A = b - y, |
|
T = _ - S, |
|
O = B + w; |
|
(r[t] = z), |
|
(r[t + 1] = x), |
|
(r[t + 2] = C), |
|
(r[t + 3] = I), |
|
(r[t + 4] = k), |
|
(r[t + 5] = A), |
|
(r[t + 6] = T), |
|
(r[t + 7] = O); |
|
}), |
|
(r.prototype._realTransform4 = function () { |
|
var t, |
|
e, |
|
s = this._out, |
|
r = this._csize, |
|
i = 1 << this._width, |
|
n = (r / i) << 1, |
|
o = this._bitrev; |
|
if (4 === n) |
|
for (t = 0, e = 0; t < r; t += n, e++) { |
|
const s = o[e]; |
|
this._singleRealTransform2(t, s >>> 1, i >>> 1); |
|
} |
|
else |
|
for (t = 0, e = 0; t < r; t += n, e++) { |
|
const s = o[e]; |
|
this._singleRealTransform4(t, s >>> 1, i >>> 1); |
|
} |
|
var f = this._inv ? -1 : 1, |
|
h = this.table; |
|
for (i >>= 2; i >= 2; i >>= 2) { |
|
var u = (n = (r / i) << 1) >>> 1, |
|
a = u >>> 1, |
|
p = a >>> 1; |
|
for (t = 0; t < r; t += n) |
|
for (var l = 0, c = 0; l <= p; l += 2, c += i) { |
|
var d = t + l, |
|
v = d + a, |
|
m = v + a, |
|
b = m + a, |
|
_ = s[d], |
|
B = s[d + 1], |
|
g = s[v], |
|
y = s[v + 1], |
|
w = s[m], |
|
S = s[m + 1], |
|
z = s[b], |
|
x = s[b + 1], |
|
C = _, |
|
I = B, |
|
k = h[c], |
|
A = f * h[c + 1], |
|
T = g * k - y * A, |
|
O = g * A + y * k, |
|
q = h[2 * c], |
|
P = f * h[2 * c + 1], |
|
M = w * q - S * P, |
|
F = w * P + S * q, |
|
R = h[3 * c], |
|
W = f * h[3 * c + 1], |
|
H = z * R - x * W, |
|
E = z * W + x * R, |
|
N = C + M, |
|
j = I + F, |
|
L = C - M, |
|
D = I - F, |
|
U = T + H, |
|
V = O + E, |
|
G = f * (T - H), |
|
J = f * (O - E), |
|
K = N + U, |
|
Q = j + V, |
|
X = L + J, |
|
Y = D - G; |
|
if ( |
|
((s[d] = K), |
|
(s[d + 1] = Q), |
|
(s[v] = X), |
|
(s[v + 1] = Y), |
|
0 !== l) |
|
) { |
|
if (l !== p) { |
|
var Z = L + -f * J, |
|
$ = -D + -f * G, |
|
tt = N + -f * U, |
|
et = -j - -f * V, |
|
st = t + a - l, |
|
rt = t + u - l; |
|
(s[st] = Z), |
|
(s[st + 1] = $), |
|
(s[rt] = tt), |
|
(s[rt + 1] = et); |
|
} |
|
} else { |
|
var it = N - U, |
|
nt = j - V; |
|
(s[m] = it), (s[m + 1] = nt); |
|
} |
|
} |
|
} |
|
}), |
|
(r.prototype._singleRealTransform2 = function (t, e, s) { |
|
const r = this._out, |
|
i = this._data, |
|
n = i[e], |
|
o = i[e + s], |
|
f = n + o, |
|
h = n - o; |
|
(r[t] = f), (r[t + 1] = 0), (r[t + 2] = h), (r[t + 3] = 0); |
|
}), |
|
(r.prototype._singleRealTransform4 = function (t, e, s) { |
|
const r = this._out, |
|
i = this._data, |
|
n = this._inv ? -1 : 1, |
|
o = 2 * s, |
|
f = 3 * s, |
|
h = i[e], |
|
u = i[e + s], |
|
a = i[e + o], |
|
p = i[e + f], |
|
l = h + a, |
|
c = h - a, |
|
d = u + p, |
|
v = n * (u - p), |
|
m = l + d, |
|
b = c, |
|
_ = -v, |
|
B = l - d, |
|
g = c, |
|
y = v; |
|
(r[t] = m), |
|
(r[t + 1] = 0), |
|
(r[t + 2] = b), |
|
(r[t + 3] = _), |
|
(r[t + 4] = B), |
|
(r[t + 5] = 0), |
|
(r[t + 6] = g), |
|
(r[t + 7] = y); |
|
}); |
|
}, |
|
{}, |
|
], |
|
2: [ |
|
function (t, e, s) { |
|
"use strict"; |
|
const r = 128; |
|
class i extends AudioWorkletProcessor { |
|
constructor(t) { |
|
super(t), |
|
(this.nbInputs = t.numberOfInputs), |
|
(this.nbOutputs = t.numberOfOutputs), |
|
(this.blockSize = t.processorOptions.blockSize), |
|
(this.hopSize = r), |
|
(this.nbOverlaps = this.blockSize / this.hopSize), |
|
(this.inputBuffers = new Array(this.nbInputs)), |
|
(this.inputBuffersHead = new Array(this.nbInputs)), |
|
(this.inputBuffersToSend = new Array(this.nbInputs)); |
|
for (var e = 0; e < this.nbInputs; e++) |
|
this.allocateInputChannels(e, 1); |
|
(this.outputBuffers = new Array(this.nbOutputs)), |
|
(this.outputBuffersToRetrieve = new Array(this.nbOutputs)); |
|
for (e = 0; e < this.nbOutputs; e++) |
|
this.allocateOutputChannels(e, 1); |
|
} |
|
reallocateChannelsIfNeeded(t, e) { |
|
for (var s = 0; s < this.nbInputs; s++) { |
|
let e = t[s].length; |
|
e != this.inputBuffers[s].length && |
|
this.allocateInputChannels(s, e); |
|
} |
|
for (s = 0; s < this.nbOutputs; s++) { |
|
let t = e[s].length; |
|
t != this.outputBuffers[s].length && |
|
this.allocateOutputChannels(s, t); |
|
} |
|
} |
|
allocateInputChannels(t, e) { |
|
this.inputBuffers[t] = new Array(e); |
|
for (var s = 0; s < e; s++) |
|
(this.inputBuffers[t][s] = new Float32Array(this.blockSize + r)), |
|
this.inputBuffers[t][s].fill(0); |
|
(this.inputBuffersHead[t] = new Array(e)), |
|
(this.inputBuffersToSend[t] = new Array(e)); |
|
for (s = 0; s < e; s++) |
|
(this.inputBuffersHead[t][s] = this.inputBuffers[t][s].subarray( |
|
0, |
|
this.blockSize, |
|
)), |
|
(this.inputBuffersToSend[t][s] = new Float32Array( |
|
this.blockSize, |
|
)); |
|
} |
|
allocateOutputChannels(t, e) { |
|
this.outputBuffers[t] = new Array(e); |
|
for (var s = 0; s < e; s++) |
|
(this.outputBuffers[t][s] = new Float32Array(this.blockSize)), |
|
this.outputBuffers[t][s].fill(0); |
|
this.outputBuffersToRetrieve[t] = new Array(e); |
|
for (s = 0; s < e; s++) |
|
(this.outputBuffersToRetrieve[t][s] = new Float32Array( |
|
this.blockSize, |
|
)), |
|
this.outputBuffersToRetrieve[t][s].fill(0); |
|
} |
|
readInputs(t) { |
|
if (t[0].length && 0 == t[0][0].length) |
|
for (var e = 0; e < this.nbInputs; e++) |
|
for (var s = 0; s < this.inputBuffers[e].length; s++) |
|
this.inputBuffers[e][s].fill(0, this.blockSize); |
|
else |
|
for (e = 0; e < this.nbInputs; e++) |
|
for (s = 0; s < this.inputBuffers[e].length; s++) { |
|
let r = t[e][s]; |
|
this.inputBuffers[e][s].set(r, this.blockSize); |
|
} |
|
} |
|
writeOutputs(t) { |
|
for (var e = 0; e < this.nbInputs; e++) |
|
for (var s = 0; s < this.inputBuffers[e].length; s++) { |
|
let i = this.outputBuffers[e][s].subarray(0, r); |
|
t[e][s].set(i); |
|
} |
|
} |
|
shiftInputBuffers() { |
|
for (var t = 0; t < this.nbInputs; t++) |
|
for (var e = 0; e < this.inputBuffers[t].length; e++) |
|
this.inputBuffers[t][e].copyWithin(0, r); |
|
} |
|
shiftOutputBuffers() { |
|
for (var t = 0; t < this.nbOutputs; t++) |
|
for (var e = 0; e < this.outputBuffers[t].length; e++) |
|
this.outputBuffers[t][e].copyWithin(0, r), |
|
this.outputBuffers[t][e].subarray(this.blockSize - r).fill(0); |
|
} |
|
prepareInputBuffersToSend() { |
|
for (var t = 0; t < this.nbInputs; t++) |
|
for (var e = 0; e < this.inputBuffers[t].length; e++) |
|
this.inputBuffersToSend[t][e].set(this.inputBuffersHead[t][e]); |
|
} |
|
handleOutputBuffersToRetrieve() { |
|
for (var t = 0; t < this.nbOutputs; t++) |
|
for (var e = 0; e < this.outputBuffers[t].length; e++) |
|
for (var s = 0; s < this.blockSize; s++) |
|
this.outputBuffers[t][e][s] += |
|
this.outputBuffersToRetrieve[t][e][s] / this.nbOverlaps; |
|
} |
|
process(t, e, s) { |
|
return ( |
|
this.reallocateChannelsIfNeeded(t, e), |
|
this.readInputs(t), |
|
this.shiftInputBuffers(), |
|
this.prepareInputBuffersToSend(), |
|
this.processOLA( |
|
this.inputBuffersToSend, |
|
this.outputBuffersToRetrieve, |
|
s, |
|
), |
|
this.handleOutputBuffersToRetrieve(), |
|
this.writeOutputs(e), |
|
this.shiftOutputBuffers(), |
|
!0 |
|
); |
|
} |
|
processOLA(t, e, s) { |
|
console.assert(!1, "Not overriden"); |
|
} |
|
} |
|
e.exports = i; |
|
}, |
|
{}, |
|
], |
|
3: [ |
|
function (t, e, s) { |
|
"use strict"; |
|
const r = t("./ola-processor.js"), |
|
i = t("fft.js"); |
|
registerProcessor( |
|
"phase-vocoder-processor", |
|
class extends r { |
|
static get parameterDescriptors() { |
|
return [{ name: "pitchFactor", defaultValue: 1 }]; |
|
} |
|
constructor(t) { |
|
(t.processorOptions = { blockSize: 2048 }), |
|
super(t), |
|
(this.fftSize = this.blockSize), |
|
(this.timeCursor = 0), |
|
(this.hannWindow = (function (t) { |
|
let e = new Float32Array(t); |
|
for (var s = 0; s < t; s++) |
|
e[s] = 0.5 * (1 - Math.cos((2 * Math.PI * s) / t)); |
|
return e; |
|
})(this.blockSize)), |
|
(this.fft = new i(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, e, s) { |
|
const r = s.pitchFactor[s.pitchFactor.length - 1]; |
|
for (var i = 0; i < this.nbInputs; i++) |
|
for (var n = 0; n < t[i].length; n++) { |
|
var o = t[i][n], |
|
f = e[i][n]; |
|
this.applyHannWindow(o), |
|
this.fft.realTransform(this.freqComplexBuffer, o), |
|
this.computeMagnitudes(), |
|
this.findPeaks(), |
|
this.shiftPeaks(r), |
|
this.fft.completeSpectrum(this.freqComplexBufferShifted), |
|
this.fft.inverseTransform( |
|
this.timeComplexBuffer, |
|
this.freqComplexBufferShifted, |
|
), |
|
this.fft.fromComplexArray(this.timeComplexBuffer, f), |
|
this.applyHannWindow(f); |
|
} |
|
this.timeCursor += this.hopSize; |
|
} |
|
applyHannWindow(t) { |
|
for (var e = 0; e < this.blockSize; e++) |
|
t[e] = t[e] * this.hannWindow[e]; |
|
} |
|
computeMagnitudes() { |
|
for (var t = 0, e = 0; t < this.magnitudes.length; ) { |
|
let s = this.freqComplexBuffer[e], |
|
r = this.freqComplexBuffer[e + 1]; |
|
(this.magnitudes[t] = s ** 2 + r ** 2), (t += 1), (e += 2); |
|
} |
|
} |
|
findPeaks() { |
|
this.nbPeaks = 0; |
|
var t = 2; |
|
let e = this.magnitudes.length - 2; |
|
for (; t < e; ) { |
|
let e = this.magnitudes[t]; |
|
this.magnitudes[t - 1] >= e || this.magnitudes[t - 2] >= e |
|
? t++ |
|
: this.magnitudes[t + 1] >= e || this.magnitudes[t + 2] >= e |
|
? t++ |
|
: ((this.peakIndexes[this.nbPeaks] = t), |
|
this.nbPeaks++, |
|
(t += 2)); |
|
} |
|
} |
|
shiftPeaks(t) { |
|
this.freqComplexBufferShifted.fill(0); |
|
for (var e = 0; e < this.nbPeaks; e++) { |
|
let n = this.peakIndexes[e], |
|
o = Math.round(n * t); |
|
if (o > this.magnitudes.length) break; |
|
var s = 0, |
|
r = this.fftSize; |
|
if (e > 0) { |
|
let t = this.peakIndexes[e - 1]; |
|
s = n - Math.floor((n - t) / 2); |
|
} |
|
if (e < this.nbPeaks - 1) { |
|
let t = this.peakIndexes[e + 1]; |
|
r = n + Math.ceil((t - n) / 2); |
|
} |
|
let f = r - n; |
|
for (var i = s - n; i < f; i++) { |
|
let t = n + i, |
|
e = o + i; |
|
if (e >= this.magnitudes.length) break; |
|
let s = (2 * Math.PI * (e - t)) / this.fftSize, |
|
r = Math.cos(s * this.timeCursor), |
|
f = Math.sin(s * this.timeCursor), |
|
h = 2 * t, |
|
u = h + 1, |
|
a = this.freqComplexBuffer[h], |
|
p = this.freqComplexBuffer[u], |
|
l = a * r - p * f, |
|
c = a * f + p * r, |
|
d = 2 * e, |
|
v = d + 1; |
|
(this.freqComplexBufferShifted[d] += l), |
|
(this.freqComplexBufferShifted[v] += c); |
|
} |
|
} |
|
} |
|
}, |
|
); |
|
}, |
|
{ "./ola-processor.js": 2, "fft.js": 1 }, |
|
], |
|
}, |
|
{}, |
|
[3], |
|
); |
|
|