flocking
Version:
Creative audio synthesis for the Web
886 lines (877 loc) • 157 kB
JavaScript
/*! Flocking 3.0.1, Copyright 2022 Colin Clark | flockingjs.org */
"use strict";
!function() {
var e = "undefined" != typeof window ? window : "undefined" != typeof self ? self : "undefined" != typeof module && module.exports ? module.exports : global;
e.ArrayMath || (e.ArrayMath = {
add: function(e, t, n) {
var o;
if (t instanceof Float32Array) for (o = Math.min(e.length, t.length, n.length) - 1; 0 <= o; --o) e[o] = t[o] + n[o]; else for (o = Math.min(e.length, n.length) - 1; 0 <= o; --o) e[o] = t + n[o];
},
sub: function(e, t, n) {
var o;
if (t instanceof Float32Array) for (o = Math.min(e.length, t.length, n.length) - 1; 0 <= o; --o) e[o] = t[o] - n[o]; else for (o = Math.min(e.length, n.length) - 1; 0 <= o; --o) e[o] = t - n[o];
},
mul: function(e, t, n) {
var o;
if (t instanceof Float32Array) for (o = Math.min(e.length, t.length, n.length) - 1; 0 <= o; --o) e[o] = t[o] * n[o]; else for (o = Math.min(e.length, n.length) - 1; 0 <= o; --o) e[o] = t * n[o];
},
mulCplx: function(e, t, n, o, r, a) {
var i, l, u, s, f;
if (n instanceof Float32Array) for (i = Math.min(e.length, t.length, n.length, o.length, r.length, a.length) - 1; 0 <= i; --i) l = n[i],
u = o[i], s = r[i], f = a[i], e[i] = l * s - u * f, t[i] = l * f + u * s; else for (i = Math.min(e.length, t.length, r.length, a.length) - 1; 0 <= i; --i) s = r[i],
f = a[i], e[i] = n * s - o * f, t[i] = n * f + o * s;
},
div: function(e, t, n) {
var o;
if (t instanceof Float32Array) for (o = Math.min(e.length, t.length, n.length) - 1; 0 <= o; --o) e[o] = t[o] / n[o]; else for (o = Math.min(e.length, n.length) - 1; 0 <= o; --o) e[o] = t / n[o];
},
divCplx: function(e, t, n, o, r, a) {
var i, l, u, s, f, c;
if (n instanceof Float32Array) for (i = Math.min(e.length, t.length, n.length, o.length, r.length, a.length) - 1; 0 <= i; --i) l = n[i],
u = o[i], s = r[i], f = a[i], e[i] = (l * s + u * f) * (c = 1 / (s * s + f * f)),
t[i] = (u * s - l * f) * c; else for (i = Math.min(e.length, t.length, r.length, a.length) - 1; 0 <= i; --i) s = r[i],
f = a[i], e[i] = (n * s + o * f) * (c = 1 / (s * s + f * f)), t[i] = (o * s - n * f) * c;
},
madd: function(e, t, n, o) {
var r;
if (t instanceof Float32Array) for (r = Math.min(e.length, t.length, n.length, o.length) - 1; 0 <= r; --r) e[r] = t[r] * n[r] + o[r]; else for (r = Math.min(e.length, n.length, o.length) - 1; 0 <= r; --r) e[r] = t * n[r] + o[r];
},
abs: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.abs(t[n]);
},
absCplx: function(e, t, n) {
for (var o = Math.min(e.length, t.length, n.length) - 1; 0 <= o; --o) e[o] = Math.sqrt(t[o] * t[o] + n[o] * n[o]);
},
acos: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.acos(t[n]);
},
asin: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.asin(t[n]);
},
atan: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.atan(t[n]);
},
atan2: function(e, t, n) {
for (var o = Math.min(e.length, n.length, t.length) - 1; 0 <= o; --o) e[o] = Math.atan2(t[o], n[o]);
},
ceil: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.ceil(t[n]);
},
cos: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.cos(t[n]);
},
exp: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.exp(t[n]);
},
floor: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.floor(t[n]);
},
log: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.log(t[n]);
},
max: function(e) {
for (var t = -1 / 0, n = e.length - 1; 0 <= n; --n) {
var o = e[n];
t < o && (t = o);
}
return t;
},
min: function(e) {
for (var t = 1 / 0, n = e.length - 1; 0 <= n; --n) {
var o = e[n];
o < t && (t = o);
}
return t;
},
pow: function(e, t, n) {
var o;
if (n instanceof Float32Array) for (o = Math.min(e.length, t.length, n.length) - 1; 0 <= o; --o) e[o] = Math.pow(t[o], n[o]); else for (o = Math.min(e.length, t.length) - 1; 0 <= o; --o) e[o] = Math.pow(t[o], n);
},
random: function(e, t, n) {
t = t || 0;
for (var o = (n = isNaN(parseFloat(n)) ? 1 : n) - t, r = e.length - 1; 0 <= r; --r) e[r] = Math.random() * o + t;
},
round: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.round(t[n]);
},
sin: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.sin(t[n]);
},
sqrt: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.sqrt(t[n]);
},
tan: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = Math.tan(t[n]);
},
clamp: function(e, t, n, o) {
for (var r = Math.min(e.length, t.length) - 1; 0 <= r; --r) {
var a = t[r];
e[r] = a < n ? n : o < a ? o : a;
}
},
fract: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) {
var o = t[n];
e[n] = o - Math.floor(o);
}
},
fill: function(e, t) {
for (var n = e.length - 1; 0 <= n; --n) e[n] = t;
},
ramp: function(e, t, n) {
var o = e.length - 1;
if (0 <= o && (e[0] = t), 0 < o) for (var r = (n - t) / o, a = 1; a <= o; ++a) e[a] = t + r * a;
},
sign: function(e, t) {
for (var n = Math.min(e.length, t.length) - 1; 0 <= n; --n) e[n] = t[n] < 0 ? -1 : 1;
},
sum: function(e) {
for (var t = 0, n = e.length - 1; 0 <= n; --n) t += e[n];
return t;
},
sampleLinear: function(e, t, n) {
for (var o = t.length - 1, r = Math.min(e.length, n.length) - 1; 0 <= r; --r) {
var a = (a = n[r]) < 0 ? 0 : o < a ? o : a, i = Math.floor(a), l = t[i], u = t[i < o ? i + 1 : o];
e[r] = l + (a - i) * (u - l);
}
},
sampleLinearRepeat: function(e, t, n) {
for (var o = t.length, r = o - 1, a = Math.min(e.length, n.length) - 1; 0 <= a; --a) {
var i = n[a], l = (i -= Math.floor(i / o) * o, Math.floor(i)), u = t[l], s = t[l < r ? l + 1 : 0];
e[a] = u + (i - l) * (s - u);
}
},
sampleCubic: function(e, t, n) {
for (var o = t.length - 1, r = Math.min(e.length, n.length) - 1; 0 <= r; --r) {
var a = (a = n[r]) < 0 ? 0 : o < a ? o : a, i = Math.floor(a), a = a - i, l = a * a, u = l * a, s = -2 * u + 3 * l, u = u - l, f = t[0 < i ? i - 1 : 0], c = t[i], d = t[i < o ? i + 1 : o], i = t[i < o - 1 ? i + 2 : o];
e[r] = (1 - s) * c + s * d + .5 * ((u - l + a) * (d - f) + u * (i - c));
}
},
sampleCubicRepeat: function(e, t, n) {
for (var o = t.length, r = o - 1, a = Math.min(e.length, n.length) - 1; 0 <= a; --a) {
var i = n[a], l = (i -= Math.floor(i / o) * o, Math.floor(i)), i = i - l, u = i * i, s = u * i, f = -2 * s + 3 * u, c = 1 - f, s = s - u, u = s - u + i, i = t[0 < l ? l - 1 : r], d = t[l], h = t[l < r ? l + 1 : 0], l = t[l < r - 1 ? l + 2 : l + 2 - Math.floor((l + 2) / o) * o];
e[a] = c * d + f * h + .5 * (u * (h - i) + s * (l - d));
}
},
pack: function(e, t, n, o, r, a, i) {
var l = Math.floor(Math.max(0, e.length - t) / n), u = Math.min(l, o.length);
if (r) {
u = Math.min(u, r.length);
if (a) {
u = Math.min(u, a.length);
if (i) for (var u = Math.min(u, i.length), s = 0; s < u; ++s) e[t] = o[s],
e[t + 1] = r[s], e[t + 2] = a[s], e[t + 3] = i[s], t += n; else for (s = 0; s < u; ++s) e[t] = o[s],
e[t + 1] = r[s], e[t + 2] = a[s], t += n;
} else for (s = 0; s < u; ++s) e[t] = o[s], e[t + 1] = r[s], t += n;
} else for (s = 0; s < u; ++s) e[t] = o[s], t += n;
},
unpack: function(e, t, n, o, r, a, i) {
var l = Math.floor(Math.max(0, e.length - t) / n), u = Math.min(l, o.length);
if (r) {
u = Math.min(u, r.length);
if (a) {
u = Math.min(u, a.length);
if (i) for (var u = Math.min(u, i.length), s = 0; s < u; ++s) o[s] = e[t],
r[s] = e[t + 1], a[s] = e[t + 2], i[s] = e[t + 3], t += n; else for (s = 0; s < u; ++s) o[s] = e[t],
r[s] = e[t + 1], a[s] = e[t + 2], t += n;
} else for (s = 0; s < u; ++s) o[s] = e[t], r[s] = e[t + 1], t += n;
} else for (s = 0; s < u; ++s) o[s] = e[t], t += n;
}
});
}(), function() {
var e, t = "undefined" != typeof window ? window : "undefined" != typeof self ? self : "undefined" != typeof module && module.exports ? module.exports : global;
t.Filter || ((e = function(e, t) {
!isNaN(parseFloat(e)) && isFinite(e) || (e = 1), t = t || 0, this._b = new Float32Array(e),
this._b[0] = 1, this._a = new Float32Array(t), this._bHist = new Float32Array(e),
this._aHist = new Float32Array(t);
}).prototype.filter = function(e, t) {
for (var n = this._a, o = n.length, r = this._b, a = r.length, i = this._aHist, l = this._bHist, u = t.length, s = e.length, f = a - 1, c = o, d = 0; (f || c) && d < u; ++d) {
var h = a - f, m = (f && f--, r[0] * t[d]);
for (C = 1; C < h; ++C) m += r[C] * t[d - C];
for (;C < a; ++C) m += r[C] * l[C - h];
for (h = o - c, c && c--, C = 0; C < h; ++C) m -= n[C] * e[d - 1 - C];
for (;C < o; ++C) m -= n[C] * i[C - h];
e[d] = m;
}
if (3 == a && 2 == o) for (var p, g, k = r[0], v = r[1], b = r[2], y = n[0], w = n[1], N = t[d - 1], A = t[d - 2], M = e[d - 1], S = e[d - 2]; d < u; ++d) p = A,
A = N, N = t[d], g = S, S = M, e[d] = M = k * N + v * A + b * p - y * S - w * g; else for (;d < u; ++d) {
var C, m = r[0] * t[d];
for (C = 1; C < a; ++C) m += r[C] * t[d - C];
for (C = 0; C < o; ++C) m -= n[C] * e[d - 1 - C];
e[d] = m;
}
var I = Math.min(a - 1, u);
for (d = a - 2; I <= d; --d) l[d] = l[d - I];
for (d = 0; d < I; ++d) l[d] = t[u - 1 - d];
for (I = Math.min(o, s), d = o - 1; I <= d; --d) i[d] = i[d - I];
for (d = 0; d < I; ++d) i[d] = e[u - 1 - d];
}, e.prototype.clearHistory = function() {
for (var e = this._bHist.length - 1; 0 <= e; --e) this._bHist[e] = 0;
for (e = this._aHist.length - 1; 0 <= e; --e) this._aHist[e] = 0;
}, e.prototype.setB = function(e) {
for (var t = Math.min(this._b.length, e.length), n = 0; n < t; ++n) this._b[n] = e[n];
}, e.prototype.setA = function(e) {
for (var t = Math.min(this._a.length, e.length), n = 0; n < t; ++n) this._a[n] = e[n];
}, t.Filter = e);
}(), function() {
var Ht, e, t = "undefined" != typeof window ? window : "undefined" != typeof self ? self : "undefined" != typeof module && module.exports ? module.exports : global;
t.FFT || (Ht = function(e, t, n, R, E, V, o, U, G, _, W, q, z, j) {
var H = G[_++], r = G[_++], K = n, Q = n + H * r, X = o * U;
if (1 == r) for (;e[n] = R[V], t[n] = E[V], V += X, ++n != Q; ); else for (;Ht(e, t, n, R, E, V, o * H, U, G, _, W, q, z, j),
V += X, (n += r) != Q; );
switch (n = K, H) {
case 2:
for (var J, Y, $, Z, ee, te, ne, oe = e, re = t, ae = o, ie = W, le = q, ue = 0, a = n, se = n + r, fe = .7071067811865475, ce = a + r; a < ce; ) Y = oe[a] * fe,
$ = re[a] * fe, Z = oe[se] * fe, ee = re[se] * fe, te = ie[ue], J = Z * (ne = le[ue]) + ee * te,
oe[se] = Y - (Z = Z * te - ee * ne), re[se] = $ - J, oe[a] = Y + Z,
re[a] = $ + J, ue += ae, ++a, ++se;
break;
case 3:
for (var de, he, me, pe, ge, ke, ve, be, ye, we, i, l, Ne = e, Ae = t, Me = o, Se = W, Ce = q, u = r, Ie = 0, Le = 0, De = 2 * Me, s = n, xe = n + u, Fe = n + 2 * u, Oe = Ce[Me * u], Te = .5773502691896258, Be = s + u; s < Be; ) ge = Ne[s] * Te,
ke = Ae[s] * Te, ve = Ne[xe] * Te, be = Ae[xe] * Te, ye = Ne[Fe] * Te,
we = Ae[Fe] * Te, i = Se[Ie], me = ve * (l = Ce[Ie]) + be * i, de = (he = ve * i - be * l) - (pe = ye * (i = Se[Le]) - we * (l = Ce[Le])),
l = me - (ye = ye * l + we * i), ve = ge - .5 * (we = he + pe), be = ke - .5 * (i = me + ye),
de *= Oe, l *= Oe, Ne[s] = ge + we, Ae[s] = ke + i, Ne[Fe] = ve + l,
Ae[Fe] = be - de, Ne[xe] = ve - l, Ae[xe] = be + de, Ie += Me, Le += De,
++s, ++xe, ++Fe;
break;
case 4:
for (var Pe, Re, Ee, Ve, Ue, Ge, _e, f, c, We, d, h, m, p = e, g = t, qe = o, ze = W, je = q, He = j, Ke = 0, Qe = 0, Xe = 0, Je = 2 * qe, Ye = 3 * qe, k = n, v = n + r, $e = n + 2 * r, b = n + 3 * r, Ze = k + r; k < Ze; ) Ve = .5 * p[k],
Ue = .5 * g[k], Ge = .5 * p[v], _e = .5 * g[v], f = .5 * p[$e], c = .5 * g[$e],
We = .5 * p[b], d = .5 * g[b], Pe = Ge * (h = ze[Ke]) - _e * (m = je[Ke]),
Ge = Ge * m + _e * h, _e = f * (h = ze[Qe]) - c * (m = je[Qe]), f = f * m + c * h,
h = ze[Xe], c = Ve - _e, Ee = Ue - f, Ue += f, Re = Ge + (f = We * (m = je[Xe]) + d * h),
h = Pe - (We = We * h - d * m), d = Ge - f, p[$e] = (Ve += _e) - (m = Pe + We),
g[$e] = Ue - Re, p[k] = Ve + m, g[k] = Ue + Re, He ? (p[v] = c - d,
g[v] = Ee + h, p[b] = c + d, g[b] = Ee - h) : (p[v] = c + d, g[v] = Ee - h,
p[b] = c - d, g[b] = Ee + h), Ke += qe, Qe += Je, Xe += Ye, ++k, ++v,
++$e, ++b;
break;
case 5:
for (var et, tt, y, nt, ot, w, N, A, M, S, C, I, rt, L, D, x = e, F = t, O = o, at = W, it = q, u = r, lt = 0, ut = 0, st = 0, ft = 0, ct = 2 * O, dt = 3 * O, ht = 4 * O, T = n, mt = n + u, pt = n + 2 * u, gt = n + 3 * u, kt = n + 4 * u, vt = at[O * u], bt = it[O * u], yt = at[2 * O * u], wt = it[2 * O * u], B = .4472135954999579, Nt = T + u; T < Nt; ) nt = x[T] * B,
ot = F[T] * B, w = x[mt] * B, N = F[mt] * B, A = x[pt] * B, M = F[pt] * B,
S = x[gt] * B, C = F[gt] * B, I = x[kt] * B, rt = F[kt] * B, et = ot,
y = w * (L = at[lt]) - N * (D = it[lt]), w = w * D + N * L, N = A * (L = at[ut]) - M * (D = it[ut]),
A = A * D + M * L, M = S * (L = at[st]) - C * (D = it[st]), S = S * D + C * L,
L = at[ft], tt = w + (C = I * (D = it[ft]) + rt * L), L = y - (I = I * L - rt * D),
rt = w - C, D = A + S, w = N - M, C = A - S, x[T] = (A = nt) + (S = y + I) + (nt = N + M),
F[T] = ot + tt + D, y = et + tt * vt + D * yt, I = -L * bt - w * wt,
x[mt] = (N = A + S * vt + nt * yt) - (M = rt * bt + C * wt), F[mt] = y - I,
x[kt] = N + M, F[kt] = y + I, ot = et + tt * yt + D * vt, N = L * wt - w * bt,
x[pt] = (M = A + S * yt + nt * vt) + (y = -rt * wt + C * bt), F[pt] = ot + N,
x[gt] = M - y, F[gt] = ot - N, lt += O, ut += ct, st += dt, ft += ht,
++T, ++mt, ++pt, ++gt, ++kt;
break;
default:
for (var At, Mt, St, Ct, It = e, Lt = t, Dt = n, xt = o, Ft = W, Ot = q, Tt = r, Bt = H, Pt = z, Rt = new Float32Array(Bt), Et = new Float32Array(Bt), Vt = Math.sqrt(1 / Bt), Ut = 0; Ut < Tt; ++Ut) {
for (P = Dt + Ut, _t = 0; _t < Bt; ++_t) Rt[_t] = It[P] * Vt, Et[_t] = Lt[P] * Vt,
P += Tt;
for (var P = Dt + Ut, Gt = xt * Ut, _t = 0; _t < Bt; ++_t) {
for (var Wt = Rt[0], qt = Et[0], zt = 0, jt = 1; jt < Bt; ++jt) Pt <= (zt += Gt) && (zt -= Pt),
At = Rt[jt], Mt = Et[jt], Wt += At * (St = Ft[zt]) - Mt * (Ct = Ot[zt]),
qt += At * Ct + Mt * St;
It[P] = Wt, Lt[P] = qt, P += Tt, Gt += xt;
}
}
}
}, (e = function(e) {
e = e || 256, Object.defineProperty(this, "size", {
configurable: !1,
writable: !1,
value: e
}), this._twiddlesFwdRe = new Float32Array(e), this._twiddlesFwdIm = new Float32Array(e),
this._twiddlesInvRe = this._twiddlesFwdRe, this._twiddlesInvIm = new Float32Array(e);
for (var t = 0; t < e; ++t) {
var n = -2 * Math.PI * t / e, o = Math.cos(n), n = Math.sin(n);
this._twiddlesFwdRe[t] = o, this._twiddlesFwdIm[t] = n, this._twiddlesInvIm[t] = -n;
}
this._factors = new Int32Array(64);
var r = e, a = this._factors, i = 4, l = Math.floor(Math.sqrt(r)), u = 0;
do {
for (;r % i; ) {
switch (i) {
case 4:
i = 2;
break;
case 2:
i = 3;
break;
default:
i += 2;
}
l < i && (i = r);
}
} while (r = Math.floor(r / i), a[u++] = i, 1 < (a[u++] = r));
}).prototype.forwardCplx = function(e, t, n, o) {
var r = this._twiddlesFwdRe, a = this._twiddlesFwdIm;
Ht(e, t, 0, n, o, 0, 1, 1, this._factors, 0, r, a, this.size, !1);
}, e.prototype.forward = function(e, t, n) {
this.forwardCplx(e, t, n, new Float32Array(this.size));
}, e.prototype.inverseCplx = function(e, t, n, o) {
var r = this._twiddlesInvRe, a = this._twiddlesInvIm;
Ht(e, t, 0, n, o, 0, 1, 1, this._factors, 0, r, a, this.size, !0);
}, e.prototype.inverse = function(e, t, n) {
this.inverseCplx(e, new Float32Array(this.size), t, n);
}, t.FFT = e);
}();
{
{
var Random = function(e) {
if ("number" != typeof (e = void 0 === e ? new Date().getTime() : e) || Math.ceil(e) != Math.floor(e)) throw new TypeError("seed value must be an integer");
this.N = 624, this.M = 397, this.MATRIX_A = 2567483615, this.UPPER_MASK = 2147483648,
this.LOWER_MASK = 2147483647, this.mt = new Array(this.N), this.mti = this.N + 1,
this.init_by_array([ e ], 1);
}, fluid = (Random.prototype.init_genrand = function(e) {
for (this.mt[0] = e >>> 0, this.mti = 1; this.mti < this.N; this.mti++) {
e = this.mt[this.mti - 1] ^ this.mt[this.mti - 1] >>> 30;
this.mt[this.mti] = (1812433253 * ((4294901760 & e) >>> 16) << 16) + 1812433253 * (65535 & e) + this.mti,
this.mt[this.mti] >>>= 0;
}
}, Random.prototype.init_by_array = function(e, t) {
var n, o, r;
for (this.init_genrand(19650218), n = 1, o = 0, r = this.N > t ? this.N : t; r; r--) {
var a = this.mt[n - 1] ^ this.mt[n - 1] >>> 30;
this.mt[n] = (this.mt[n] ^ (1664525 * ((4294901760 & a) >>> 16) << 16) + 1664525 * (65535 & a)) + e[o] + o,
this.mt[n] >>>= 0, o++, ++n >= this.N && (this.mt[0] = this.mt[this.N - 1],
n = 1), t <= o && (o = 0);
}
for (r = this.N - 1; r; r--) {
a = this.mt[n - 1] ^ this.mt[n - 1] >>> 30;
this.mt[n] = (this.mt[n] ^ (1566083941 * ((4294901760 & a) >>> 16) << 16) + 1566083941 * (65535 & a)) - n,
this.mt[n] >>>= 0, ++n >= this.N && (this.mt[0] = this.mt[this.N - 1],
n = 1);
}
this.mt[0] = 2147483648;
}, Random.prototype.genrand_int32 = function() {
var e, t, n = new Array(0, this.MATRIX_A);
if (this.mti >= this.N) {
for (this.mti == this.N + 1 && this.init_genrand(5489), t = 0; t < this.N - this.M; t++) e = this.mt[t] & this.UPPER_MASK | this.mt[t + 1] & this.LOWER_MASK,
this.mt[t] = this.mt[t + this.M] ^ e >>> 1 ^ n[1 & e];
for (;t < this.N - 1; t++) e = this.mt[t] & this.UPPER_MASK | this.mt[t + 1] & this.LOWER_MASK,
this.mt[t] = this.mt[t + (this.M - this.N)] ^ e >>> 1 ^ n[1 & e];
e = this.mt[this.N - 1] & this.UPPER_MASK | this.mt[0] & this.LOWER_MASK,
this.mt[this.N - 1] = this.mt[this.M - 1] ^ e >>> 1 ^ n[1 & e],
this.mti = 0;
}
return e = this.mt[this.mti++], (e = (e = (e = (e ^= e >>> 11) ^ e << 7 & 2636928640) ^ e << 15 & 4022730752) ^ e >>> 18) >>> 0;
}, Random.prototype.genrand_int31 = function() {
return this.genrand_int32() >>> 1;
}, Random.prototype.genrand_real1 = function() {
return this.genrand_int32() * (1 / 4294967295);
}, Random.prototype.random = function() {
return this.pythonCompatibility && (this.skip && this.genrand_int32(),
this.skip = !0), this.genrand_int32() * (1 / 4294967296);
}, Random.prototype.genrand_real3 = function() {
return (this.genrand_int32() + .5) * (1 / 4294967296);
}, Random.prototype.genrand_res53 = function() {
return 1 / 9007199254740992 * (67108864 * (this.genrand_int32() >>> 5) + (this.genrand_int32() >>> 6));
}, Random.prototype.LOG4 = Math.log(4), Random.prototype.SG_MAGICCONST = 1 + Math.log(4.5),
Random.prototype.exponential = function(e) {
if (1 != arguments.length) throw new SyntaxError("exponential() must be called with 'lambda' parameter");
var t = this.random();
return -Math.log(t) / e;
}, Random.prototype.gamma = function(e, t) {
if (2 != arguments.length) throw new SyntaxError("gamma() must be called with alpha and beta parameters");
if (!(1 < e)) {
if (1 == e) {
for (var n = this.random(); n <= 1e-7; ) n = this.random();
return -Math.log(n) * t;
}
for (;;) {
var n = this.random(), o = (Math.E + e) / Math.E, r = o * n, a = (s = r <= 1 ? Math.pow(r, 1 / e) : -Math.log((o - r) / e),
this.random());
if (1 < r) {
if (a <= Math.pow(s, e - 1)) break;
} else if (a <= Math.exp(-s)) break;
}
return s * t;
}
for (var i = Math.sqrt(2 * e - 1), l = e - this.LOG4, u = e + i; ;) {
var a = this.random();
if (!(a < 1e-7 || .9999999 < n)) {
var s, f = 1 - this.random(), c = Math.log(a / (1 - a)) / i, f = a * a * f, c = l + u * c - (s = e * Math.exp(c));
if (0 <= c + this.SG_MAGICCONST - 4.5 * f || c >= Math.log(f)) return s * t;
}
}
}, Random.prototype.normal = function(e, t) {
if (2 != arguments.length) throw new SyntaxError("normal() must be called with mu and sigma parameters");
var n, o, r = this.lastNormal;
return this.lastNormal = NaN, r || (n = 2 * this.random() * Math.PI,
o = Math.sqrt(-2 * Math.log(1 - this.random())), r = Math.cos(n) * o,
this.lastNormal = Math.sin(n) * o), e + r * t;
}, Random.prototype.pareto = function(e) {
if (1 != arguments.length) throw new SyntaxError("pareto() must be called with alpha parameter");
var t = this.random();
return 1 / Math.pow(1 - t, 1 / e);
}, Random.prototype.triangular = function(e, t, n) {
if (3 != arguments.length) throw new SyntaxError("triangular() must be called with lower, upper and mode parameters");
var o = (n - e) / (t - e), r = this.random();
return r <= o ? e + Math.sqrt(r * (t - e) * (n - e)) : t - Math.sqrt((1 - r) * (t - e) * (t - n));
}, Random.prototype.uniform = function(e, t) {
if (2 != arguments.length) throw new SyntaxError("uniform() must be called with lower and upper parameters");
return e + this.random() * (t - e);
}, Random.prototype.weibull = function(e, t) {
if (2 != arguments.length) throw new SyntaxError("weibull() must be called with alpha and beta parameters");
var n = 1 - this.random();
return e * Math.pow(-Math.log(n), 1 / t);
}, "undefined" == typeof window && "undefined" != typeof module && module.exports && (module.exports = Random),
fluid || require("infusion")), flock = fluid.registerNamespace("flock");
!function() {
var e, o = fluid.registerNamespace("jQuery");
flock.fluid = fluid, flock.init = function(e) {
return flock.enviro(e ? {
components: {
audioSystem: {
options: {
model: e
}
}
}
} : void 0);
}, flock.ALL_CHANNELS = 32, flock.OUT_UGEN_ID = "flocking-out", flock.PI = Math.PI,
flock.TWOPI = 2 * Math.PI, flock.HALFPI = Math.PI / 2, flock.LOG01 = Math.log(.1),
flock.LOG001 = Math.log(.001), flock.ROOT2 = Math.sqrt(2), flock.rates = {
AUDIO: "audio",
CONTROL: "control",
SCHEDULED: "scheduled",
DEMAND: "demand",
CONSTANT: "constant"
}, fluid.registerNamespace("flock.debug"), flock.debug.failHard = !0,
flock.browser = function() {
if ("undefined" == typeof navigator) return {};
var e = navigator.userAgent.toLowerCase(), t = {}, e = /(chrome)[ \/]([\w.]+)/.exec(e) || /(webkit)[ \/]([\w.]+)/.exec(e) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e) || /(msie) ([\w.]+)/.exec(e) || e.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e) || [], e = {
browser: e[1] || "",
version: e[2] || "0"
};
return e.browser && (t[e.browser] = !0, t.version = e.version),
t.chrome ? t.webkit = !0 : t.webkit && (t.safari = !0), t;
}, fluid.registerNamespace("flock.platform"), flock.platform.isBrowser = "undefined" != typeof window,
flock.platform.hasRequire = "undefined" != typeof require, flock.platform.os = flock.platform.isBrowser ? window.navigator.platform : require("os").platform(),
flock.platform.isLinux = -1 < flock.platform.os.indexOf("Linux"), flock.platform.isAndroid = flock.platform.isLinux && -1 < flock.platform.os.indexOf("arm"),
flock.platform.isIOS = "iPhone" === flock.platform.os || "iPad" === flock.platform.os || "iPod" === flock.platform.os,
flock.platform.isMobile = flock.platform.isAndroid || flock.platform.isIOS,
flock.platform.browser = flock.browser(), flock.platform.isWebAudio = "undefined" != typeof AudioContext || "undefined" != typeof webkitAudioContext,
flock.platform.audioEngine = flock.platform.isBrowser ? "webAudio" : "unknown",
flock.platform.browser && void 0 !== flock.platform.browser.version && (e = flock.platform.browser.version.indexOf("."),
flock.platform.browser.majorVersionNumber = Number(e < 0 ? flock.platform.browser.version : flock.platform.browser.version.substring(0, e))),
flock.shim = {
URL: flock.platform.isBrowser ? window.URL || window.webkitURL || window.msURL : void 0
}, flock.requireModule = function(e, t) {
if (flock.platform.isBrowser) return window[t || e];
if (flock.platform.hasRequire) return e = flock.requireModule.paths[e] || e,
e = require(e), t ? e[t] : e;
}, flock.requireModule.paths = {
webarraymath: "../third-party/webarraymath/js/webarraymath.js",
Random: "../third-party/simjs/js/random-0.26.js"
}, flock.noOp = function() {}, flock.isIterable = function(e) {
var t = typeof e;
return e && void 0 !== e.length && "string" != t && "function" != t;
}, flock.hasValue = function(e, t) {
var n, o = !1;
for (n in e) if (e[n] === t) {
o = !0;
break;
}
return o;
}, flock.hasTag = function(e, t) {
return !(!e || !t) && (e.tags && -1 < e.tags.indexOf(t));
}, flock.randomValue = function(e, t) {
t -= e;
return Math.random() * t + e;
}, flock.randomAudioValue = function() {
return 2 * Math.random() - 1;
}, flock.fillBuffer = function(e, t) {
for (var n = 0; n < e.length; n++) e[n] = t(n, e);
return e;
}, flock.fillBufferWithValue = function(e, t) {
for (var n = 0; n < e.length; n++) e[n] = t;
return e;
}, flock.generateBuffer = function(e, t) {
e = new Float32Array(e);
return flock.fillBuffer(e, t);
}, flock.generateBufferWithValue = function(e, t) {
e = new Float32Array(e);
return flock.fillBufferWithValue(e, t);
}, flock.generate = function(e, t) {
var n = "number" == typeof e;
return ("function" == typeof t ? n ? flock.generateBuffer : flock.fillBuffer : n ? flock.generateBufferWithValue : flock.fillBufferWithValue)(e, t);
}, flock.generate.silence = function(e) {
return new Float32Array(e);
}, flock.clearBuffer = function(e) {
for (var t = 0; t < e.length; t++) e[t] = 0;
return e;
}, flock.reverse = function(e) {
if (!e || !flock.isIterable(e) || e.length < 2) return e;
if ("function" == typeof e.reverse) return e.reverse();
for (var t, n = 0, o = e.length - 1; n < o; n++, o--) t = e[n],
e[n] = e[o], e[o] = t;
return e;
}, flock.randomIndex = function(e) {
e = e.length - 1;
return Math.round(Math.random() * e);
}, flock.arrayChoose = function(e, t) {
return t = t || flock.randomIndex, (e = fluid.makeArray(e))[t(e)];
}, flock.choose = function(e, t) {
return flock.isIterable(e) ? flock.arrayChoose(e, t) : e[flock.arrayChoose(e.keys, t)];
}, flock.shuffle = function(e) {
for (var t = e.length - 1; 0 < t; --t) {
var n = Math.floor(Math.random() * (t + 1)), o = e[t];
e[t] = e[n], e[n] = o;
}
return e;
}, flock.normalize = function(e, t, n) {
n = n || e;
var o, r, a, i = 0;
for (t = void 0 === t ? 1 : t, o = 0; o < e.length; o++) i < (r = Math.abs(e[o])) && (i = r);
if (0 < i) for (o = 0; o < e.length; o++) a = e[o], n[o] = a / i * t;
return n;
}, flock.generateFourierTable = function(e, o, r, a, i) {
return a *= flock.TWOPI, flock.generateBuffer(e, function(e) {
for (var t = 0, n = 0; n < r; n++) t += (i ? i[n] : 1) * Math.cos((n + 1) * (e * o) + a);
return t;
});
}, flock.generateNormalizedFourierTable = function(e, t, n, o, r) {
var a = flock.generateBuffer(n, function(e) {
return r(e + 1);
}), e = flock.generateFourierTable(e, t, n, o, a);
return flock.normalize(e);
}, flock.fillTable = function(e, t) {
var n = "number" == typeof e ? e : e.length;
return t(e, flock.TWOPI / n);
}, flock.tableGenerators = {
sin: function(e, t) {
return flock.generateBuffer(e, function(e) {
return Math.sin(e * t);
});
},
tri: function(e, t) {
return flock.generateNormalizedFourierTable(e, t, 1e3, 1, function(e) {
return e % 2 == 0 ? 0 : 1 / (e * e);
});
},
saw: function(e, t) {
return flock.generateNormalizedFourierTable(e, t, 10, -.25, function(e) {
return 1 / e;
});
},
square: function(e, t) {
return flock.generateNormalizedFourierTable(e, t, 10, -.25, function(e) {
return e % 2 == 0 ? 0 : 1 / e;
});
},
hann: function(t) {
return flock.generateBuffer(t, function(e) {
e = Math.sin(Math.PI * e / t);
return e * e;
});
},
sinWindow: function(t) {
return flock.generateBuffer(t, function(e) {
return Math.sin(Math.PI * e / t);
});
}
}, flock.range = function(e) {
for (var t, n = {
max: Number.NEGATIVE_INFINITY,
min: 1 / 0
}, o = 0; o < e.length; o++) (t = e[o]) > n.max && (n.max = t),
t < n.min && (n.min = t);
return n;
}, flock.scale = function(e) {
if (e) {
for (var t = flock.range(e), n = (t.max - t.min) / 2, o = (t.max + t.min) / 2, r = 0; r < e.length; r++) e[r] = (e[r] - o) / n;
return e;
}
}, flock.copyBuffer = function(e, t, n) {
void 0 === n && (n = e.length);
for (var o = new Float32Array(n - t), r = t, a = 0; r < n; r++,
a++) o[a] = e[r];
return o;
}, flock.copyToBuffer = function(e, t) {
for (var n = Math.min(e.length, t.length), o = 0; o < n; o++) t[o] = e[o];
}, flock.parseMidiString = function(e) {
if (!e || e.length < 2) return NaN;
var t = (e = e.toLowerCase()).charAt(1), t = "#" === t || "b" === t ? 2 : 1, n = e.substring(0, t);
return 12 * Number(e.substring(t)) + flock.midiFreq.noteNames[n];
}, flock.midiFreq = function(e, t, n, o) {
return t = void 0 === t ? 440 : t, n = void 0 === n ? 69 : n, o = o || 12,
"string" == typeof e && (e = flock.parseMidiString(e)), t * Math.pow(2, (e - n) / o);
}, flock.midiFreq.noteNames = {
"b#": 0,
c: 0,
"c#": 1,
db: 1,
d: 2,
"d#": 3,
eb: 3,
e: 4,
"e#": 5,
f: 5,
"f#": 6,
gb: 6,
g: 7,
"g#": 8,
ab: 8,
a: 9,
"a#": 10,
bb: 10,
b: 11,
cb: 11
}, flock.interpolate = {
none: function(e, t) {
return t[0 | (e %= t.length)];
},
linear: function(e, t) {
var n = t.length, o = 0 | (e %= n), r = t[o];
return r + (e - o) * (t[(1 + o) % n] - r);
},
hermite: function(e, t) {
var n = t.length, o = Math.floor(e), r = o % n, e = e - o, o = t[0 < r ? r - 1 : n - 1], a = t[r], i = t[(1 + r) % n], o = .5 * (i - o), i = a - i, l = o + i, i = l + i + .5 * (t[(2 + r) % n] - a);
return ((i * e - (l + i)) * e + o) * e + a;
}
}, flock.interpolate.cubic = flock.interpolate.hermite, flock.log = {
fail: function(e) {
fluid.log(fluid.logLevel.FAIL, e);
},
warn: function(e) {
fluid.log(fluid.logLevel.WARN, e);
},
debug: function(e) {
fluid.log(fluid.logLevel.INFO, e);
}
}, flock.fail = function(e) {
if (flock.debug.failHard) throw e = e instanceof Error ? e : new Error(e);
flock.log.fail(e);
}, flock.pathParseError = function(e, t, n) {
flock.fail("Error parsing path '" + t + "'. Segment '" + n + "' could not be resolved.");
}, flock.get = function(e, t) {
if (!e) return fluid.getGlobalValue(t);
if (1 === arguments.length && "string" == typeof e) return fluid.getGlobalValue(e);
if (t && "" !== t) {
for (var n = "" === t ? [] : String(t).split("."), o = e[n[0]], r = 1; r < n.length; r++) {
if (null == o) return void flock.pathParseError(e, t, n[r - 1]);
o = o[n[r]];
}
return o;
}
}, flock.set = function(e, t, n) {
if (e && t && "" !== t) {
for (var o = String(t).split("."), r = o.length, a = o[0], i = 1; i < r; i++) {
if ("object" != typeof (e = e[a])) return void flock.fail("Error while setting a value at path '" + t + "'. A non-container object was found at segment '" + a + "'. Value: " + e);
void 0 === e[a = o[i]] && (e[a] = {});
}
return e[a] = n;
}
}, flock.invoke = function(e, t, n) {
e = "function" == typeof e ? e : flock.get(e, t);
if ("function" == typeof e) return e.apply(null, n);
flock.fail("Path '" + t + "' does not resolve to a function.");
}, flock.input = {}, flock.input.shouldExpand = function(e) {
return flock.parse.specialInputs.indexOf(e) < 0;
}, flock.input.pathExpander = function(e) {
for (var t = fluid.model.parseEL(e), n = t.length - 1, o = [], r = 0; r < n; r++) {
var a = t[r], i = t[r + 1];
if (o.push(a), "model" === i || "options" === i) {
o = o.concat(t.slice(r + 1, n));
break;
}
isNaN(Number(i)) && o.push("inputs");
}
return o.push(t[n]), o.join(".");
}, flock.input.expandPaths = function(e) {
var t, n, o, r = {};
for (t in e) n = flock.input.pathExpander(t), o = e[t], r[n] = o;
return r;
}, flock.input.expandPath = function(e) {
return "string" == typeof e ? flock.input.pathExpander(e) : flock.input.expandPaths(e);
}, flock.input.getValueForPath = function(e, t) {
t = flock.input.expandPath(t);
e = flock.get(e, t);
return flock.hasTag(e, "flock.ugen.valueType") ? e.inputs.value : e;
}, flock.input.getValuesForPathArray = function(e, t) {
for (var n, o = {}, r = 0; r < t.length; r++) o[n = t[r]] = flock.input.get(e, n);
return o;
}, flock.input.getValuesForPathObject = function(e, t) {
for (var n in t) t[n] = flock.input.get(e, n);
return t;
}, flock.input.get = function(e, t) {
return "string" == typeof t ? flock.input.getValueForPath(e, t) : flock.isIterable(t) ? flock.input.getValuesForPathArray(e, t) : flock.input.getValuesForPathObject(e, t);
}, flock.input.resolveValue = function(e, t, n, o, r, a, i) {
if ("string" == typeof n) {
var l = fluid.extractEL(n, flock.input.valueExpressionSpec);
if (l) return void 0 === (e = flock.input.getValueForPath(e, l)) && flock.log.debug("The value expression '" + n + "' resolved to undefined. If this isn't expected, check to ensure that your path is valid."),
e;
}
return flock.input.shouldExpand(r) && i ? i(n, t, o, a) : n;
}, flock.input.valueExpressionSpec = {
ELstyle: "${}"
}, flock.input.setValueForPath = function(e, t, n, o, r) {
t = flock.input.expandPath(t);
var a = flock.get(e, t), i = t.lastIndexOf("."), l = t.slice(i + 1), i = -1 < i ? flock.get(e, t.slice(0, t.lastIndexOf(".inputs"))) : o, o = flock.input.resolveValue(e, t, n, i, l, a, r);
return flock.set(e, t, o), i && i.onInputChanged && i.onInputChanged(l),
o;
}, flock.input.setValuesForPaths = function(e, t, n, o) {
var r, a, i = {};
for (r in t) a = t[r], a = flock.input.set(e, r, a, n, o), i[r] = a;
return i;
}, flock.input.set = function(e, t, n, o, r) {
return "string" == typeof t ? flock.input.setValueForPath(e, t, n, o, r) : flock.input.setValuesForPaths(e, t, o, r);
}, fluid.defaults("flock.audioSystem", {
gradeNames: [ "fluid.modelComponent" ],
channelRange: {
min: 1,
max: 32
},
outputBusRange: {
min: 2,
max: 1024
},
inputBusRange: {
min: 1,
max: 32
},
model: {
rates: {
audio: 44100,
control: 689.0625,
scheduled: 0,
demand: 0,
constant: 0
},
blockSize: 64,
numBlocks: 16,
chans: 2,
numInputBuses: 2,
numBuses: 8,
bufferSize: "@expand:flock.audioSystem.defaultBufferSize()"
},
modelRelay: [ {
target: "rates.control",
singleTransform: {
type: "fluid.transforms.binaryOp",
left: "{that}.model.rates.audio",
operator: "/",
right: "{that}.model.blockSize"
}
}, {
target: "numBlocks",
singleTransform: {
type: "fluid.transforms.binaryOp",
left: "{that}.model.bufferSize",
operator: "/",
right: "{that}.model.blockSize"
}
}, {
target: "chans",
singleTransform: {
type: "fluid.transforms.limitRange",
input: "{that}.model.chans",
min: "{that}.options.channelRange.min",
max: "{that}.options.channelRange.max"
}
}, {
target: "numInputBuses",
singleTransform: {
type: "fluid.transforms.limitRange",
input: "{that}.model.numInputBuses",
min: "{that}.options.inputBusRange.min",
max: "{that}.options.inputBusRange.max"
}
}, {
target: "numBuses",
singleTransform: {
type: "fluid.transforms.free",
func: "flock.audioSystem.clampNumBuses",
args: [ "{that}.model.numBuses", "{that}.options.outputBusRange", "{that}.model.chans", "{that}.model.numInputBuses" ]
}
} ]
}), flock.audioSystem.clampNumBuses = function(e, t, n, o) {
return e = Math.max(e, o + n), e = Math.max(e, Math.max(n, t.min)),
e = Math.min(e, t.max);
}, flock.audioSystem.defaultBufferSize = function() {
return flock.platform.isMobile ? 8192 : flock.platform.browser.mozilla ? 2048 : 1024;
}, fluid.defaults("flock.busManager", {
gradeNames: [ "fluid.modelComponent" ],
model: {
nextAvailableBus: {
input: 0,
interconnect: 0
}
},
members: {
buses: {
expander: {
funcName: "flock.enviro.createAudioBuffers",
args: [ "{audioSystem}.model.numBuses", "{audioSystem}.model.blockSize" ]
}
}
},
invokers: {
acquireNextBus: {
funcName: "flock.busManager.acquireNextBus",
args: [ "{arguments}.0", "{that}.buses", "{that}.applier", "{that}.model", "{audioSystem}.model.chans", "{audioSystem}.model.numInputBuses" ]
},
reset: {
changePath: "nextAvailableBus",
value: {
input: 0,
interconnect: 0
}
}
},
listeners: {
"onDestroy.reset": "{that}.reset()"
}
}), flock.busManager.acquireNextBus = function(e, t, n, o, r, a) {
o = o.nextAvailableBus[e];
if (void 0 === o) flock.fail("An invalid bus type was specified when invoking flock.busManager.acquireNextBus(). Type was: " + e); else {
var i = o + r, r = r + a;
if ("interconnect" === e && (i += a, r = t.length), !(r <= i)) return n.change("nextAvailableBus." + e, ++o),
i;
flock.fail("Unable to aquire a bus. There are insufficient buses available. Please use an existing bus or configure additional buses using the enviroment's numBuses and numInputBuses parameters.");
}
}, fluid.defaults("flock.outputManager", {
gradeNames: [ "fluid.modelComponent" ],
model: {
audioSettings: "{audioSystem}.model"
},
invokers: {
start: "{that}.events.onStart.fire()",
stop: "{that}.events.onStop.fire()",
reset: "{that}.events.onReset.fire"
},
events: {
onStart: "{enviro}.events.onStart",
onStop: "{enviro}.events.onStop",
onReset: "{enviro}.events.onReset"
}
}), fluid.defaults("flock.nodeListComponent", {
gradeNames: "fluid.component",
members: {
nodeList: "@expand:flock.nodeList()"
},
invokers: {
insert: "flock.nodeList.insert({that}.nodeList, {arguments}.0, {arguments}.1)",
head: "flock.nodeList.head({that}.nodeList, {arguments}.0)",
tail: "flock.nodeList.tail({that}.nodeList, {arguments}.0)",
before: "flock.nodeList.before({that}.nodeList, {arguments}.0, {arguments}.1)",
after: "flock.nodeList.after({that}.nodeList, {arguments}.0, {arguments}.1)",
remove: "flock.nodeList.remove({that}.nodeList, {arguments}.0)",
replace: "flock.nodeList.after({that}.nodeList, {arguments}.0, {arguments}.1)"
}
}), fluid.defaults("flock.enviro", {
gradeNames: [ "fluid.modelComponent", "flock.nodeListComponent", "fluid.resolveRootSingle" ],
singleRootType: "flock.enviro",
isGlobalSingleton: !0,
members: {
buffers: {},
bufferSources: {}
},
components: {
asyncScheduler: {
type: "flock.scheduler.async"
},
audioSystem: {
type: "flock.audioSystem"
},
busManager: {