litecanvas 0.206.1 → 0.207.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dist.dev.js CHANGED
@@ -1,6 +1,6 @@
1
1
  (() => {
2
2
  var setupZzFX = (global) => {
3
- const zzfxX = new AudioContext();
3
+ global.zzfxX = new AudioContext();
4
4
  global.zzfxV = 1;
5
5
  return (
6
6
  i = 1,
@@ -63,7 +63,7 @@
63
63
  V *= t / a,
64
64
  J *= a,
65
65
  h = (a * h) | 0,
66
- i *= 0.3 * global.zzfxV,
66
+ i *= 0.3 * zzfxV,
67
67
  s = (e + X + P + S + r) | 0;
68
68
  f < s;
69
69
  d[f++] = o * i
@@ -115,7 +115,7 @@
115
115
  var assert = (condition, message = "Assertion failed") => {
116
116
  if (!condition) throw new Error("[litecanvas] " + message);
117
117
  };
118
- var version = "0.206.1";
118
+ var version = "0.207.0";
119
119
  function litecanvas(settings = {}) {
120
120
  const root = window,
121
121
  math = Math,
@@ -123,6 +123,7 @@
123
123
  TWO_PI = math.PI * 2,
124
124
  loggerPrefix = "[Litecanvas] ",
125
125
  raf = requestAnimationFrame,
126
+ isNumber = Number.isFinite,
126
127
  _browserEventListeners = [],
127
128
  on = (elem, evt, callback) => {
128
129
  elem.addEventListener(evt, callback, false);
@@ -133,7 +134,6 @@
133
134
  lowerCase = (str) => str.toLowerCase(),
134
135
  preventDefault = (ev) => ev.preventDefault(),
135
136
  beginPath = (c) => c.beginPath(),
136
- isNumber = Number.isFinite,
137
137
  zzfx = setupZzFX(root),
138
138
  defaults = {
139
139
  width: null,
@@ -450,102 +450,98 @@
450
450
  _ctx[radii ? "roundRect" : "rect"](~~x, ~~y, ~~width, ~~height, radii);
451
451
  instance.fill(color);
452
452
  },
453
- circ(x, y, radius, color) {
453
+ oval(x, y, radiusX, radiusY, color) {
454
454
  DEV: assert(
455
455
  isNumber(x),
456
- loggerPrefix + "circ() 1st param must be a number",
456
+ loggerPrefix + "oval() 1st param must be a number",
457
457
  );
458
458
  DEV: assert(
459
459
  isNumber(y),
460
- loggerPrefix + "circ() 2nd param must be a number",
460
+ loggerPrefix + "oval() 2nd param must be a number",
461
461
  );
462
462
  DEV: assert(
463
- isNumber(radius) && radius >= 0,
464
- loggerPrefix + "circ() 3rd param must be a positive number or zero",
463
+ isNumber(radiusX) && radiusX >= 0,
464
+ loggerPrefix + "oval() 3rd param must be a positive number or zero",
465
+ );
466
+ DEV: assert(
467
+ isNumber(radiusY) && radiusY >= 0,
468
+ loggerPrefix + "oval() 4th param must be a positive number or zero",
465
469
  );
466
470
  DEV: assert(
467
471
  null == color || (isNumber(color) && color >= 0),
468
- loggerPrefix + "circ() 4th param must be a positive number or zero",
472
+ loggerPrefix + "oval() 5th param must be a positive number or zero",
469
473
  );
470
474
  beginPath(_ctx);
471
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
475
+ _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
472
476
  instance.stroke(color);
473
477
  },
474
- circfill(x, y, radius, color) {
478
+ ovalfill(x, y, radiusX, radiusY, color) {
475
479
  DEV: assert(
476
480
  isNumber(x),
477
- loggerPrefix + "circfill() 1st param must be a number",
481
+ loggerPrefix + "ovalfill() 1st param must be a number",
478
482
  );
479
483
  DEV: assert(
480
484
  isNumber(y),
481
- loggerPrefix + "circfill() 2nd param must be a number",
485
+ loggerPrefix + "ovalfill() 2nd param must be a number",
482
486
  );
483
487
  DEV: assert(
484
- isNumber(radius) && radius >= 0,
488
+ isNumber(radiusX) && radiusX >= 0,
485
489
  loggerPrefix +
486
- "circfill() 3rd param must be a positive number or zero",
490
+ "ovalfill() 3rd param must be a positive number or zero",
491
+ );
492
+ DEV: assert(
493
+ isNumber(radiusY) && radiusY >= 0,
494
+ loggerPrefix +
495
+ "ovalfill() 4th param must be a positive number or zero",
487
496
  );
488
497
  DEV: assert(
489
498
  null == color || (isNumber(color) && color >= 0),
490
499
  loggerPrefix +
491
- "circfill() 4th param must be a positive number or zero",
500
+ "ovalfill() 5th param must be a positive number or zero",
492
501
  );
493
502
  beginPath(_ctx);
494
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
503
+ _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
495
504
  instance.fill(color);
496
505
  },
497
- oval(x, y, radiusX, radiusY, color) {
506
+ circ(x, y, radius, color) {
498
507
  DEV: assert(
499
508
  isNumber(x),
500
- loggerPrefix + "oval() 1st param must be a number",
509
+ loggerPrefix + "circ() 1st param must be a number",
501
510
  );
502
511
  DEV: assert(
503
512
  isNumber(y),
504
- loggerPrefix + "oval() 2nd param must be a number",
505
- );
506
- DEV: assert(
507
- isNumber(radiusX) && radiusX >= 0,
508
- loggerPrefix + "oval() 3rd param must be a positive number or zero",
513
+ loggerPrefix + "circ() 2nd param must be a number",
509
514
  );
510
515
  DEV: assert(
511
- isNumber(radiusY) && radiusY >= 0,
512
- loggerPrefix + "oval() 4th param must be a positive number or zero",
516
+ isNumber(radius) && radius >= 0,
517
+ loggerPrefix + "circ() 3rd param must be a positive number or zero",
513
518
  );
514
519
  DEV: assert(
515
520
  null == color || (isNumber(color) && color >= 0),
516
- loggerPrefix + "oval() 5th param must be a positive number or zero",
521
+ loggerPrefix + "circ() 4th param must be a positive number or zero",
517
522
  );
518
- beginPath(_ctx);
519
- _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
520
- instance.stroke(color);
523
+ instance.oval(x, y, radius, radius, color);
521
524
  },
522
- ovalfill(x, y, radiusX, radiusY, color) {
525
+ circfill(x, y, radius, color) {
523
526
  DEV: assert(
524
527
  isNumber(x),
525
- loggerPrefix + "ovalfill() 1st param must be a number",
528
+ loggerPrefix + "circfill() 1st param must be a number",
526
529
  );
527
530
  DEV: assert(
528
531
  isNumber(y),
529
- loggerPrefix + "ovalfill() 2nd param must be a number",
530
- );
531
- DEV: assert(
532
- isNumber(radiusX) && radiusX >= 0,
533
- loggerPrefix +
534
- "ovalfill() 3rd param must be a positive number or zero",
532
+ loggerPrefix + "circfill() 2nd param must be a number",
535
533
  );
536
534
  DEV: assert(
537
- isNumber(radiusY) && radiusY >= 0,
535
+ isNumber(radius) && radius >= 0,
538
536
  loggerPrefix +
539
- "ovalfill() 4th param must be a positive number or zero",
537
+ "circfill() 3rd param must be a positive number or zero",
540
538
  );
541
539
  DEV: assert(
542
540
  null == color || (isNumber(color) && color >= 0),
543
541
  loggerPrefix +
544
- "ovalfill() 5th param must be a positive number or zero",
542
+ "circfill() 4th param must be a positive number or zero",
545
543
  );
546
- beginPath(_ctx);
547
- _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
548
- instance.fill(color);
544
+ instance.ovalfill(x, y, radius, radius, color);
549
545
  },
550
546
  shape(points) {
551
547
  DEV: assert(
package/dist/dist.js CHANGED
@@ -1,6 +1,6 @@
1
1
  (() => {
2
2
  var setupZzFX = (global) => {
3
- const zzfxX = new AudioContext();
3
+ global.zzfxX = new AudioContext();
4
4
  global.zzfxV = 1;
5
5
  return (
6
6
  i = 1,
@@ -63,7 +63,7 @@
63
63
  V *= t / a,
64
64
  J *= a,
65
65
  h = (a * h) | 0,
66
- i *= 0.3 * global.zzfxV,
66
+ i *= 0.3 * zzfxV,
67
67
  s = (e + X + P + S + r) | 0;
68
68
  f < s;
69
69
  d[f++] = o * i
@@ -119,6 +119,7 @@
119
119
  TWO_PI = math.PI * 2,
120
120
  loggerPrefix = "[Litecanvas] ",
121
121
  raf = requestAnimationFrame,
122
+ isNumber = Number.isFinite,
122
123
  _browserEventListeners = [],
123
124
  on = (elem, evt, callback) => {
124
125
  elem.addEventListener(evt, callback, false);
@@ -129,7 +130,6 @@
129
130
  lowerCase = (str) => str.toLowerCase(),
130
131
  preventDefault = (ev) => ev.preventDefault(),
131
132
  beginPath = (c) => c.beginPath(),
132
- isNumber = Number.isFinite,
133
133
  zzfx = setupZzFX(root),
134
134
  defaults = {
135
135
  width: null,
@@ -242,16 +242,6 @@
242
242
  _ctx[radii ? "roundRect" : "rect"](~~x, ~~y, ~~width, ~~height, radii);
243
243
  instance.fill(color);
244
244
  },
245
- circ(x, y, radius, color) {
246
- beginPath(_ctx);
247
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
248
- instance.stroke(color);
249
- },
250
- circfill(x, y, radius, color) {
251
- beginPath(_ctx);
252
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
253
- instance.fill(color);
254
- },
255
245
  oval(x, y, radiusX, radiusY, color) {
256
246
  beginPath(_ctx);
257
247
  _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
@@ -262,6 +252,12 @@
262
252
  _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
263
253
  instance.fill(color);
264
254
  },
255
+ circ(x, y, radius, color) {
256
+ instance.oval(x, y, radius, radius, color);
257
+ },
258
+ circfill(x, y, radius, color) {
259
+ instance.ovalfill(x, y, radius, radius, color);
260
+ },
265
261
  shape(points) {
266
262
  beginPath(_ctx);
267
263
  for (let i = 0; i < points.length; i += 2) {
package/dist/dist.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var e=["#211e20","#555568","#a0a08b","#e9efec"];window.litecanvas=function(t={}){let a,l,n=window,i=Math,o=performance,r=2*i.PI,s=requestAnimationFrame,f=[],c=(e,t,a)=>{e.addEventListener(t,a,!1),f.push(()=>e.removeEventListener(t,a,!1))},d=(a=new AudioContext,n.zzfxV=1,(e=1,t=.05,l=220,i=0,o=0,r=.1,s=0,f=1,c=0,d=0,u=0,p=0,h=0,m=0,g=0,w=0,v=0,x=1,y=0,b=0,k=0)=>{let E=Math,P=2*E.PI,T=c*=500*P/44100/44100,z=l*=(1-t+2*t*E.random(t=[]))*P/44100,C=0,I=0,L=0,D=1,A=0,S=0,H=0,M=k<0?-1:1,N=P*M*k*2/44100,W=E.cos(N),q=E.sin,B=q(N)/4,V=1+B,O=-2*W/V,R=(1-B)/V,F=(1+M*W)/2/V,G=-(M+W)/V,X=0,Y=0,$=0,j=0;for(i=44100*i+9,y*=44100,o*=44100,r*=44100,v*=44100,d*=500*P/85766121e6,g*=P/44100,u*=P/44100,p*=44100,h=44100*h|0,e*=.3*n.zzfxV,M=i+y+o+r+v|0;L<M;t[L++]=H*e)++S%(100*w|0)||(H=s?1<s?2<s?3<s?q(C*C):E.max(E.min(E.tan(C),1),-1):1-(2*C/P%2+2)%2:1-4*E.abs(E.round(C/P)-C/P):q(C),H=(h?1-b+b*q(P*L/h):1)*(H<0?-1:1)*E.abs(H)**f*(L<i?L/i:L<i+y?1-(L-i)/y*(1-x):L<i+y+o?x:L<M-v?(M-L-v)/r*x:0),H=v?H/2+(v>L?0:(L<M-v?1:(M-L)/v)*t[L-v|0]/2/e):H,k&&(H=j=F*X+G*(X=Y)+F*(Y=H)-R*$-O*($=j))),C+=(N=(l+=c+=d)*E.cos(g*I++))+N*m*q(L**5),D&&++D>p&&(l+=u,z+=u,D=0),!h||++A%h||(l=z,c=T,D=D||1);(e=a.createBuffer(1,M,44100)).getChannelData(0).set(t),(l=a.createBufferSource()).buffer=e,l.connect(a.destination),l.start()}),u=(t=Object.assign({width:null,height:null,autoscale:!0,canvas:null,global:!0,loop:null,tapEvents:!0,keyboardEvents:!0},t)).loop,p=!1,h,m,g=1,w,v=.5,x=1,y,b=1e3/60,k,E=0,P=3,T="sans-serif",z=20,C=1.2,I=Date.now(),L=e,D=[],A=[.5,0,1750,,,.3,1,,,,600,.1],S={},H={W:0,H:0,T:0,MX:-1,MY:-1,TWO_PI:r,HALF_PI:r/4,lerp:(e,t,a)=>e+a*(t-e),deg2rad:e=>i.PI/180*e,rad2deg:e=>180/i.PI*e,round:(e,t=0)=>{if(!t)return i.round(e);let a=10**t;return i.round(e*a)/a},clamp:(e,t,a)=>e<t?t:e>a?a:e,dist:(e,t,a,l)=>i.hypot(a-e,l-t),wrap:(e,t,a)=>e-(a-t)*i.floor((e-t)/(a-t)),map(e,t,a,l,n,i){let o=(e-t)/(a-t)*(n-l)+l;return i?H.clamp(o,l,n):o},norm:(e,t,a)=>H.map(e,t,a,0,1),rand:(e=0,t=1)=>(I=(1664525*I+0x3c6ef35f)%0x100000000)/0x100000000*(t-e)+e,randi:(e=0,t=1)=>~~H.rand(e,t+1),rseed(e){I=~~e},cls(e){null==e?w.clearRect(0,0,H.W,H.H):H.rectfill(0,0,H.W,H.H,e)},rect(e,t,a,l,n,i){w.beginPath(),w[i?"roundRect":"rect"](~~e-v,~~t-v,~~a+2*v,~~l+2*v,i),H.stroke(n)},rectfill(e,t,a,l,n,i){w.beginPath(),w[i?"roundRect":"rect"](~~e,~~t,~~a,~~l,i),H.fill(n)},circ(e,t,a,l){w.beginPath(),w.arc(~~e,~~t,~~a,0,r),H.stroke(l)},circfill(e,t,a,l){w.beginPath(),w.arc(~~e,~~t,~~a,0,r),H.fill(l)},oval(e,t,a,l,n){w.beginPath(),w.ellipse(~~e,~~t,~~a,~~l,0,0,r),H.stroke(n)},ovalfill(e,t,a,l,n){w.beginPath(),w.ellipse(~~e,~~t,~~a,~~l,0,0,r),H.fill(n)},shape(e){w.beginPath();for(let t=0;t<e.length;t+=2)0===t?w.moveTo(~~e[t],~~e[t+1]):w.lineTo(~~e[t],~~e[t+1]);w.lineTo(~~e[0],~~e[1])},line(e,t,a,l,n){w.beginPath();let i=.5*(0!==v&&~~e==~~a),o=.5*(0!==v&&~~t==~~l);w.moveTo(~~e+i,~~t+o),w.lineTo(~~a+i,~~l+o),H.stroke(n)},linewidth(e){w.lineWidth=~~e,v=.5*(0!=~~e%2)},linedash(e,t=0){w.setLineDash(e),w.lineDashOffset=t},text(e,t,a,l=P,n="normal"){w.font=`${n} ${z}px ${T}`,w.fillStyle=B(l);let i=(""+a).split("\n");for(let a=0;a<i.length;a++)w.fillText(i[a],~~e,~~t+z*C*a)},textgap(e){C=e},textfont(e){T=e},textsize(e){z=e},textalign(e,t){e&&(w.textAlign=e),t&&(w.textBaseline=t)},image(e,t,a){w.drawImage(a,~~e,~~t)},spr(e,t,a){let l=a.trim().split("\n");for(let a=0;a<l.length;a++){let n=l[a].trim();for(let l=0;l<n.length;l++){let i=n[l];"."!==i&&" "!==i&&H.rectfill(e+l,t+a,1,1,parseInt(i,36)||0)}}},paint(e,t,a,l={}){let n=l.canvas||new OffscreenCanvas(1,1),i=l.scale||1,o=w;return n.width=e*i,n.height=t*i,(w=n.getContext("2d")).scale(i,i),a(w),w=o,n.transferToImageBitmap()},ctx:e=>(e&&(w=e),w),push(){w.save()},pop(){w.restore()},translate(e,t){w.translate(~~e,~~t)},scale(e,t=e){w.scale(e,t)},rotate(e){w.rotate(e)},alpha(e){w.globalAlpha=H.clamp(e,0,1)},fill(e){w.fillStyle=B(e),w.fill()},stroke(e){w.strokeStyle=B(e),w.stroke()},clip(e){w.beginPath(),e(w),w.clip()},sfx:(e,t,a)=>!!n.zzfxV&&(!navigator.userActivation||!!navigator.userActivation.hasBeenActive)&&(e||=A,(t||a)&&((e=e.slice())[0]=(a||1)*(e[0]||1),e[10]=~~e[10]+t),d.apply(0,e),e),volume(e){n.zzfxV=e},canvas:()=>m,use(e,t={}){var a=e,l=t;let n=a(H,l);for(let e in n)H.def(e,n[e])},listen:(e,t)=>{S[e=e.toLowerCase()]=S[e]||new Set,S[e].add(t)},unlisten:(e,t)=>{S[e=e.toLowerCase()]&&S[e].delete(t)},emit:(e,t,a,l,i)=>(p&&(q("before:"+(e=e.toLowerCase()),t,a,l,i),u||n[e]===H[e]||"function"!=typeof n[e]||n[e](t,a,l,i),q(e,t,a,l,i),q("after:"+e,t,a,l,i)),t),pal(t,a=3){L=t||e,D=[],P=a,H.emit("pal",L,P)},palc(e,t){null==e?D=[]:D[e]=t},def(e,a){H[e]=a,t.global&&(n[e]=a)},timescale(e){x=e},framerate(e){b=1e3/~~e},stat:e=>[t,p,b/1e3,g,S,L,A,x,n.zzfxV,I,z,T,D,C][e],pause(){h||(h=!0,E=~~cancelAnimationFrame(E),H.emit("paused"))},resume(){p&&h&&(M(),h=!1,H.emit("resumed"))},ispaused:()=>h,quit(){for(let e of(H.emit("quit"),H.pause(),p=!1,S={},f))e();if(t.global){for(let e in H)delete n[e];delete n.ENGINE}}};for(let e of"PI,sin,cos,atan2,hypot,tan,abs,ceil,floor,trunc,min,max,pow,sqrt,sign,exp".split(","))H[e]=i[e];function M(){E||(k=0,y=o.now(),E=s(N))}function N(){E=s(N);let e=o.now(),t=0,a=e-y;for(y=e,k+=a<100?a:b;k>=b;){t++,k-=b;let e=b/1e3*x;H.emit("update",e,t),H.def("T",H.T+e)}t&&(H.emit("draw",w),t>1&&(k=0))}function W(){let e=t.width>0?t.width:innerWidth,a=t.width>0?t.height||t.width:innerHeight;if(H.def("W",e),H.def("H",a),m.width=e,m.height=a,t.autoscale){let l=+t.autoscale;m.style.display||(m.style.display="block",m.style.margin="auto"),g=i.min(innerWidth/e,innerHeight/a),g=l>1&&g>l?l:g,m.style.width=e*g+"px",m.style.height=a*g+"px"}w.imageSmoothingEnabled=!1,H.textalign("start","top"),H.emit("resized",g)}function q(e,t,a,l,n){if(S[e])for(let i of S[e])i(t,a,l,n)}function B(e){return L[~~(D[e]??e)%L.length]}if(t.global){if(n.ENGINE)throw Error("only one global litecanvas is allowed");Object.assign(n,H),n.ENGINE=H}if(l=document,w=(m=(m="string"==typeof t.canvas?l.querySelector(t.canvas):t.canvas)||l.createElement("canvas")).getContext("2d"),c(m,"click",()=>focus()),W(),m.parentNode||l.body.appendChild(m),m.style.imageRendering="pixelated",m.oncontextmenu=()=>!1,u)for(let e in u)u[e]&&H.listen(e,u[e]);return s(function(){if(t.autoscale&&c(n,"resize",W),t.tapEvents){let e=e=>[(e.pageX-m.offsetLeft)/g,(e.pageY-m.offsetTop)/g],t=new Map,a=(e,a,l)=>{let n={x:a,y:l,xi:a,yi:l,t:o.now()};return t.set(e,n),n},l=(e,l,n)=>{let i=t.get(e)||a(e);i.x=l,i.y=n},i=e=>e&&o.now()-e.t<=300,r=!1;c(m,"mousedown",t=>{if(0===t.button){t.preventDefault();let[l,n]=e(t);H.emit("tap",l,n,0),a(0,l,n),r=!0}}),c(m,"mouseup",a=>{if(0===a.button){a.preventDefault();let l=t.get(0),[n,o]=e(a);i(l)&&H.emit("tapped",l.xi,l.yi,0),H.emit("untap",n,o,0),t.delete(0),r=!1}}),c(n,"mousemove",t=>{t.preventDefault();let[a,n]=e(t);H.def("MX",a),H.def("MY",n),r&&(H.emit("tapping",a,n,0),l(0,a,n))}),c(m,"touchstart",t=>{for(let l of(t.preventDefault(),t.changedTouches)){let[t,n]=e(l);H.emit("tap",t,n,l.identifier+1),a(l.identifier+1,t,n)}}),c(m,"touchmove",t=>{for(let a of(t.preventDefault(),t.changedTouches)){let[t,n]=e(a);H.emit("tapping",t,n,a.identifier+1),l(a.identifier+1,t,n)}});let s=e=>{e.preventDefault();let a=[];if(e.targetTouches.length>0)for(let t of e.targetTouches)a.push(t.identifier+1);for(let[e,l]of t)a.includes(e)||(i(l)&&H.emit("tapped",l.xi,l.yi,e),H.emit("untap",l.x,l.y,e),t.delete(e))};c(m,"touchend",s),c(m,"touchcancel",s),c(n,"blur",()=>{for(let[e,a]of(r=!1,t))H.emit("untap",a.x,a.y,e),t.delete(e)})}if(t.keyboardEvents){let e=new Set,t=new Set,a=(e,t="")=>(t=t.toLowerCase())?e.has("space"===t?" ":t):e.size>0,l="";c(n,"keydown",a=>{let n=a.key.toLowerCase();e.has(n)||(e.add(n),t.add(n),l=" "===n?"space":n)}),c(n,"keyup",t=>{e.delete(t.key.toLowerCase())}),c(n,"blur",()=>e.clear()),H.listen("after:update",()=>t.clear()),H.def("iskeydown",t=>a(e,t)),H.def("iskeypressed",e=>a(t,e)),H.def("lastkey",()=>l)}p=!0,H.emit("init",H),h||M()}),H}})();
1
+ (()=>{var e=["#211e20","#555568","#a0a08b","#e9efec"];window.litecanvas=function(t={}){let a,l=window,n=Math,i=performance,o=2*n.PI,r=requestAnimationFrame,s=[],f=(e,t,a)=>{e.addEventListener(t,a,!1),s.push(()=>e.removeEventListener(t,a,!1))},d=(l.zzfxX=new AudioContext,l.zzfxV=1,(e=1,t=.05,a=220,l=0,n=0,i=.1,o=0,r=1,s=0,f=0,d=0,c=0,u=0,p=0,h=0,m=0,g=0,v=1,x=0,w=0,y=0)=>{let b=Math,z=2*b.PI,k=s*=500*z/44100/44100,E=a*=(1-t+2*t*b.random(t=[]))*z/44100,T=0,P=0,C=0,I=1,L=0,D=0,A=0,S=y<0?-1:1,H=z*S*y*2/44100,M=b.cos(H),N=b.sin,W=N(H)/4,X=1+W,q=-2*M/X,B=(1-W)/X,V=(1+S*M)/2/X,O=-(S+M)/X,R=0,F=0,G=0,Y=0;for(l=44100*l+9,x*=44100,n*=44100,i*=44100,g*=44100,f*=500*z/85766121e6,h*=z/44100,d*=z/44100,c*=44100,u=44100*u|0,e*=.3*zzfxV,S=l+x+n+i+g|0;C<S;t[C++]=A*e)++D%(100*m|0)||(A=o?1<o?2<o?3<o?N(T*T):b.max(b.min(b.tan(T),1),-1):1-(2*T/z%2+2)%2:1-4*b.abs(b.round(T/z)-T/z):N(T),A=(u?1-w+w*N(z*C/u):1)*(A<0?-1:1)*b.abs(A)**r*(C<l?C/l:C<l+x?1-(C-l)/x*(1-v):C<l+x+n?v:C<S-g?(S-C-g)/i*v:0),A=g?A/2+(g>C?0:(C<S-g?1:(S-C)/g)*t[C-g|0]/2/e):A,y&&(A=Y=V*R+O*(R=F)+V*(F=A)-B*G-q*(G=Y))),T+=(H=(a+=s+=f)*b.cos(h*P++))+H*p*N(C**5),I&&++I>c&&(a+=d,E+=d,I=0),!u||++L%u||(a=E,s=k,I=I||1);(e=zzfxX.createBuffer(1,S,44100)).getChannelData(0).set(t),(a=zzfxX.createBufferSource()).buffer=e,a.connect(zzfxX.destination),a.start()}),c=(t=Object.assign({width:null,height:null,autoscale:!0,canvas:null,global:!0,loop:null,tapEvents:!0,keyboardEvents:!0},t)).loop,u=!1,p,h,m=1,g,v=.5,x=1,w,y=1e3/60,b,z=0,k=3,E="sans-serif",T=20,P=1.2,C=Date.now(),I=e,L=[],D=[.5,0,1750,,,.3,1,,,,600,.1],A={},S={W:0,H:0,T:0,MX:-1,MY:-1,TWO_PI:o,HALF_PI:o/4,lerp:(e,t,a)=>e+a*(t-e),deg2rad:e=>n.PI/180*e,rad2deg:e=>180/n.PI*e,round:(e,t=0)=>{if(!t)return n.round(e);let a=10**t;return n.round(e*a)/a},clamp:(e,t,a)=>e<t?t:e>a?a:e,dist:(e,t,a,l)=>n.hypot(a-e,l-t),wrap:(e,t,a)=>e-(a-t)*n.floor((e-t)/(a-t)),map(e,t,a,l,n,i){let o=(e-t)/(a-t)*(n-l)+l;return i?S.clamp(o,l,n):o},norm:(e,t,a)=>S.map(e,t,a,0,1),rand:(e=0,t=1)=>(C=(1664525*C+0x3c6ef35f)%0x100000000)/0x100000000*(t-e)+e,randi:(e=0,t=1)=>~~S.rand(e,t+1),rseed(e){C=~~e},cls(e){null==e?g.clearRect(0,0,S.W,S.H):S.rectfill(0,0,S.W,S.H,e)},rect(e,t,a,l,n,i){g.beginPath(),g[i?"roundRect":"rect"](~~e-v,~~t-v,~~a+2*v,~~l+2*v,i),S.stroke(n)},rectfill(e,t,a,l,n,i){g.beginPath(),g[i?"roundRect":"rect"](~~e,~~t,~~a,~~l,i),S.fill(n)},oval(e,t,a,l,n){g.beginPath(),g.ellipse(~~e,~~t,~~a,~~l,0,0,o),S.stroke(n)},ovalfill(e,t,a,l,n){g.beginPath(),g.ellipse(~~e,~~t,~~a,~~l,0,0,o),S.fill(n)},circ(e,t,a,l){S.oval(e,t,a,a,l)},circfill(e,t,a,l){S.ovalfill(e,t,a,a,l)},shape(e){g.beginPath();for(let t=0;t<e.length;t+=2)0===t?g.moveTo(~~e[t],~~e[t+1]):g.lineTo(~~e[t],~~e[t+1]);g.lineTo(~~e[0],~~e[1])},line(e,t,a,l,n){g.beginPath();let i=.5*(0!==v&&~~e==~~a),o=.5*(0!==v&&~~t==~~l);g.moveTo(~~e+i,~~t+o),g.lineTo(~~a+i,~~l+o),S.stroke(n)},linewidth(e){g.lineWidth=~~e,v=.5*(0!=~~e%2)},linedash(e,t=0){g.setLineDash(e),g.lineDashOffset=t},text(e,t,a,l=k,n="normal"){g.font=`${n} ${T}px ${E}`,g.fillStyle=X(l);let i=(""+a).split("\n");for(let a=0;a<i.length;a++)g.fillText(i[a],~~e,~~t+T*P*a)},textgap(e){P=e},textfont(e){E=e},textsize(e){T=e},textalign(e,t){e&&(g.textAlign=e),t&&(g.textBaseline=t)},image(e,t,a){g.drawImage(a,~~e,~~t)},spr(e,t,a){let l=a.trim().split("\n");for(let a=0;a<l.length;a++){let n=l[a].trim();for(let l=0;l<n.length;l++){let i=n[l];"."!==i&&" "!==i&&S.rectfill(e+l,t+a,1,1,parseInt(i,36)||0)}}},paint(e,t,a,l={}){let n=l.canvas||new OffscreenCanvas(1,1),i=l.scale||1,o=g;return n.width=e*i,n.height=t*i,(g=n.getContext("2d")).scale(i,i),a(g),g=o,n.transferToImageBitmap()},ctx:e=>(e&&(g=e),g),push(){g.save()},pop(){g.restore()},translate(e,t){g.translate(~~e,~~t)},scale(e,t=e){g.scale(e,t)},rotate(e){g.rotate(e)},alpha(e){g.globalAlpha=S.clamp(e,0,1)},fill(e){g.fillStyle=X(e),g.fill()},stroke(e){g.strokeStyle=X(e),g.stroke()},clip(e){g.beginPath(),e(g),g.clip()},sfx:(e,t,a)=>!!l.zzfxV&&(!navigator.userActivation||!!navigator.userActivation.hasBeenActive)&&(e||=D,(t||a)&&((e=e.slice())[0]=(a||1)*(e[0]||1),e[10]=~~e[10]+t),d.apply(0,e),e),volume(e){l.zzfxV=e},canvas:()=>h,use(e,t={}){var a=e,l=t;let n=a(S,l);for(let e in n)S.def(e,n[e])},listen:(e,t)=>{A[e=e.toLowerCase()]=A[e]||new Set,A[e].add(t)},unlisten:(e,t)=>{A[e=e.toLowerCase()]&&A[e].delete(t)},emit:(e,t,a,n,i)=>(u&&(W("before:"+(e=e.toLowerCase()),t,a,n,i),c||l[e]===S[e]||"function"!=typeof l[e]||l[e](t,a,n,i),W(e,t,a,n,i),W("after:"+e,t,a,n,i)),t),pal(t,a=3){I=t||e,L=[],k=a,S.emit("pal",I,k)},palc(e,t){null==e?L=[]:L[e]=t},def(e,a){S[e]=a,t.global&&(l[e]=a)},timescale(e){x=e},framerate(e){y=1e3/~~e},stat:e=>[t,u,y/1e3,m,A,I,D,x,l.zzfxV,C,T,E,L,P][e],pause(){p||(p=!0,z=~~cancelAnimationFrame(z),S.emit("paused"))},resume(){u&&p&&(H(),p=!1,S.emit("resumed"))},ispaused:()=>p,quit(){for(let e of(S.emit("quit"),S.pause(),u=!1,A={},s))e();if(t.global){for(let e in S)delete l[e];delete l.ENGINE}}};for(let e of"PI,sin,cos,atan2,hypot,tan,abs,ceil,floor,trunc,min,max,pow,sqrt,sign,exp".split(","))S[e]=n[e];function H(){z||(b=0,w=i.now(),z=r(M))}function M(){z=r(M);let e=i.now(),t=0,a=e-w;for(w=e,b+=a<100?a:y;b>=y;){t++,b-=y;let e=y/1e3*x;S.emit("update",e,t),S.def("T",S.T+e)}t&&(S.emit("draw",g),t>1&&(b=0))}function N(){let e=t.width>0?t.width:innerWidth,a=t.width>0?t.height||t.width:innerHeight;if(S.def("W",e),S.def("H",a),h.width=e,h.height=a,t.autoscale){let l=+t.autoscale;h.style.display||(h.style.display="block",h.style.margin="auto"),m=n.min(innerWidth/e,innerHeight/a),m=l>1&&m>l?l:m,h.style.width=e*m+"px",h.style.height=a*m+"px"}g.imageSmoothingEnabled=!1,S.textalign("start","top"),S.emit("resized",m)}function W(e,t,a,l,n){if(A[e])for(let i of A[e])i(t,a,l,n)}function X(e){return I[~~(L[e]??e)%I.length]}if(t.global){if(l.ENGINE)throw Error("only one global litecanvas is allowed");Object.assign(l,S),l.ENGINE=S}if(a=document,g=(h=(h="string"==typeof t.canvas?a.querySelector(t.canvas):t.canvas)||a.createElement("canvas")).getContext("2d"),f(h,"click",()=>focus()),N(),h.parentNode||a.body.appendChild(h),h.style.imageRendering="pixelated",h.oncontextmenu=()=>!1,c)for(let e in c)c[e]&&S.listen(e,c[e]);return r(function(){if(t.autoscale&&f(l,"resize",N),t.tapEvents){let e=e=>[(e.pageX-h.offsetLeft)/m,(e.pageY-h.offsetTop)/m],t=new Map,a=(e,a,l)=>{let n={x:a,y:l,xi:a,yi:l,t:i.now()};return t.set(e,n),n},n=(e,l,n)=>{let i=t.get(e)||a(e);i.x=l,i.y=n},o=e=>e&&i.now()-e.t<=300,r=!1;f(h,"mousedown",t=>{if(0===t.button){t.preventDefault();let[l,n]=e(t);S.emit("tap",l,n,0),a(0,l,n),r=!0}}),f(h,"mouseup",a=>{if(0===a.button){a.preventDefault();let l=t.get(0),[n,i]=e(a);o(l)&&S.emit("tapped",l.xi,l.yi,0),S.emit("untap",n,i,0),t.delete(0),r=!1}}),f(l,"mousemove",t=>{t.preventDefault();let[a,l]=e(t);S.def("MX",a),S.def("MY",l),r&&(S.emit("tapping",a,l,0),n(0,a,l))}),f(h,"touchstart",t=>{for(let l of(t.preventDefault(),t.changedTouches)){let[t,n]=e(l);S.emit("tap",t,n,l.identifier+1),a(l.identifier+1,t,n)}}),f(h,"touchmove",t=>{for(let a of(t.preventDefault(),t.changedTouches)){let[t,l]=e(a);S.emit("tapping",t,l,a.identifier+1),n(a.identifier+1,t,l)}});let s=e=>{e.preventDefault();let a=[];if(e.targetTouches.length>0)for(let t of e.targetTouches)a.push(t.identifier+1);for(let[e,l]of t)a.includes(e)||(o(l)&&S.emit("tapped",l.xi,l.yi,e),S.emit("untap",l.x,l.y,e),t.delete(e))};f(h,"touchend",s),f(h,"touchcancel",s),f(l,"blur",()=>{for(let[e,a]of(r=!1,t))S.emit("untap",a.x,a.y,e),t.delete(e)})}if(t.keyboardEvents){let e=new Set,t=new Set,a=(e,t="")=>(t=t.toLowerCase())?e.has("space"===t?" ":t):e.size>0,n="";f(l,"keydown",a=>{let l=a.key.toLowerCase();e.has(l)||(e.add(l),t.add(l),n=" "===l?"space":l)}),f(l,"keyup",t=>{e.delete(t.key.toLowerCase())}),f(l,"blur",()=>e.clear()),S.listen("after:update",()=>t.clear()),S.def("iskeydown",t=>a(e,t)),S.def("iskeypressed",e=>a(t,e)),S.def("lastkey",()=>n)}u=!0,S.emit("init",S),p||H()}),S}})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litecanvas",
3
- "version": "0.206.1",
3
+ "version": "0.207.0",
4
4
  "description": "Lightweight HTML5 canvas 2D game engine suitable for small projects and creative coding. Inspired by PICO-8 and p5.js/Processing.",
5
5
  "license": "MIT",
6
6
  "author": "Luiz Bills <luizbills@pm.me>",
package/src/index.js CHANGED
@@ -17,6 +17,7 @@ export default function litecanvas(settings = {}) {
17
17
  TWO_PI = math.PI * 2,
18
18
  loggerPrefix = '[Litecanvas] ',
19
19
  raf = requestAnimationFrame,
20
+ isNumber = Number.isFinite,
20
21
  /** @type {Function[]} */
21
22
  _browserEventListeners = [],
22
23
  /** @type {(elem: EventTarget, evt: string, callback: (event: Event) => void) => void} */
@@ -30,7 +31,6 @@ export default function litecanvas(settings = {}) {
30
31
  preventDefault = (ev) => ev.preventDefault(),
31
32
  /** @type {(c: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) => void} */
32
33
  beginPath = (c) => c.beginPath(),
33
- isNumber = Number.isFinite,
34
34
  zzfx = setupZzFX(root),
35
35
  /** @type {LitecanvasOptions} */
36
36
  defaults = {
@@ -52,7 +52,7 @@ export default function litecanvas(settings = {}) {
52
52
  _initialized = false,
53
53
  /** @type {boolean} */
54
54
  _paused,
55
- /** @type {HTMLCanvasElement} _canvas */
55
+ /** @type {HTMLCanvasElement} */
56
56
  _canvas,
57
57
  /** @type {number} */
58
58
  _canvasScale = 1,
@@ -459,56 +459,6 @@ export default function litecanvas(settings = {}) {
459
459
  instance.fill(color)
460
460
  },
461
461
 
462
- /**
463
- * Draw a circle outline
464
- *
465
- * @param {number} x
466
- * @param {number} y
467
- * @param {number} radius
468
- * @param {number} [color=0] the color index
469
- */
470
- circ(x, y, radius, color) {
471
- DEV: assert(isNumber(x), loggerPrefix + 'circ() 1st param must be a number')
472
- DEV: assert(isNumber(y), loggerPrefix + 'circ() 2nd param must be a number')
473
- DEV: assert(
474
- isNumber(radius) && radius >= 0,
475
- loggerPrefix + 'circ() 3rd param must be a positive number or zero'
476
- )
477
- DEV: assert(
478
- null == color || (isNumber(color) && color >= 0),
479
- loggerPrefix + 'circ() 4th param must be a positive number or zero'
480
- )
481
-
482
- beginPath(_ctx)
483
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI)
484
- instance.stroke(color)
485
- },
486
-
487
- /**
488
- * Draw a color-filled circle
489
- *
490
- * @param {number} x
491
- * @param {number} y
492
- * @param {number} radius
493
- * @param {number} [color=0] the color index
494
- */
495
- circfill(x, y, radius, color) {
496
- DEV: assert(isNumber(x), loggerPrefix + 'circfill() 1st param must be a number')
497
- DEV: assert(isNumber(y), loggerPrefix + 'circfill() 2nd param must be a number')
498
- DEV: assert(
499
- isNumber(radius) && radius >= 0,
500
- loggerPrefix + 'circfill() 3rd param must be a positive number or zero'
501
- )
502
- DEV: assert(
503
- null == color || (isNumber(color) && color >= 0),
504
- loggerPrefix + 'circfill() 4th param must be a positive number or zero'
505
- )
506
-
507
- beginPath(_ctx)
508
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI)
509
- instance.fill(color)
510
- },
511
-
512
462
  /**
513
463
  * Draw a ellipse outline
514
464
  *
@@ -569,6 +519,52 @@ export default function litecanvas(settings = {}) {
569
519
  instance.fill(color)
570
520
  },
571
521
 
522
+ /**
523
+ * Draw a circle outline
524
+ *
525
+ * @param {number} x
526
+ * @param {number} y
527
+ * @param {number} radius
528
+ * @param {number} [color=0] the color index
529
+ */
530
+ circ(x, y, radius, color) {
531
+ DEV: assert(isNumber(x), loggerPrefix + 'circ() 1st param must be a number')
532
+ DEV: assert(isNumber(y), loggerPrefix + 'circ() 2nd param must be a number')
533
+ DEV: assert(
534
+ isNumber(radius) && radius >= 0,
535
+ loggerPrefix + 'circ() 3rd param must be a positive number or zero'
536
+ )
537
+ DEV: assert(
538
+ null == color || (isNumber(color) && color >= 0),
539
+ loggerPrefix + 'circ() 4th param must be a positive number or zero'
540
+ )
541
+
542
+ instance.oval(x, y, radius, radius, color)
543
+ },
544
+
545
+ /**
546
+ * Draw a color-filled circle
547
+ *
548
+ * @param {number} x
549
+ * @param {number} y
550
+ * @param {number} radius
551
+ * @param {number} [color=0] the color index
552
+ */
553
+ circfill(x, y, radius, color) {
554
+ DEV: assert(isNumber(x), loggerPrefix + 'circfill() 1st param must be a number')
555
+ DEV: assert(isNumber(y), loggerPrefix + 'circfill() 2nd param must be a number')
556
+ DEV: assert(
557
+ isNumber(radius) && radius >= 0,
558
+ loggerPrefix + 'circfill() 3rd param must be a positive number or zero'
559
+ )
560
+ DEV: assert(
561
+ null == color || (isNumber(color) && color >= 0),
562
+ loggerPrefix + 'circfill() 4th param must be a positive number or zero'
563
+ )
564
+
565
+ instance.ovalfill(x, y, radius, radius, color)
566
+ },
567
+
572
568
  /**
573
569
  * Make a custom shape in the canvas context.
574
570
  * Then, just use `fill` or `stroke` to draw the shape.
@@ -707,6 +703,7 @@ export default function litecanvas(settings = {}) {
707
703
  */
708
704
  textgap(value) {
709
705
  DEV: assert(isNumber(value), loggerPrefix + 'textgap() 1st param must be a number')
706
+
710
707
  _fontLineHeight = value
711
708
  },
712
709
 
package/src/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- export const version = '0.206.1'
2
+ export const version = '0.207.0'
package/src/zzfx.js CHANGED
@@ -1,13 +1,114 @@
1
1
  // ZzFXMicro - Zuper Zmall Zound Zynth - v1.3.0 by Frank Force | https://github.com/KilledByAPixel/ZzFX
2
- // prettier-ignore
3
2
  /**
4
3
  * @param {Window} global
5
4
  * @returns {Function} the `zzfx()` function
6
5
  */
7
6
  export const setupZzFX = (global) => {
8
- const zzfxX = new AudioContext()
7
+ global.zzfxX = new AudioContext()
8
+ global.zzfxV = 1 // volume rate
9
9
 
10
- global.zzfxV = 1
11
-
12
- return (i=1,d=.05,z=220,e=0,P=0,S=.1,I=0,c=1,T=0,H=0,V=0,J=0,h=0,j=0,K=0,E=0,r=0,B=1,X=0,L=0,D=0)=>{let n=Math,t=2*n.PI,a=44100,F=T*=500*t/a/a,O=z*=(1-d+2*d*n.random(d=[]))*t/a,x=0,_=0,f=0,g=1,$=0,l=0,o=0,s=D<0?-1:1,u=t*s*D*2/a,G=n.cos(u),C=n.sin,Q=C(u)/4,M=1+Q,m=-2*G/M,y=(1-Q)/M,R=(1+s*G)/2/M,A=-(s+G)/M,v=R,U=0,W=0,Y=0,Z=0;for(e=a*e+9,X*=a,P*=a,S*=a,r*=a,H*=500*t/a**3,K*=t/a,V*=t/a,J*=a,h=a*h|0,i*=.3*global.zzfxV,s=e+X+P+S+r|0;f<s;d[f++]=o*i)++l%(100*E|0)||(o=I?1<I?2<I?3<I?C(x*x):n.max(n.min(n.tan(x),1),-1):1-(2*x/t%2+2)%2:1-4*n.abs(n.round(x/t)-x/t):C(x),o=(h?1-L+L*C(t*f/h):1)*(o<0?-1:1)*n.abs(o)**c*(f<e?f/e:f<e+X?1-(f-e)/X*(1-B):f<e+X+P?B:f<s-r?(s-f-r)/S*B:0),o=r?o/2+(r>f?0:(f<s-r?1:(s-f)/r)*d[f-r|0]/2/i):o,D&&(o=Z=v*U+A*(U=W)+R*(W=o)-y*Y-m*(Y=Z))),u=(z+=T+=H)*n.cos(K*_++),x+=u+u*j*C(f**5),g&&++g>J&&(z+=V,O+=V,g=0),!h||++$%h||(z=O,T=F,g=g||1);i=zzfxX.createBuffer(1,s,a),i.getChannelData(0).set(d),z=zzfxX.createBufferSource(),z.buffer=i,z.connect(zzfxX.destination),z.start()};
10
+ return (
11
+ i = 1, // volume
12
+ d = 0.05, // randomness
13
+ z = 220, // frequency
14
+ e = 0, // attack
15
+ P = 0, // sustain
16
+ S = 0.1, // release
17
+ I = 0, // shape
18
+ c = 1, // shape curve
19
+ T = 0, // slide
20
+ H = 0, // delta slide
21
+ V = 0, // pitch jump
22
+ J = 0, // pitch jump time
23
+ h = 0, // repeat time
24
+ j = 0, // noise
25
+ K = 0, // modulation
26
+ E = 0, // bit crush
27
+ r = 0, // delay
28
+ B = 1, // sustain volume
29
+ X = 0, // decay
30
+ L = 0, // tremolo
31
+ D = 0 // filter
32
+ ) => {
33
+ let n = Math,
34
+ t = 2 * n.PI,
35
+ a = 44100,
36
+ F = (T *= (500 * t) / a / a),
37
+ O = (z *= ((1 - d + 2 * d * n.random((d = []))) * t) / a),
38
+ x = 0,
39
+ _ = 0,
40
+ f = 0,
41
+ g = 1,
42
+ $ = 0,
43
+ l = 0,
44
+ o = 0,
45
+ s = D < 0 ? -1 : 1,
46
+ u = (t * s * D * 2) / a,
47
+ G = n.cos(u),
48
+ C = n.sin,
49
+ Q = C(u) / 4,
50
+ M = 1 + Q,
51
+ m = (-2 * G) / M,
52
+ y = (1 - Q) / M,
53
+ R = (1 + s * G) / 2 / M,
54
+ A = -(s + G) / M,
55
+ v = R,
56
+ U = 0,
57
+ W = 0,
58
+ Y = 0,
59
+ Z = 0
60
+ for (
61
+ e = a * e + 9,
62
+ X *= a,
63
+ P *= a,
64
+ S *= a,
65
+ r *= a,
66
+ H *= (500 * t) / a ** 3,
67
+ K *= t / a,
68
+ V *= t / a,
69
+ J *= a,
70
+ h = (a * h) | 0,
71
+ i *= 0.3 * zzfxV,
72
+ s = (e + X + P + S + r) | 0;
73
+ f < s;
74
+ d[f++] = o * i
75
+ )
76
+ (++l % ((100 * E) | 0) ||
77
+ ((o = I
78
+ ? 1 < I
79
+ ? 2 < I
80
+ ? 3 < I
81
+ ? C(x * x)
82
+ : n.max(n.min(n.tan(x), 1), -1)
83
+ : 1 - (((((2 * x) / t) % 2) + 2) % 2)
84
+ : 1 - 4 * n.abs(n.round(x / t) - x / t)
85
+ : C(x)),
86
+ (o =
87
+ (h ? 1 - L + L * C((t * f) / h) : 1) *
88
+ (o < 0 ? -1 : 1) *
89
+ n.abs(o) ** c *
90
+ (f < e
91
+ ? f / e
92
+ : f < e + X
93
+ ? 1 - ((f - e) / X) * (1 - B)
94
+ : f < e + X + P
95
+ ? B
96
+ : f < s - r
97
+ ? ((s - f - r) / S) * B
98
+ : 0)),
99
+ (o = r
100
+ ? o / 2 + (r > f ? 0 : ((f < s - r ? 1 : (s - f) / r) * d[(f - r) | 0]) / 2 / i)
101
+ : o),
102
+ D && (o = Z = v * U + A * (U = W) + R * (W = o) - y * Y - m * (Y = Z))),
103
+ (u = (z += T += H) * n.cos(K * _++)),
104
+ (x += u + u * j * C(f ** 5)),
105
+ g && ++g > J && ((z += V), (O += V), (g = 0)),
106
+ !h || ++$ % h || ((z = O), (T = F), (g = g || 1)))
107
+ ;((i = zzfxX.createBuffer(1, s, a)),
108
+ i.getChannelData(0).set(d),
109
+ (z = zzfxX.createBufferSource()),
110
+ (z.buffer = i),
111
+ z.connect(zzfxX.destination),
112
+ z.start())
113
+ }
13
114
  }