<div id=container><canvas id=backcanvas></canvas><canvas id=canvas></canvas>
<div id=load>
<h1>Loading</h1></div>
<div id=home>
<h1>Lazy 2048</h1>
<p><b>How to play:</b><br>⭐️ Drag pieces around<br>⭐️ Stack those with the same number<br>⭐️ Get to 2048 to win the game<br>⭐️ Or Sit simply<small>(recommended for highly lazy ones)</small></p>
<div id=start>NEW GAME</div>
<div id=menu><input type=checkbox class=opt id=m checked=checked><label for=m>Music</label><br><input type=checkbox class=opt id=s checked=checked><label for=s>Sound FX</label><br><input type=checkbox class=opt id=q checked=checked><label for=q>High Quality</label></div>
</div>
<div id=end style=display:none>
<h1>You win</h1>
<p><b>Let's party!</b><br><small>Success is commemorated; failure merely remembered</small><br>Written for js13kGames–2016</p>
<div id=reset>PLAY AGAIN</div>
</div>
</div>
#container,
#menu {
position: absolute
}
#end,
#home,
#load,
.opt,
.opt::after,
.opt::before {
box-sizing: border-box
}
body,
html {
background: #263238;
height: 100%;
margin: 0;
overflow: hidden;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%
}
#container>*,
label {
-moz-user-select: none;
-moz-user-select: -moz-none;
-ms-user-select: none;
-webkit-touch-callout: none;
-webkit-user-select: none;
user-select: none
}
#backcanvas,
#canvas,
#end,
#home,
#load {
display: block;
height: 100%;
left: 0;
position: absolute;
top: 0;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
width: 100%
}
#backcanvas {
background: #455A64
}
#end,
#home,
#load {
background: rgba(0, 0, 0, .5);
color: #fff;
cursor: default;
font: 300 64px/96px 'Segoe UI', 'Helvetica Neue', sans-serif;
height: 1080px;
padding: 0 100px;
transform-origin: 0 0;
width: 1920px
}
#load+#home {
display: none
}
#end>*,
#home>*,
#load>* {
margin: 40px 0
}
h1 {
font: 300 96px/1 'Segoe UI', 'Helvetica Neue', sans-serif;
margin-top: 80px;
text-shadow: 2px 0 0 red, -2px 0 0 #0ff
}
p {
text-shadow: 1px 0 0 red, -1px 0 0 #0ff
}
#reset,
#start {
-webkit-animation: blink .7s steps(2, start) infinite;
animation: blink .7s steps(2, start) infinite;
background: #E1FF5F;
border-radius: 2px;
color: #202020;
cursor: pointer;
display: inline-block;
font-size: 48px;
font-weight: 700;
outline: 4px;
outline-offset: 4px;
padding: 40px 120px
}
#reset:hover,
#start:hover,
.opt::after {
background: #fff
}
@-webkit-keyframes blink {
to {
outline: #E1FF5F solid 4px
}
}
@keyframes blink {
to {
outline: #E1FF5F solid 4px
}
}
#menu {
right: 0;
top: 0;
transform: translate3d(0, 0, 0);
width: 550px
}
.opt {
-webkit-appearance: none;
height: 48px;
margin: 0 10px;
outline: 0;
position: relative;
width: 80px
}
.opt::after,
.opt::before {
border-radius: 100px;
content: '';
display: inline-block;
transition: all .2s
}
.opt::after {
border: 2px solid #607d8b;
height: 40px;
left: 4px;
position: absolute;
top: 4px;
width: 40px
}
.opt::before {
background: #b0bec5;
height: 48px;
width: 80px
}
.opt:checked::after {
left: 36px
}
.opt:checked::before {
background: #c6ff00
}
label {
color: #eeff41
}
body.mobile #menu>* {
display: none
}
#q {
display: inline-block!important
}
#q+label {
display: inline!important
}
~ function() {
function H() {
this.A = function(e) {
for (var f = 0; 24 > f; f++) this[String.fromCharCode(97 + f)] = e[f] || 0;
0.01 > this.c && (this.c = 0.01);
e = this.b + this.c + this.e;
0.18 > e && (e = 0.18 / e, this.b *= e, this.c *= e, this.e *= e)
}
}
var U = new function() {
this.z = new H;
var e, f, d, h, j, w, I, J, K, y, k, L;
this.reset = function() {
var b = this.z;
h = 100 / (b.f * b.f + 0.001);
j = 100 / (b.g * b.g + 0.001);
w = 1 - 0.01 * b.h * b.h * b.h;
I = 1E-6 * -b.i * b.i * b.i;
b.a || (k = 0.5 - b.n / 2, L = 5E-5 * -b.o);
J = 1 + b.l * b.l * (0 < b.l ? -0.9 : 10);
K = 0;
y = 1 == b.m ? 0 : 2E4 * (1 - b.m) * (1 - b.m) + 32
};
this.C = function() {
this.reset();
var b = this.z;
e = 1E5 * b.b * b.b;
f = 1E5 * b.c * b.c;
d = 1E5 * b.e * b.e + 12;
return 3 * ((e + f + d) / 3 | 0)
};
this.B = function(b, M) {
var a = this.z,
N = 1 != a.s || a.v,
o = 0.1 * a.v * a.v,
O = 1 + 3E-4 * a.w,
l = 0.1 * a.s * a.s * a.s,
V = 1 + 1E-4 * a.t,
W = 1 != a.s,
X = a.x * a.x,
Y = a.g,
P = a.q || a.r,
Z = 0.2 * a.r * a.r * a.r,
B = a.q * a.q * (0 > a.q ? -1020 : 1020),
Q = a.p ? (2E4 * (1 - a.p) * (1 - a.p) | 0) + 32 : 0,
$ = a.d,
R = a.j / 2,
aa = 0.01 * a.k * a.k,
C = a.a,
D = e,
ba = 1 / e,
ca = 1 / f,
da = 1 / d,
a = 5 / (1 + 20 * a.u * a.u) * (0.01 + l);
0.8 < a && (a = 0.8);
for (var a = 1 - a, E = !1, S = 0, s = 0, t = 0, z = 0, q = 0, u, r = 0, g, m = 0, p, F = 0, c, T = 0, n, G = 0, A = Array(1024), v = Array(32), i = A.length; i--;) A[i] = 0;
for (i = v.length; i--;) v[i] = 2 * Math.random() - 1;
for (i = 0; i < M; i++) {
if (E) return i;
Q && ++T >= Q && (T = 0, this.reset());
y && ++K >= y && (y = 0, h *= J);
w += I;
h *= w;
h > j && (h = j, 0 < Y && (E = !0));
g = h;
0 < R && (G += aa, g *= 1 + Math.sin(G) * R);
g |= 0;
8 > g && (g = 8);
C || (k += L, 0 > k ? k = 0 : 0.5 < k && (k = 0.5));
if (++s > D) switch (s = 0, ++S) {
case 1:
D = f;
break;
case 2:
D = d
}
switch (S) {
case 0:
t = s * ba;
break;
case 1:
t = 1 + 2 * (1 - s * ca) * $;
break;
case 2:
t = 1 - s * da;
break;
case 3:
t = 0, E = !0
}
P && (B += Z, p = B | 0, 0 > p ? p = -p : 1023 < p && (p = 1023));
N && O && (o *= O, 1E-5 > o ? o = 1E-5 : 0.1 < o && (o = 0.1));
n = 0;
for (var ea = 8; ea--;) {
m++;
if (m >= g && (m %= g, 3 == C))
for (u = v.length; u--;) v[u] = 2 * Math.random() - 1;
switch (C) {
case 0:
c = m / g < k ? 0.5 : -0.5;
break;
case 1:
c = 1 - 2 * (m / g);
break;
case 2:
c = m / g;
c = 6.28318531 * (0.5 < c ? c - 1 : c);
c = 1.27323954 * c + 0.405284735 * c * c * (0 > c ? 1 : -1);
c = 0.225 * ((0 > c ? -1 : 1) * c * c - c) + c;
break;
case 3:
c = v[Math.abs(32 * m / g | 0)]
}
N && (u = r, l *= V, 0 > l ? l = 0 : 0.1 < l && (l = 0.1), W ? (q += (c - r) * l, q *= a) : (r = c, q = 0), r += q, z += r - u, c = z *= 1 - o);
P && (A[F % 1024] = c, c += A[(F - p + 1024) % 1024], F++);
n += c
}
n *= 0.125 * t * X;
b[i] = 1 <= n ? 32767 : -1 >= n ? -32768 : 32767 * n | 0
}
return M
}
};
window.SOUND = function(e) {
U.z.A(e);
var f = U.C(),
e = new Uint8Array(4 * ((f + 1) / 2 | 0) + 44),
f = 2 * U.B(new Uint16Array(e.buffer, 44), f),
d = new Uint32Array(e.buffer, 0, 44);
d[0] = 1179011410;
d[1] = f + 36;
d[2] = 1163280727;
d[3] = 544501094;
d[4] = 16;
d[5] = 65537;
d[6] = 44100;
d[7] = 88200;
d[8] = 1048578;
d[9] = 1635017060;
d[10] = f;
for (var f = f + 44, d = 0, h = "data:audio/wav;base64,", x = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; d < f; d += 3) var j = e[d] << 16 | e[d + 1] << 8 | e[d + 2],
h = h + (x[j >> 18] + x[j >> 12 & 63] + x[j >> 6 & 63] + x[j & 63]);
return h
}
}()
! function() {
function t(t) {
return Math.min((0 | .04 * Math.PI * t) << 1, 16)
}
function e() {
P = new q(255, 360, 450, 180, !1)
}
function n() {
A.clearRect(0, 0, T, S), A.save(), A.shadowColor = "rgba(0,0,0,0.4)", A.shadowBlur = 25, P.paint(A, "#0091EA"), A.shadowColor = "#000", A.translate(0, 1), at.paint(A, "rgba(55,71,79,0.4)"), ct.paint(A, "rgba(55,71,79,0.4)"), ft.paint(A, "rgba(55,71,79,0.4)"), A.restore()
}
function o(t, e, n) {
t.style[e] = n + "px"
}
function s() {
var t = window.innerWidth,
e = window.innerHeight;
t / e > B ? t = e * B : e = t / B, I = T / t, o(D, "width", t), o(D, "height", e), o(D, "left", .5 * (window.innerWidth - t)), o(D, "top", .5 * (window.innerHeight - e));
var n = .5 * t / T,
s = "scale3d(" + n + "," + n + ",1)";
W.style[O] = s, V.style[O] = s
}
function i(t, e) {
var n, o = null;
return function() {
function s() {
var i = Date.now() - n;
i < e ? o = setTimeout(s, e - i) : (o = null, t())
}
n = Date.now(), o || (o = setTimeout(s, e))
}
}
function r(t) {
var e = t.target;
"INPUT" != e.tagName && "LABEL" != e.tagName && (t.preventDefault(), t.stopPropagation())
}
function a() {
D.removeChild(W), x.play("new"), (y || I > 1) && document.body.requestFullscreen && document.body.requestFullscreen()
}
function c() {
V.style.display = "block", x.play("win")
}
function f() {
V.style.display = "none", x.play("new"), $ = [], tt = [], et = [], nt = null, ht.dragging = !1, h()
}
function l() {
C.clearRect(0, 0, T, S);
for (var t = 0, e = tt; t < e.length; t++) {
var n = e[t];
n.integrate()
}
for (var o, s = !1, i = function(t) {
var e = $[t];
e.center.y >= S + e.r && (et = et.filter(function(t) {
return t.parent != e
}), tt = tt.filter(function(t) {
return t.parent != e
}), nt && nt.parent == e && (nt = null, ht.dragging = !1), $.splice(t, 1), --it[e.n], x.play("die"), s = !0, --t), o = t
}, r = 3; r < $.length; ++r) i(r), r = o;
for (var a = function(t) {
for (var e = $[t], n = 2.5 * e.r, o = 99999, i = null, r = 0, a = t + 1; a < $.length; ++a) {
var f = $[a];
if (e.n == f.n) {
var l = e.center.distance(f.center);
l < n && l < o && (o = l, i = f, r = a)
}
}
if (!i) return "continue";
var _ = .5 * (e.center.x + i.center.x),
h = .5 * (e.center.y + i.center.y);
if (o > 2 * e.r) {
for (var u = 0, d = e.positions; u < d.length; u++) {
var p = d[u];
p.x += (_ - p.x) * G, p.y += (h - p.y) * G
}
for (var v = 0, y = i.positions; v < y.length; v++) {
var p = y[v];
p.x += (_ - p.x) * G, p.y += (h - p.y) * G
}
} else et = et.filter(function(t) {
return t.parent != e && t.parent != i
}), tt = tt.filter(function(t) {
return t.parent != e && t.parent != i
}), !nt || nt.parent != e && nt.parent != i || (nt = null, ht.dragging = !1), $.splice(r, 1), $[t] = new E(_, h, e.n << 1, !1), it[e.n] -= 2, x.play("bip"), s = !0, 1024 == e.n && c()
}, r = 3; r < $.length - 1; ++r) a(r);
s && rt(), nt && (nt.position.x += (ht.x - nt.position.x) * Z, nt.position.y += (ht.y - nt.position.y) * Z);
for (var f = 0; f < J; ++f) {
for (var _ = 0, h = et; _ < h.length; _++) {
var u = h[_];
u.solve()
}
for (var d = 0, p = $; d < p.length; d++) {
var v = p[d];
v.boundingBox()
}
for (var r = 0; r < $.length - 1; ++r)
for (var y = r + 1; y < $.length; ++y) R($[r], $[y]) && U()
}
for (var m = 0, w = $; m < w.length; m++) {
var v = w[m];
v.paint(C)
}
nt && (C.beginPath(), C.moveTo(nt.position.x, nt.position.y), C.lineTo(ht.x, ht.y), C.strokeStyle = "#FFD600", C.stroke()), requestAnimationFrame(l)
}
function _() {
return (.3 * Math.random() + .35) * T
}
function h() {
for (var t = 2; t <= 2048; t *= 2) it[t] = 0;
at = new q(280, 480, 400, 60), ct = new q(220, 420, 60, 120), ft = new q(680, 420, 60, 120), new w(at, at.handle0, ct.handle0, .1), new w(at, at.handle1, ft.handle1, .1);
var e = .5 * S;
new E(.35 * T, e), new E(.65 * T, e)
}
function u(t) {
ht.x = (t.clientX - D.offsetLeft) * I, ht.y = (t.clientY - D.offsetTop) * I
}
function d() {
for (var t = new lt, e = 0; e < 8; ++e) t.generate(e);
ut = t.createAudio(), ut.loop = !0, ut.volume = .9
}
function p() {
y && (document.body.className = "mobile");
var t = document.getElementById("m"),
e = document.getElementById("s"),
o = document.getElementById("q");
t.addEventListener("change", function(e) {
ut && (t.checked ? (ut.currentTime = 0, ut.play()) : ut.pause())
}), e.addEventListener("change", function(t) {
x.on = e.checked
});
var s = q.prototype.paint,
i = q.prototype.paintLow,
r = E.prototype.paint,
a = E.prototype.paintLow;
y && (o.checked = !1, q.prototype.paint = i, E.prototype.paint = a), o.addEventListener("change", function(t) {
q.prototype.paint = o.checked ? s : i, E.prototype.paint = o.checked ? r : a, n()
}), D.removeChild(H), ut && ut.play()
}
var v = function() {
function t() {
this.on = !0, this.sounds = {}
}
return t.prototype.add = function(t, e, n) {
this.sounds[t] = {
tick: 0,
count: e,
pool: []
};
for (var o = 0; o < e; ++o) {
var s = new Audio;
s.src = window.SOUND(n), this.sounds[t].pool.push(s)
}
}, t.prototype.play = function(t) {
if (this.on) {
var e = this.sounds[t];
e.pool[e.tick].play(), ++e.tick >= e.count && (e.tick = 0)
}
}, t
}(),
x = new v,
y = null != navigator.userAgent.match(/Android|iPhone|iPad/i);
y ? x.on = !1 : (x.add("bip", 9, [1, , .1241, , .1855, .5336, , , , , , , , , , , , , 1, , , .1, , .64]), x.add("die", 4, [1, .0013, .3576, .0681, .8007, .5117, , -.3453, .0049, .148, -.2563, -.2717, .2608, , -.3543, -.1884, -.0106, -.0281, .9971, -.6629, -.7531, .0097, -.0086, .5]), x.add("new", 2, [1, , .2548, , .1007, .7539, .0996, -.5302, , , , , , .7769, -.4436, , , , 1, , , , , .5]), x.add("win", 1, [1, .0309, .5597, .0464, .7472, .369, , -.1366, , -.3111, , -.1581, -.8665, , -.0414, .2802, .0258, -.1198, .9955, .1759, , , -5e-4, .64]));
var m = function() {
function t(t) {
void 0 === t && (t = 1), this.vertices = [], this.positions = [], this.constraints = [], this.boundaries = [], this.center = new k, this.halfExtents = new k, this.mass = t
}
return t.prototype.boundingBox = function() {
for (var t = 99999, e = 99999, n = -99999, o = -99999, s = 0, i = this.positions; s < i.length; s++) {
var r = i[s];
r.x < t && (t = r.x), r.y < e && (e = r.y), r.x > n && (n = r.x), r.y > o && (o = r.y)
}
this.center.set(.5 * (t + n), .5 * (e + o)), this.halfExtents.set(.5 * (n - t), .5 * (o - e))
}, t.prototype.project = function(t) {
this._min = 99999, this._max = -99999;
for (var e = 0, n = this.positions; e < n.length; e++) {
var o = n[e],
s = o.dot(t);
s < this._min && (this._min = s), s > this._max && (this._max = s)
}
}, t.prototype.drag = function() {
if (ht.dragging && !nt && C.isPointInPath(ht.x, ht.y))
for (var t = 99999, e = 0, n = this.vertices; e < n.length; e++) {
var o = n[e],
s = o.position.distance(ht);
s < t && (t = s, nt = o)
}
}, t
}(),
w = function() {
function t(t, e, n, o, s) {
void 0 === s && (s = !1), this.parent = t, this.v0 = e, this.v1 = n, this.p0 = e.position, this.p1 = n.position, this.length = this.p0.distance(this.p1), this.stiffness = o, this.isBoundary = s, t.constraints.push(this), s && t.boundaries.push(this), et.push(this)
}
return t.prototype.solve = function() {
ot.setSubtract(this.p0, this.p1);
var t = ot.length();
t && (ot.multiplyScalar(this.stiffness * (this.length - t) / t), this.p0.add(ot), this.p1.subtract(ot))
}, t
}(),
g = this && this.__extends || function(t, e) {
function n() {
this.constructor = t
}
for (var o in e) e.hasOwnProperty(o) && (t[o] = e[o]);
t.prototype = null === e ? Object.create(e) : (n.prototype = e.prototype, new n)
},
q = function(t) {
function e(n, o, s, i, r) {
void 0 === r && (r = !0), t.call(this, 250);
var a = this.handle0 = new M(this, n, o + e.chamfer),
c = new M(this, n + e.chamfer, o),
f = new M(this, n + s - e.chamfer, o),
l = this.handle1 = new M(this, n + s, o + e.chamfer),
_ = new L(this, n + s, o + i),
h = new L(this, n, o + i);
new w(this, a, c, .1, !0), new w(this, c, f, .1, !0), new w(this, f, l, .1, !0), new w(this, l, _, .1, !0), new w(this, _, h, .1, !0), new w(this, h, a, .1, !0), new w(this, a, l, .1), new w(this, a, _, .1), new w(this, c, _, .1), new w(this, c, h, .1), new w(this, f, _, .1), new w(this, f, h, .1), new w(this, l, h, .1), r && $.push(this)
}
return g(e, t), e.prototype.paint = function(t, e) {
t.beginPath();
var n = this.positions[0],
o = this.positions[1];
t.moveTo(.5 * (n.x + o.x), .5 * (n.y + o.y));
for (var s = 1; s <= 6; ++s) 4 != s && 5 != s ? (n = this.positions[s % 6], o = this.positions[(s + 1) % 6], t.quadraticCurveTo(n.x, n.y, .5 * (n.x + o.x), .5 * (n.y + o.y))) : t.lineTo(this.positions[s].x, this.positions[s].y);
t.fillStyle = e || "#00B0FF", t.fill()
}, e.prototype.paintLow = function(t, e) {
t.beginPath();
for (var n = 0, o = this.positions; n < o.length; n++) {
var s = o[n];
t.lineTo(s.x, s.y)
}
t.fillStyle = e || "#00B0FF", t.fill()
}, e.chamfer = 10, e
}(m),
g = this && this.__extends || function(t, e) {
function n() {
this.constructor = t
}
for (var o in e) e.hasOwnProperty(o) && (t[o] = e[o]);
t.prototype = null === e ? Object.create(e) : (n.prototype = e.prototype, new n)
},
b = {};
~["eee4da", "ede0c8", "f2b179", "f59563", "f67c5f", "f65e3b", "edcf72", "edcc61", "edc850", "edc53f", "edc22e"].forEach(function(t, e) {
b[Math.pow(2, e + 1)] = "#" + t
});
var E = function(e) {
function n(n, o, s, i) {
void 0 === o && (o = -40), void 0 === s && (s = 2), void 0 === i && (i = !0), e.call(this, 1 + .2 * Math.log10(s)), ++it[this.n = s], this.r = 40 + 4 * (Math.log2(s) - 1), this.font = "bold " + (.1 * this.r + 28) + "px 'Segoe UI','Helvetica Neue',sans-serif";
for (var r = t(this.r), a = 2 * Math.PI / r, c = 0; c < r; ++c) {
var f = c * a;
new M(this, n + this.r * Math.cos(f), o + this.r * Math.sin(f))
}
for (var c = 0; c < r - 1; ++c)
for (var l = c + 1; l < r; ++l) new w(this, this.vertices[c], this.vertices[l], .005, l == c + 1);
i && (this.boundingBox(), $.push(this))
}
return g(n, e), n.prototype.paint = function(t) {
t.beginPath();
var e = this.positions[0],
n = this.positions[1];
t.moveTo(.5 * (e.x + n.x), .5 * (e.y + n.y));
for (var o = 1; o <= this.positions.length; ++o) e = this.positions[o % this.positions.length], n = this.positions[(o + 1) % this.positions.length], t.quadraticCurveTo(e.x, e.y, .5 * (e.x + n.x), .5 * (e.y + n.y));
t.fillStyle = b[this.n], t.fill(), t.save(), t.translate(this.center.x, this.center.y), t.rotate(Math.atan2(e.y - this.center.y, e.x - this.center.x)), t.font = this.font, t.fillStyle = this.n > 4 ? "#f9f6f2" : "#776e65", t.fillText("" + this.n, 0, 0), t.restore(), this.drag()
}, n.prototype.paintLow = function(t) {
t.beginPath();
var e = this.boundaries[0].p0;
t.moveTo(e.x, e.y);
for (var n = 0, o = this.boundaries; n < o.length; n++) {
var s = o[n].p1;
t.lineTo(s.x, s.y)
}
t.fillStyle = b[this.n], t.fill(), t.save(), t.translate(this.center.x, this.center.y), t.rotate(Math.atan2(e.y - this.center.y, e.x - this.center.x)), t.font = this.font, t.fillStyle = this.n > 4 ? "#f9f6f2" : "#776e65", t.fillText("" + this.n, 0, 0), t.restore(), this.drag()
}, n
}(m),
M = function() {
function t(t, e, n) {
this.parent = t, this.position = new k(e, n), this.oldPosition = new k(e, n), t.vertices.push(this), t.positions.push(this.position), tt.push(this)
}
return t.prototype.integrate = function() {
var t = this.position,
e = this.oldPosition,
n = t.x,
o = t.y;
t.x += t.x - e.x, t.y += t.y - e.y + Y, e.set(n, o), t.y < -100 ? t.y = -100 : t.y >= N.height + 250 && (t.x -= (t.x - e.x) * Q, t.y = N.height - 1), t.x < 0 ? t.x = 0 : t.x >= N.width && (t.x = N.width - 1)
}, t
}(),
g = this && this.__extends || function(t, e) {
function n() {
this.constructor = t
}
for (var o in e) e.hasOwnProperty(o) && (t[o] = e[o]);
t.prototype = null === e ? Object.create(e) : (n.prototype = e.prototype, new n)
},
L = function(t) {
function e(e, n, o) {
t.call(this, e, n, o), this.x = n, this.y = o
}
return g(e, t), e.prototype.integrate = function() {
this.position.set(this.x, this.y), this.oldPosition.set(this.x, this.y)
}, e
}(M),
k = function() {
function t(t, e) {
void 0 === t && (t = 0), void 0 === e && (e = 0), this.x = t, this.y = e
}
return t.prototype.set = function(t, e) {
this.x = t, this.y = e
}, t.prototype.setTo = function(t) {
this.x = t.x, this.y = t.y
}, t.prototype.length = function() {
return Math.sqrt(this.x * this.x + this.y * this.y)
}, t.prototype.distance = function(t) {
var e = this.x - t.x,
n = this.y - t.y;
return Math.sqrt(e * e + n * n)
}, t.prototype.add = function(t) {
this.x += t.x, this.y += t.y
}, t.prototype.subtract = function(t) {
this.x -= t.x, this.y -= t.y
}, t.prototype.setSubtract = function(t, e) {
this.x = t.x - e.x, this.y = t.y - e.y
}, t.prototype.dot = function(t) {
return this.x * t.x + this.y * t.y
}, t.prototype.multiplyScalar = function(t) {
this.x *= t, this.y *= t
}, t.prototype.setMultiplyScalar = function(t, e) {
this.x = t.x * e, this.y = t.y * e
}, t.prototype.setNormal = function(t, e) {
var n = t.y - e.y,
o = e.x - t.x,
s = Math.sqrt(n * n + o * o);
if (s < Number.MIN_VALUE) return this.x = n, void(this.y = o);
var i = 1 / s;
this.x = n * i, this.y = o * i
}, t
}(),
P = null,
T = 960,
S = 540,
B = 16 / 9,
I = 1,
D = document.getElementById("container"),
F = document.getElementById("backcanvas"),
N = document.getElementById("canvas"),
A = F.getContext("2d"),
C = N.getContext("2d"),
O = "transform";
O in D.style || (O = "webkitTransform"), F.width = N.width = T, F.height = N.height = S, C.lineWidth = 2, C.textAlign = "center", C.textBaseline = "middle", window.addEventListener("resize", s), window.addEventListener("orientationchange", s), N.addEventListener("contextmenu", function(t) {
t.preventDefault()
});
var j = function() {
function t(t, e) {
if (Math.abs(e.center.x - t.center.x) - (t.halfExtents.x + e.halfExtents.x) >= 0 || Math.abs(e.center.y - t.center.y) - (t.halfExtents.y + e.halfExtents.y) >= 0) return !1;
n = 99999;
for (var r = 0, a = [t, e]; r < a.length; r++)
for (var c = a[r], f = 0, l = c.boundaries; f < l.length; f++) {
var _ = l[f];
ot.setNormal(_.p0, _.p1), t.project(ot), e.project(ot);
var h = t._min < e._min ? e._min - t._max : t._min - e._max;
if (h > 0) return !1;
h *= -1, h < n && (n = h, i.setTo(ot), o = _)
}
if (o.parent != e) {
var u = t;
t = e, e = u
}
ot.setSubtract(t.center, e.center), ot.dot(i) < 0 && i.multiplyScalar(-1);
for (var d = 99999, p = 0, v = t.vertices; p < v.length; p++) {
var x = v[p];
ot.setSubtract(x.position, e.center);
var h = i.dot(ot);
h < d && (d = h, s = x)
}
return !0
}
function e() {
var t = o.p0,
e = o.p1,
r = o.v0.oldPosition,
a = o.v1.oldPosition,
c = s.position,
f = s.oldPosition;
ot.setMultiplyScalar(i, n);
var l = Math.abs(t.x - e.x) > Math.abs(t.y - e.y) ? (c.x - ot.x - t.x) / (e.x - t.x) : (c.y - ot.y - t.y) / (e.y - t.y),
_ = 1 / (l * l + (1 - l) * (1 - l)),
h = s.parent.mass,
u = o.parent.mass,
d = h + u;
h /= 2 * d, u /= d;
var p = (1 - l) * _ * h,
v = l * _ * h;
t.x -= ot.x * p, t.y -= ot.y * p, e.x -= ot.x * v, e.y -= ot.y * v, c.x += ot.x * u, c.y += ot.y * u, ot.set(c.x - f.x - .5 * (t.x + e.x - r.x - a.x), c.y - f.y - .5 * (t.y + e.y - r.y - a.y)), st.set(-i.y, i.x), ot.setMultiplyScalar(st, ot.dot(st)), r.x -= ot.x * K * p, r.y -= ot.y * K * p, a.x -= ot.x * K * v, a.y -= ot.y * K * v, f.x += ot.x * K * u, f.y += ot.y * K * u
}
var n, o, s, i = new k;
return [t, e]
}(),
R = j[0],
U = j[1],
H = document.getElementById("load"),
W = document.getElementById("home"),
z = document.getElementById("start"),
V = document.getElementById("end"),
X = document.getElementById("reset");
W.addEventListener("mousedown", r), W.addEventListener("touchstart", r), z.addEventListener("mousedown", a), z.addEventListener("touchstart", a), V.addEventListener("mousedown", r), V.addEventListener("touchstart", r), X.addEventListener("mousedown", f), X.addEventListener("touchstart", f);
var Y = .6,
G = .1,
J = 40,
K = .9,
Q = .6,
Z = .24,
$ = [],
tt = [],
et = [],
nt = null,
ot = new k,
st = new k,
it = {},
rt = i(function() {
var t = it[256] || it[512] || it[1024];
it[2] ? new E(_()) : it[4] ? new E(_(), -44, 4) : t ? it[8] ? new E(_(), -48, 8) : (new E(.35 * T, -44, 4), new E(.65 * T, -44, 4)) : (new E(.35 * T), new E(.65 * T)), x.play("new")
}, 300),
at = null,
ct = null,
ft = null,
lt = function() {
function t(t) {
return Math.sin(6.283184 * t)
}
function e(e) {
return t(e) < 0 ? -1 : 1
}
function n(t) {
return t % 1 - .5
}
function o(t) {
var e = t % 1 * 4;
return e < 2 ? e - 1 : 3 - e
}
function s(t) {
return .00390625 * Math.pow(1.059463094, t - 128)
}
var i, r, a = 44100,
c = 2,
f = a * _t.songLen;
! function() {
var t = Math.ceil(Math.sqrt(f * c / 2)),
e = document.createElement("canvas").getContext("2d");
i = e.createImageData(t, t).data;
var n, o = e.createImageData(t, t).data;
for (n = t * t * 4 - 2; n >= 0; n -= 2) o[n] = 0, o[n + 1] = 128;
r = o
}(), this.lps = a / _t.rowLen, this.generate = function(l) {
var _, h, u, d, p, v, x, y, m, w, g, q, b, E, M, L, k, P, T, S, B, I, D = [t, e, n, o],
F = i,
N = r,
A = f,
C = f * c * 2,
O = _t.songData[l],
j = _t.rowLen,
R = D[O.lfo_waveform],
U = D[O.osc1_waveform],
H = D[O.osc2_waveform],
W = O.env_attack,
z = O.env_sustain,
V = O.env_release,
X = Math.pow(2, O.fx_pan_freq - 8) / j,
Y = Math.pow(2, O.lfo_freq - 8) / j;
for (u = 0; u < C; u += 2) F[u] = 0, F[u + 1] = 128;
for (x = 0, d = 0; d < _t.endPattern - 1; ++d)
for (y = O.p[d], p = 0; p < 32; ++p) {
if (y && (v = O.c[y - 1].n[p]))
for (m = w = 0, B = s(v + 12 * (O.osc1_oct - 8) + O.osc1_det) * (1 + 8e-4 * O.osc1_detune), I = s(v + 12 * (O.osc2_oct - 8) + O.osc2_det) * (1 + 8e-4 * O.osc2_detune), g = O.fx_resonance / 255, q = b = 0, _ = W + z + V - 1; _ >= 0; --_) {
switch (h = _ + x, L = R(h * Y) * O.lfo_amt / 512 + .5, k = 1, _ < W ? k = _ / W : _ >= W + z && (k -= (_ - W - z) / V), M = B, O.lfo_osc1_freq && (M += L), O.osc1_xenv && (M *= k * k), m += M, T = U(m) * O.osc1_vol, M = I, O.osc2_xenv && (M *= k * k), w += M, T += H(w) * O.osc2_vol, O.noise_fader && (T += (2 * Math.random() - 1) * O.noise_fader * k), T *= k / 255, S = O.fx_freq, O.lfo_fx_freq && (S *= L), S = 1.5 * Math.sin(3.141592 * S / a), q += S * b, E = g * (T - b) - q, b += S * E, O.fx_filter) {
case 1:
T = E;
break;
case 2:
T = q;
break;
case 3:
T = b;
break;
case 4:
T = q + E
}
M = t(h * X) * O.fx_pan_amt / 512 + .5, T *= 39 * O.env_master, h <<= 2, P = F[h] + (F[h + 1] << 8) + T * (1 - M), F[h] = 255 & P, F[h + 1] = P >> 8 & 255, P = F[h + 2] + (F[h + 3] << 8) + T * M, F[h + 2] = 255 & P, F[h + 3] = P >> 8 & 255
}
x += j
}
for (d = O.fx_delay_time * j >> 1, M = O.fx_delay_amt / 255, v = 0; v < A - d; ++v) u = 4 * v, h = 4 * (v + d), P = F[h] + (F[h + 1] << 8) + (F[u + 2] + (F[u + 3] << 8) - 32768) * M, F[h] = 255 & P, F[h + 1] = P >> 8 & 255, P = F[h + 2] + (F[h + 3] << 8) + (F[u] + (F[u + 1] << 8) - 32768) * M, F[h + 2] = 255 & P, F[h + 3] = P >> 8 & 255;
for (u = 0; u < C; u += 2) P = N[u] + (N[u + 1] << 8) + F[u] + (F[u + 1] << 8) - 32768, N[u] = 255 & P, N[u + 1] = P >> 8 & 255
}, this.createAudio = function() {
var t, e, n, o, s, a, l, _, h = r,
u = f * c * 2;
for (i = null, s = u - 8, a = s - 36, o = String.fromCharCode(82, 73, 70, 70, 255 & s, s >> 8 & 255, s >> 16 & 255, s >> 24 & 255, 87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0, 0, 1, 0, 2, 0, 68, 172, 0, 0, 16, 177, 2, 0, 4, 0, 16, 0, 100, 97, 116, 97, 255 & a, a >> 8 & 255, a >> 16 & 255, a >> 24 & 255), t = 0; t < u;) {
for (n = "", e = 0; e < 256 && t < u; ++e, t += 2) _ = 4 * (h[t] + (h[t + 1] << 8) - 32768), _ = _ < -32768 ? -32768 : _ > 32767 ? 32767 : _, n += String.fromCharCode(255 & _, _ >> 8 & 255);
o += n
}
return l = "data:audio/wav;base64," + btoa(o), o = null, new Audio(l)
}, this.getData = function(t, e) {
for (var n = Math.floor(t * a), o = 0, s = [], i = r; o < 2 * e; o += 2) {
var c = 4 * (n + o) + 1;
s.push(t > 0 && c < i.length ? (i[c] + i[c - 1] / 256) / 256 : .5)
}
return s
}
},
_t = {
songLen: 37,
songData: [{
osc1_oct: 7,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 0,
osc1_vol: 192,
osc1_waveform: 3,
osc2_oct: 7,
osc2_det: 0,
osc2_detune: 7,
osc2_xenv: 0,
osc2_vol: 201,
osc2_waveform: 3,
noise_fader: 0,
env_attack: 789,
env_sustain: 1234,
env_release: 13636,
env_master: 191,
fx_filter: 2,
fx_freq: 5839,
fx_resonance: 254,
fx_delay_time: 6,
fx_delay_amt: 121,
fx_pan_freq: 6,
fx_pan_amt: 147,
lfo_osc1_freq: 0,
lfo_fx_freq: 1,
lfo_freq: 6,
lfo_amt: 195,
lfo_waveform: 0,
p: [1, 2, 0, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [154, 0, 154, 0, 152, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 154, 0, 152, 0, 157, 0, 0, 0, 156, 0, 0, 0, 0, 0]
}, {
n: [154, 0, 154, 0, 152, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 154, 0, 152, 0, 157, 0, 0, 0, 159, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}, {
osc1_oct: 7,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 0,
osc1_vol: 255,
osc1_waveform: 2,
osc2_oct: 8,
osc2_det: 0,
osc2_detune: 18,
osc2_xenv: 1,
osc2_vol: 191,
osc2_waveform: 2,
noise_fader: 0,
env_attack: 3997,
env_sustain: 56363,
env_release: 1e5,
env_master: 255,
fx_filter: 2,
fx_freq: 392,
fx_resonance: 255,
fx_delay_time: 8,
fx_delay_amt: 69,
fx_pan_freq: 5,
fx_pan_amt: 67,
lfo_osc1_freq: 0,
lfo_fx_freq: 1,
lfo_freq: 4,
lfo_amt: 57,
lfo_waveform: 3,
p: [1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}, {
osc1_oct: 8,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 0,
osc1_vol: 0,
osc1_waveform: 0,
osc2_oct: 8,
osc2_det: 0,
osc2_detune: 0,
osc2_xenv: 0,
osc2_vol: 0,
osc2_waveform: 0,
noise_fader: 60,
env_attack: 50,
env_sustain: 419,
env_release: 4607,
env_master: 130,
fx_filter: 1,
fx_freq: 10332,
fx_resonance: 120,
fx_delay_time: 4,
fx_delay_amt: 16,
fx_pan_freq: 5,
fx_pan_amt: 108,
lfo_osc1_freq: 0,
lfo_fx_freq: 0,
lfo_freq: 5,
lfo_amt: 187,
lfo_waveform: 0,
p: [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [0, 0, 147, 0, 0, 0, 147, 147, 0, 0, 147, 0, 0, 147, 0, 147, 0, 0, 147, 0, 0, 0, 147, 147, 0, 0, 147, 0, 0, 147, 0, 147]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}, {
osc1_oct: 7,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 1,
osc1_vol: 255,
osc1_waveform: 0,
osc2_oct: 7,
osc2_det: 0,
osc2_detune: 0,
osc2_xenv: 1,
osc2_vol: 255,
osc2_waveform: 0,
noise_fader: 0,
env_attack: 50,
env_sustain: 150,
env_release: 4800,
env_master: 200,
fx_filter: 2,
fx_freq: 600,
fx_resonance: 254,
fx_delay_time: 0,
fx_delay_amt: 0,
fx_pan_freq: 0,
fx_pan_amt: 0,
lfo_osc1_freq: 0,
lfo_fx_freq: 0,
lfo_freq: 0,
lfo_amt: 0,
lfo_waveform: 0,
p: [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [147, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}, {
osc1_oct: 7,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 0,
osc1_vol: 255,
osc1_waveform: 2,
osc2_oct: 7,
osc2_det: 0,
osc2_detune: 9,
osc2_xenv: 0,
osc2_vol: 154,
osc2_waveform: 2,
noise_fader: 0,
env_attack: 2418,
env_sustain: 1075,
env_release: 10614,
env_master: 240,
fx_filter: 3,
fx_freq: 2962,
fx_resonance: 255,
fx_delay_time: 6,
fx_delay_amt: 117,
fx_pan_freq: 3,
fx_pan_amt: 73,
lfo_osc1_freq: 0,
lfo_fx_freq: 1,
lfo_freq: 5,
lfo_amt: 124,
lfo_waveform: 0,
p: [0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [154, 0, 154, 0, 152, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 154, 0, 152, 0, 157, 0, 0, 0, 156, 0, 0, 0, 0, 0]
}, {
n: [154, 0, 154, 0, 152, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 147, 0, 152, 0, 157, 0, 0, 0, 159, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}, {
osc1_oct: 7,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 0,
osc1_vol: 192,
osc1_waveform: 1,
osc2_oct: 6,
osc2_det: 0,
osc2_detune: 9,
osc2_xenv: 0,
osc2_vol: 192,
osc2_waveform: 1,
noise_fader: 0,
env_attack: 137,
env_sustain: 2e3,
env_release: 4611,
env_master: 192,
fx_filter: 1,
fx_freq: 982,
fx_resonance: 89,
fx_delay_time: 6,
fx_delay_amt: 25,
fx_pan_freq: 6,
fx_pan_amt: 77,
lfo_osc1_freq: 0,
lfo_fx_freq: 1,
lfo_freq: 3,
lfo_amt: 69,
lfo_waveform: 0,
p: [1, 2, 1, 3, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [130, 0, 130, 0, 142, 0, 130, 130, 0, 142, 130, 0, 142, 0, 130, 0, 130, 0, 130, 0, 142, 0, 130, 130, 0, 142, 130, 0, 142, 0, 130, 0]
}, {
n: [123, 0, 123, 0, 135, 0, 123, 123, 0, 135, 123, 0, 135, 0, 123, 0, 123, 0, 123, 0, 135, 0, 123, 123, 0, 135, 123, 0, 135, 0, 123, 0]
}, {
n: [135, 0, 135, 0, 147, 0, 135, 135, 0, 147, 135, 0, 147, 0, 135, 0, 135, 0, 135, 0, 147, 0, 135, 135, 0, 147, 135, 0, 147, 0, 135, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}, {
osc1_oct: 7,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 0,
osc1_vol: 255,
osc1_waveform: 3,
osc2_oct: 8,
osc2_det: 0,
osc2_detune: 0,
osc2_xenv: 0,
osc2_vol: 255,
osc2_waveform: 0,
noise_fader: 127,
env_attack: 22,
env_sustain: 88,
env_release: 3997,
env_master: 255,
fx_filter: 3,
fx_freq: 4067,
fx_resonance: 234,
fx_delay_time: 4,
fx_delay_amt: 33,
fx_pan_freq: 2,
fx_pan_amt: 84,
lfo_osc1_freq: 0,
lfo_fx_freq: 1,
lfo_freq: 3,
lfo_amt: 28,
lfo_waveform: 0,
p: [0, 0, 1, 2, 1, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [0, 0, 142, 0, 154, 0, 0, 0, 142, 0, 0, 0, 154, 0, 0, 0, 0, 0, 142, 0, 154, 0, 0, 0, 142, 0, 0, 0, 154, 0, 0, 0]
}, {
n: [0, 0, 147, 0, 154, 0, 0, 0, 147, 0, 0, 0, 154, 0, 0, 0, 0, 0, 147, 0, 154, 0, 147, 0, 0, 0, 154, 0, 0, 0, 154, 0]
}, {
n: [0, 0, 147, 0, 154, 0, 0, 0, 147, 0, 0, 0, 154, 0, 0, 0, 0, 0, 147, 0, 154, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}, {
osc1_oct: 8,
osc1_det: 0,
osc1_detune: 0,
osc1_xenv: 0,
osc1_vol: 0,
osc1_waveform: 0,
osc2_oct: 8,
osc2_det: 0,
osc2_detune: 0,
osc2_xenv: 0,
osc2_vol: 0,
osc2_waveform: 0,
noise_fader: 255,
env_attack: 140347,
env_sustain: 9216,
env_release: 133417,
env_master: 208,
fx_filter: 2,
fx_freq: 2500,
fx_resonance: 16,
fx_delay_time: 2,
fx_delay_amt: 157,
fx_pan_freq: 8,
fx_pan_amt: 207,
lfo_osc1_freq: 0,
lfo_fx_freq: 1,
lfo_freq: 2,
lfo_amt: 51,
lfo_waveform: 0,
p: [0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
c: [{
n: [147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
n: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}]
}],
rowLen: 5513,
endPattern: 9
},
ht = {
dragging: !1,
x: 0,
y: 0
};
addEventListener("mousedown", function(t) {
t.preventDefault(), ht.dragging = !0, u(t)
}), addEventListener("mousemove", function(t) {
t.preventDefault(), u(t)
}), addEventListener("mouseup", function(t) {
t.preventDefault(), ht.dragging = !1, nt = null
}), document.addEventListener("touchstart", function(t) {
var e = t.target;
"INPUT" != e.tagName && "LABEL" != e.tagName && t.preventDefault(), ht.dragging = !0, u(t.targetTouches[0])
}), document.addEventListener("touchmove", function(t) {
t.preventDefault(), u(t.targetTouches[0])
}), document.addEventListener("touchend", function(t) {
ht.dragging = !1, nt = null
}), document.addEventListener("touchcancel", function(t) {
ht.dragging = !1, nt = null
}), Math.log2 || (Math.log2 = function(t) {
return Math.log(t) / Math.LN2
}), Math.log10 || (Math.log10 = function(t) {
return Math.log(t) / Math.LN10
}), Date.now || (Date.now = function() {
return (new Date).getTime()
}), Element.prototype.requestFullscreen || (Element.prototype.requestFullscreen = Element.prototype.mozRequestFullScreen || Element.prototype.msRequestFullscreen || Element.prototype.webkitRequestFullscreen);
var ut = null;
if (!y) try {
d()
} catch (t) {}
s(), p(), h(), e(), requestAnimationFrame(l), n()
}();
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.