UNPKG

flocking

Version:

Creative audio synthesis for the Web

886 lines (877 loc) 157 kB
/*! 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: {