[38;5;30m[39m
<[38;5;18;01mhtml[39;00m [38;5;9mlang[39m=[38;5;21m"de"[39m>
<[38;5;18;01mhead[39;00m>
<[38;5;18;01mmeta[39;00m [38;5;9mcharset[39m=[38;5;21m"UTF-8"[39m>
<[38;5;18;01mmeta[39;00m [38;5;9mname[39m=[38;5;21m"viewport"[39m [38;5;9mcontent[39m=[38;5;21m"width=device-width, initial-scale=1.0"[39m>
<[38;5;18;01mtitle[39;00m>KORG Kaoscillator - Digital Hardcore (Low-Latency)[38;5;18;01mtitle[39;00m>
<[38;5;18;01mstyle[39;00m>
[38;5;250m [39m:root[38;5;250m [39m{
[38;5;250m [39m--bg-color:[38;5;250m [39m[38;5;21m#0d0d0d[39m;
[38;5;250m [39m--panel-bg:[38;5;250m [39m[38;5;21m#18181f[39m;
[38;5;250m [39m--accent-yellow:[38;5;250m [39m[38;5;21m#ffcc00[39m;
[38;5;250m [39m--accent-red:[38;5;250m [39m[38;5;21m#ff3333[39m;
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mbody[39;00m[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mbackground-color[39;00m:[38;5;250m [39mvar(--bg-color);
[38;5;250m [39m[38;5;18;01mcolor[39;00m:[38;5;250m [39m[38;5;21m#fff[39m;
[38;5;250m [39m[38;5;18;01mfont-family[39;00m:[38;5;250m [39m[38;5;21m'Courier New'[39m,[38;5;250m [39mCourier,[38;5;250m [39m[38;5;18;01mmonospace[39;00m;
[38;5;250m [39m[38;5;18;01mdisplay[39;00m:[38;5;250m [39m[38;5;18;01mflex[39;00m;
[38;5;250m [39m[38;5;18;01mjustify-content[39;00m:[38;5;250m [39m[38;5;18;01mcenter[39;00m;
[38;5;250m [39m[38;5;18;01malign-items[39;00m:[38;5;250m [39m[38;5;18;01mcenter[39;00m;
[38;5;250m [39m[38;5;18;01mmin-height[39;00m:[38;5;250m [39m[38;5;21m100[39m[38;5;18;01mvh[39;00m;
[38;5;250m [39m[38;5;18;01mmargin[39;00m:[38;5;250m [39m[38;5;21m0[39m;
[38;5;250m [39m[38;5;18;01muser-select[39;00m:[38;5;250m [39m[38;5;18;01mnone[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.kaoss-container[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mbackground[39;00m:[38;5;250m [39mvar(--panel-bg);
[38;5;250m [39m[38;5;18;01mborder[39;00m:[38;5;250m [39m[38;5;21m4[39m[38;5;18;01mpx[39;00m[38;5;250m [39m[38;5;18;01msolid[39;00m[38;5;250m [39m[38;5;21m#333[39m;
[38;5;250m [39m[38;5;18;01mborder-radius[39;00m:[38;5;250m [39m[38;5;21m16[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mpadding[39;00m:[38;5;250m [39m[38;5;21m20[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mbox-shadow[39;00m:[38;5;250m [39m[38;5;21m0[39m[38;5;250m [39m[38;5;21m10[39m[38;5;18;01mpx[39;00m[38;5;250m [39m[38;5;21m30[39m[38;5;18;01mpx[39;00m[38;5;250m [39mrgba([38;5;21m0[39m,[38;5;21m0[39m,[38;5;21m0[39m,[38;5;21m0.9[39m),[38;5;250m [39m[38;5;18;01minset[39;00m[38;5;250m [39m[38;5;21m0[39m[38;5;250m [39m[38;5;21m0[39m[38;5;250m [39m[38;5;21m15[39m[38;5;18;01mpx[39;00m[38;5;250m [39mrgba([38;5;21m255[39m,[38;5;21m255[39m,[38;5;21m255[39m,[38;5;21m0.05[39m);
[38;5;250m [39m[38;5;18;01mwidth[39;00m:[38;5;250m [39m[38;5;21m380[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mdisplay[39;00m:[38;5;250m [39m[38;5;18;01mflex[39;00m;
[38;5;250m [39m[38;5;18;01mflex-direction[39;00m:[38;5;250m [39m[38;5;18;01mcolumn[39;00m;
[38;5;250m [39m[38;5;18;01mgap[39;00m:[38;5;250m [39m[38;5;21m12[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.header[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mdisplay[39;00m:[38;5;250m [39m[38;5;18;01mflex[39;00m;
[38;5;250m [39m[38;5;18;01mjustify-content[39;00m:[38;5;250m [39m[38;5;18;01mspace-between[39;00m;
[38;5;250m [39m[38;5;18;01malign-items[39;00m:[38;5;250m [39m[38;5;18;01mcenter[39;00m;
[38;5;250m [39m[38;5;18;01mborder-bottom[39;00m:[38;5;250m [39m[38;5;21m2[39m[38;5;18;01mpx[39;00m[38;5;250m [39m[38;5;18;01msolid[39;00m[38;5;250m [39m[38;5;21m#333[39m;
[38;5;250m [39m[38;5;18;01mpadding-bottom[39;00m:[38;5;250m [39m[38;5;21m6[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.title[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mfont-weight[39;00m:[38;5;250m [39m[38;5;18;01mbold[39;00m;
[38;5;250m [39m[38;5;18;01mfont-size[39;00m:[38;5;250m [39m[38;5;21m1.1[39m[38;5;18;01mrem[39;00m;
[38;5;250m [39m[38;5;18;01mcolor[39;00m:[38;5;250m [39mvar(--accent-yellow);
[38;5;250m [39m[38;5;18;01mletter-spacing[39;00m:[38;5;250m [39m[38;5;21m2[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.subtitle[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mfont-size[39;00m:[38;5;250m [39m[38;5;21m0.65[39m[38;5;18;01mrem[39;00m;
[38;5;250m [39m[38;5;18;01mcolor[39;00m:[38;5;250m [39mvar(--accent-red);
[38;5;250m [39m[38;5;18;01mfont-weight[39;00m:[38;5;250m [39m[38;5;18;01mbold[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.display[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mbackground[39;00m:[38;5;250m [39m[38;5;21m#000[39m;
[38;5;250m [39m[38;5;18;01mborder[39;00m:[38;5;250m [39m[38;5;21m2[39m[38;5;18;01mpx[39;00m[38;5;250m [39m[38;5;18;01msolid[39;00m[38;5;250m [39m[38;5;21m#444[39m;
[38;5;250m [39m[38;5;18;01mborder-radius[39;00m:[38;5;250m [39m[38;5;21m6[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mpadding[39;00m:[38;5;250m [39m[38;5;21m8[39m[38;5;18;01mpx[39;00m[38;5;250m [39m[38;5;21m12[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mdisplay[39;00m:[38;5;250m [39m[38;5;18;01mflex[39;00m;
[38;5;250m [39m[38;5;18;01mflex-direction[39;00m:[38;5;250m [39m[38;5;18;01mcolumn[39;00m;
[38;5;250m [39m[38;5;18;01mgap[39;00m:[38;5;250m [39m[38;5;21m4[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mfont-family[39;00m:[38;5;250m [39m[38;5;18;01mmonospace[39;00m;
[38;5;250m [39m[38;5;18;01mcolor[39;00m:[38;5;250m [39mvar(--accent-yellow);
[38;5;250m [39m[38;5;18;01mtext-shadow[39;00m:[38;5;250m [39m[38;5;21m0[39m[38;5;250m [39m[38;5;21m0[39m[38;5;250m [39m[38;5;21m5[39m[38;5;18;01mpx[39;00m[38;5;250m [39mvar(--accent-yellow);
[38;5;250m [39m[38;5;18;01mfont-size[39;00m:[38;5;250m [39m[38;5;21m0.85[39m[38;5;18;01mrem[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.display-row[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mdisplay[39;00m:[38;5;250m [39m[38;5;18;01mflex[39;00m;
[38;5;250m [39m[38;5;18;01mjustify-content[39;00m:[38;5;250m [39m[38;5;18;01mspace-between[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.pad-container[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mposition[39;00m:[38;5;250m [39m[38;5;18;01mrelative[39;00m;
[38;5;250m [39m[38;5;18;01mwidth[39;00m:[38;5;250m [39m[38;5;21m100[39m[38;5;18;01m%[39;00m;
[38;5;250m [39m[38;5;18;01mheight[39;00m:[38;5;250m [39m[38;5;21m260[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mbackground[39;00m:[38;5;250m [39m[38;5;21m#050505[39m;
[38;5;250m [39m[38;5;18;01mborder[39;00m:[38;5;250m [39m[38;5;21m3[39m[38;5;18;01mpx[39;00m[38;5;250m [39m[38;5;18;01msolid[39;00m[38;5;250m [39m[38;5;21m#444[39m;
[38;5;250m [39m[38;5;18;01mborder-radius[39;00m:[38;5;250m [39m[38;5;21m12[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01moverflow[39;00m:[38;5;250m [39m[38;5;18;01mhidden[39;00m;
[38;5;250m [39m[38;5;18;01mcursor[39;00m:[38;5;250m [39m[38;5;18;01mcrosshair[39;00m;
[38;5;250m [39mtouch-action:[38;5;250m [39m[38;5;18;01mnone[39;00m;
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mcanvas[39;00m[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mwidth[39;00m:[38;5;250m [39m[38;5;21m100[39m[38;5;18;01m%[39;00m;
[38;5;250m [39m[38;5;18;01mheight[39;00m:[38;5;250m [39m[38;5;21m100[39m[38;5;18;01m%[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.controls[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mdisplay[39;00m:[38;5;250m [39m[38;5;18;01mgrid[39;00m;
[38;5;250m [39m[38;5;18;01mgrid-template-columns[39;00m:[38;5;250m [39m[38;5;21m1[39mfr[38;5;250m [39m[38;5;21m1[39mfr;
[38;5;250m [39m[38;5;18;01mgap[39;00m:[38;5;250m [39m[38;5;21m8[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m}
[38;5;250m [39m.control-group[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mdisplay[39;00m:[38;5;250m [39m[38;5;18;01mflex[39;00m;
[38;5;250m [39m[38;5;18;01mflex-direction[39;00m:[38;5;250m [39m[38;5;18;01mcolumn[39;00m;
[38;5;250m [39m[38;5;18;01mgap[39;00m:[38;5;250m [39m[38;5;21m3[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mlabel[39;00m[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mfont-size[39;00m:[38;5;250m [39m[38;5;21m0.65[39m[38;5;18;01mrem[39;00m;
[38;5;250m [39m[38;5;18;01mcolor[39;00m:[38;5;250m [39m[38;5;21m#aaa[39m;
[38;5;250m [39m[38;5;18;01mtext-transform[39;00m:[38;5;250m [39m[38;5;18;01muppercase[39;00m;
[38;5;250m [39m[38;5;18;01mfont-weight[39;00m:[38;5;250m [39m[38;5;18;01mbold[39;00m;
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mselect[39;00m,[38;5;250m [39m[38;5;18;01mbutton[39;00m,[38;5;250m [39m[38;5;18;01minput[39;00m[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mbackground[39;00m:[38;5;250m [39m[38;5;21m#252530[39m;
[38;5;250m [39m[38;5;18;01mcolor[39;00m:[38;5;250m [39m[38;5;21m#fff[39m;
[38;5;250m [39m[38;5;18;01mborder[39;00m:[38;5;250m [39m[38;5;21m1[39m[38;5;18;01mpx[39;00m[38;5;250m [39m[38;5;18;01msolid[39;00m[38;5;250m [39m[38;5;21m#444[39m;
[38;5;250m [39m[38;5;18;01mpadding[39;00m:[38;5;250m [39m[38;5;21m6[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mborder-radius[39;00m:[38;5;250m [39m[38;5;21m4[39m[38;5;18;01mpx[39;00m;
[38;5;250m [39m[38;5;18;01mfont-family[39;00m:[38;5;250m [39m[38;5;18;01minherit[39;00m;
[38;5;250m [39m[38;5;18;01mfont-size[39;00m:[38;5;250m [39m[38;5;21m0.78[39m[38;5;18;01mrem[39;00m;
[38;5;250m [39m[38;5;18;01mfont-weight[39;00m:[38;5;250m [39m[38;5;18;01mbold[39;00m;
[38;5;250m [39m[38;5;18;01mcursor[39;00m:[38;5;250m [39m[38;5;18;01mpointer[39;00m;
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mselect[39;00m:focus,[38;5;250m [39m[38;5;18;01mbutton[39;00m:focus,[38;5;250m [39m[38;5;18;01minput[39;00m:focus[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01moutline[39;00m:[38;5;250m [39m[38;5;18;01mnone[39;00m;
[38;5;250m [39m[38;5;18;01mborder-color[39;00m:[38;5;250m [39mvar(--accent-yellow);
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mbutton[39;00m.active[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mbackground[39;00m:[38;5;250m [39mvar(--accent-red);
[38;5;250m [39m[38;5;18;01mcolor[39;00m:[38;5;250m [39m[38;5;21m#fff[39m;
[38;5;250m [39m[38;5;18;01mbox-shadow[39;00m:[38;5;250m [39m[38;5;21m0[39m[38;5;250m [39m[38;5;21m0[39m[38;5;250m [39m[38;5;21m10[39m[38;5;18;01mpx[39;00m[38;5;250m [39mvar(--accent-red);
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mstyle[39;00m>
[38;5;18;01mhead[39;00m>
<[38;5;18;01mbody[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"kaoss-container"[39m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"header"[39m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"title"[39m>KAOSS-DHC[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"subtitle"[39m>ZERO-LATENCY EDITION[38;5;18;01mdiv[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"display"[39m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"display-row"[39m>
<[38;5;18;01mspan[39;00m [38;5;9mid[39m=[38;5;21m"disp-preset"[39m>SYNTH: DHC SAW[38;5;18;01mspan[39;00m>
<[38;5;18;01mspan[39;00m [38;5;9mid[39m=[38;5;21m"disp-bpm"[39m>180 BPM[38;5;18;01mspan[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"display-row"[39m>
<[38;5;18;01mspan[39;00m [38;5;9mid[39m=[38;5;21m"disp-scale"[39m>SKALA: PHRYGIAN DOM[38;5;18;01mspan[39;00m>
<[38;5;18;01mspan[39;00m [38;5;9mid[39m=[38;5;21m"disp-pattern"[39m>BEAT: DHC BREAK[38;5;18;01mspan[39;00m>
[38;5;18;01mdiv[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"pad-container"[39m [38;5;9mid[39m=[38;5;21m"pad"[39m>
<[38;5;18;01mcanvas[39;00m [38;5;9mid[39m=[38;5;21m"visualizer"[39m>[38;5;18;01mcanvas[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"controls"[39m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"control-group"[39m>
<[38;5;18;01mlabel[39;00m [38;5;9mfor[39m=[38;5;21m"preset"[39m>Preset[38;5;18;01mlabel[39;00m>
<[38;5;18;01mselect[39;00m [38;5;9mid[39m=[38;5;21m"preset"[39m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"saw"[39m>Aggro Saw Lead[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"acid"[39m>Screaming 303[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"sub"[39m>Distorted Sub[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"noise"[39m>Cyber Chaos[38;5;18;01moption[39;00m>
[38;5;18;01mselect[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"control-group"[39m>
<[38;5;18;01mlabel[39;00m [38;5;9mfor[39m=[38;5;21m"scale"[39m>Skala (Exotisch)[38;5;18;01mlabel[39;00m>
<[38;5;18;01mselect[39;00m [38;5;9mid[39m=[38;5;21m"scale"[39m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"phrygianDom"[39m>Phrygisch-Dominant[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"hirajoshi"[39m>Hirajoshi (Japan)[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"hungarianMin"[39m>Ungarisch Moll[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"arabic"[39m>Arabisch (Bayati)[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"pelog"[39m>Pelog (Bali)[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"minor"[39m>Min-Pentatonisch[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"blues"[39m>Blues[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"chromatic"[39m>Chromatisch[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"raw"[39m>Unquantisiert[38;5;18;01moption[39;00m>
[38;5;18;01mselect[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"control-group"[39m>
<[38;5;18;01mlabel[39;00m [38;5;9mfor[39m=[38;5;21m"beat-pattern"[39m>Drum Pattern[38;5;18;01mlabel[39;00m>
<[38;5;18;01mselect[39;00m [38;5;9mid[39m=[38;5;21m"beat-pattern"[39m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"dhc"[39m>DHC Breakbeat[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"amen"[39m>Amen Cyber Cut[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"gabber"[39m>Gabber 4-to-Floor[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"industrial"[39m>Industrial Sync[38;5;18;01moption[39;00m>
<[38;5;18;01moption[39;00m [38;5;9mvalue[39m=[38;5;21m"speedcore"[39m>Speedcore Terror[38;5;18;01moption[39;00m>
[38;5;18;01mselect[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mclass[39m=[38;5;21m"control-group"[39m>
<[38;5;18;01mlabel[39;00m [38;5;9mfor[39m=[38;5;21m"bpm"[39m>Tempo / Beat[38;5;18;01mlabel[39;00m>
<[38;5;18;01mdiv[39;00m [38;5;9mstyle[39m=[38;5;21m"display: flex; gap: 4px;"[39m>
<[38;5;18;01minput[39;00m [38;5;9mtype[39m=[38;5;21m"number"[39m [38;5;9mid[39m=[38;5;21m"bpm"[39m [38;5;9mvalue[39m=[38;5;21m"180"[39m [38;5;9mmin[39m=[38;5;21m"120"[39m [38;5;9mmax[39m=[38;5;21m"240"[39m [38;5;9mstyle[39m=[38;5;21m"width: 45%;"[39m>
<[38;5;18;01mbutton[39;00m [38;5;9mid[39m=[38;5;21m"beat-btn"[39m [38;5;9mstyle[39m=[38;5;21m"width: 55%;"[39m>BEAT RUN[38;5;18;01mbutton[39;00m>
[38;5;18;01mdiv[39;00m>
[38;5;18;01mdiv[39;00m>
[38;5;18;01mdiv[39;00m>
[38;5;18;01mdiv[39;00m>
<[38;5;18;01mscript[39;00m>
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39maudioCtx[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mnull[39;00m;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mmasterGain,[38;5;250m [39mdriveNode,[38;5;250m [39mfilterNode,[38;5;250m [39mmainOsc,[38;5;250m [39msubOsc;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mnoiseBuffer[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mnull[39;00m;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39misTouching[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mfalse[39;00m;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mbeatPlaying[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mfalse[39;00m;
[38;5;250m [39m[38;5;28;03m// Scheduler Variables (Low Latency Web Audio Clock)[39;00m
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mlookahead[38;5;250m [39m=[38;5;250m [39m[38;5;21m25.0[39m;[38;5;250m [39m[38;5;28;03m// ms[39;00m
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mscheduleAheadTime[38;5;250m [39m=[38;5;250m [39m[38;5;21m0.1[39m;[38;5;250m [39m[38;5;28;03m// seconds[39;00m
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mnextNoteTime[38;5;250m [39m=[38;5;250m [39m[38;5;21m0.0[39m;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mcurrent16thNote[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mtimerID[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mnull[39;00m;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mbaseFreq[38;5;250m [39m=[38;5;250m [39m[38;5;21m110[39m;[38;5;250m [39m[38;5;28;03m// A2[39;00m
[38;5;250m [39m[38;5;28;03m// Exotic & Standard Scales[39;00m
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mscales[38;5;250m [39m=[38;5;250m [39m{
[38;5;250m [39mphrygianDom:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m4[39m,[38;5;250m [39m[38;5;21m5[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m8[39m,[38;5;250m [39m[38;5;21m10[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m13[39m,[38;5;250m [39m[38;5;21m16[39m,[38;5;250m [39m[38;5;21m17[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m20[39m,[38;5;250m [39m[38;5;21m22[39m,[38;5;250m [39m[38;5;21m24[39m],
[38;5;250m [39mhirajoshi:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m2[39m,[38;5;250m [39m[38;5;21m3[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m8[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m14[39m,[38;5;250m [39m[38;5;21m15[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m20[39m,[38;5;250m [39m[38;5;21m24[39m],
[38;5;250m [39mhungarianMin:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m2[39m,[38;5;250m [39m[38;5;21m3[39m,[38;5;250m [39m[38;5;21m6[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m8[39m,[38;5;250m [39m[38;5;21m11[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m14[39m,[38;5;250m [39m[38;5;21m15[39m,[38;5;250m [39m[38;5;21m18[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m20[39m,[38;5;250m [39m[38;5;21m23[39m,[38;5;250m [39m[38;5;21m24[39m],
[38;5;250m [39marabic:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m4[39m,[38;5;250m [39m[38;5;21m5[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m8[39m,[38;5;250m [39m[38;5;21m11[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m13[39m,[38;5;250m [39m[38;5;21m16[39m,[38;5;250m [39m[38;5;21m17[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m20[39m,[38;5;250m [39m[38;5;21m23[39m,[38;5;250m [39m[38;5;21m24[39m],
[38;5;250m [39mpelog:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m3[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m8[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m13[39m,[38;5;250m [39m[38;5;21m15[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m20[39m,[38;5;250m [39m[38;5;21m24[39m],
[38;5;250m [39mminor:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m3[39m,[38;5;250m [39m[38;5;21m5[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m10[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m15[39m,[38;5;250m [39m[38;5;21m17[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m22[39m,[38;5;250m [39m[38;5;21m24[39m],
[38;5;250m [39mblues:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m3[39m,[38;5;250m [39m[38;5;21m5[39m,[38;5;250m [39m[38;5;21m6[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m10[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m15[39m,[38;5;250m [39m[38;5;21m17[39m,[38;5;250m [39m[38;5;21m18[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m22[39m,[38;5;250m [39m[38;5;21m24[39m],
[38;5;250m [39mchromatic:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m2[39m,[38;5;250m [39m[38;5;21m3[39m,[38;5;250m [39m[38;5;21m4[39m,[38;5;250m [39m[38;5;21m5[39m,[38;5;250m [39m[38;5;21m6[39m,[38;5;250m [39m[38;5;21m7[39m,[38;5;250m [39m[38;5;21m8[39m,[38;5;250m [39m[38;5;21m9[39m,[38;5;250m [39m[38;5;21m10[39m,[38;5;250m [39m[38;5;21m11[39m,[38;5;250m [39m[38;5;21m12[39m,[38;5;250m [39m[38;5;21m13[39m,[38;5;250m [39m[38;5;21m14[39m,[38;5;250m [39m[38;5;21m15[39m,[38;5;250m [39m[38;5;21m16[39m,[38;5;250m [39m[38;5;21m17[39m,[38;5;250m [39m[38;5;21m18[39m,[38;5;250m [39m[38;5;21m19[39m,[38;5;250m [39m[38;5;21m20[39m,[38;5;250m [39m[38;5;21m21[39m,[38;5;250m [39m[38;5;21m22[39m,[38;5;250m [39m[38;5;21m23[39m,[38;5;250m [39m[38;5;21m24[39m]
[38;5;250m [39m};
[38;5;250m [39m[38;5;28;03m// 16-step Drum Patterns[39;00m
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mdrumPatterns[38;5;250m [39m=[38;5;250m [39m{
[38;5;250m [39mdhc:[38;5;250m [39m{
[38;5;250m [39mkick:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39msnare:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39mhat:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m]
[38;5;250m [39m},
[38;5;250m [39mamen:[38;5;250m [39m{
[38;5;250m [39mkick:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39msnare:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m],
[38;5;250m [39mhat:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m]
[38;5;250m [39m},
[38;5;250m [39mgabber:[38;5;250m [39m{
[38;5;250m [39mkick:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39msnare:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39mhat:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m]
[38;5;250m [39m},
[38;5;250m [39mindustrial:[38;5;250m [39m{
[38;5;250m [39mkick:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39msnare:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39mhat:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m]
[38;5;250m [39m},
[38;5;250m [39mspeedcore:[38;5;250m [39m{
[38;5;250m [39mkick:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m],
[38;5;250m [39msnare:[38;5;250m [39m[[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m],
[38;5;250m [39mhat:[38;5;250m [39m[[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39m[38;5;21m1[39m,[38;5;250m [39m[38;5;21m0[39m]
[38;5;250m [39m}
[38;5;250m [39m};
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39minitAudio()[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(audioCtx)[38;5;250m [39m[38;5;18;01mreturn[39;00m;
[38;5;250m [39maudioCtx[38;5;250m [39m=[38;5;250m [39m[01mnew[00m[38;5;250m [39m(window.AudioContext[38;5;250m [39m||[38;5;250m [39mwindow.webkitAudioContext)({[38;5;250m [39mlatencyHint:[38;5;250m [39m[38;5;21m'interactive'[39m[38;5;250m [39m});
[38;5;250m [39mmasterGain[38;5;250m [39m=[38;5;250m [39maudioCtx.createGain();
[38;5;250m [39mmasterGain.gain.value[38;5;250m [39m=[38;5;250m [39m[38;5;21m0.3[39m;
[38;5;250m [39m[38;5;28;03m// Hardcore Overdrive Distortion Node[39;00m
[38;5;250m [39mdriveNode[38;5;250m [39m=[38;5;250m [39maudioCtx.createWaveShaper();
[38;5;250m [39mdriveNode.curve[38;5;250m [39m=[38;5;250m [39mmakeDistortionCurve([38;5;21m95[39m);
[38;5;250m [39mdriveNode.oversample[38;5;250m [39m=[38;5;250m [39m[38;5;21m'4x'[39m;
[38;5;250m [39m[38;5;28;03m// Filter Node[39;00m
[38;5;250m [39mfilterNode[38;5;250m [39m=[38;5;250m [39maudioCtx.createBiquadFilter();
[38;5;250m [39mfilterNode.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'lowpass'[39m;
[38;5;250m [39mfilterNode.frequency.value[38;5;250m [39m=[38;5;250m [39m[38;5;21m2000[39m;
[38;5;250m [39mfilterNode.Q.value[38;5;250m [39m=[38;5;250m [39m[38;5;21m6[39m;
[38;5;250m [39mfilterNode.connect(driveNode);
[38;5;250m [39mdriveNode.connect(masterGain);
[38;5;250m [39mmasterGain.connect(audioCtx.destination);
[38;5;250m [39m[38;5;28;03m// Pre-generate noise buffer to avoid audio thread stalls[39;00m
[38;5;250m [39mcreateNoiseBuffer();
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mcreateNoiseBuffer()[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mbufferSize[38;5;250m [39m=[38;5;250m [39maudioCtx.sampleRate[38;5;250m [39m*[38;5;250m [39m[38;5;21m1.0[39m;
[38;5;250m [39mnoiseBuffer[38;5;250m [39m=[38;5;250m [39maudioCtx.createBuffer([38;5;21m1[39m,[38;5;250m [39mbufferSize,[38;5;250m [39maudioCtx.sampleRate);
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39moutput[38;5;250m [39m=[38;5;250m [39mnoiseBuffer.getChannelData([38;5;21m0[39m);
[38;5;250m [39m[38;5;18;01mfor[39;00m[38;5;250m [39m([38;5;18;01mlet[39;00m[38;5;250m [39mi[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;[38;5;250m [39mi[38;5;250m [39m<[38;5;250m [39mbufferSize;[38;5;250m [39mi++)[38;5;250m [39m{
[38;5;250m [39moutput[i][38;5;250m [39m=[38;5;250m [39mMath.random()[38;5;250m [39m*[38;5;250m [39m[38;5;21m2[39m[38;5;250m [39m-[38;5;250m [39m[38;5;21m1[39m;
[38;5;250m [39m}
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mmakeDistortionCurve(amount)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mk[38;5;250m [39m=[38;5;250m [39mamount,[38;5;250m [39mn[38;5;250m [39m=[38;5;250m [39m[38;5;21m44100[39m,[38;5;250m [39mcurve[38;5;250m [39m=[38;5;250m [39m[01mnew[00m[38;5;250m [39mFloat32Array(n),[38;5;250m [39mdeg[38;5;250m [39m=[38;5;250m [39mMath.PI[38;5;250m [39m/[38;5;250m [39m[38;5;21m180[39m;
[38;5;250m [39m[38;5;18;01mfor[39;00m[38;5;250m [39m([38;5;18;01mlet[39;00m[38;5;250m [39mi[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;[38;5;250m [39mi[38;5;250m [39m<[38;5;250m [39mn;[38;5;250m [39m++i)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mx[38;5;250m [39m=[38;5;250m [39mi[38;5;250m [39m*[38;5;250m [39m[38;5;21m2[39m[38;5;250m [39m/[38;5;250m [39mn[38;5;250m [39m-[38;5;250m [39m[38;5;21m1[39m;
[38;5;250m [39mcurve[i][38;5;250m [39m=[38;5;250m [39m([38;5;21m3[39m[38;5;250m [39m+[38;5;250m [39mk)[38;5;250m [39m*[38;5;250m [39mx[38;5;250m [39m*[38;5;250m [39m[38;5;21m20[39m[38;5;250m [39m*[38;5;250m [39mdeg[38;5;250m [39m/[38;5;250m [39m(Math.PI[38;5;250m [39m+[38;5;250m [39mk[38;5;250m [39m*[38;5;250m [39mMath.abs(x));
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mreturn[39;00m[38;5;250m [39mcurve;
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mmtof(note)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mreturn[39;00m[38;5;250m [39mbaseFreq[38;5;250m [39m*[38;5;250m [39mMath.pow([38;5;21m2[39m,[38;5;250m [39mnote[38;5;250m [39m/[38;5;250m [39m[38;5;21m12[39m);
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mstartSynth()[38;5;250m [39m{
[38;5;250m [39minitAudio();
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(audioCtx.state[38;5;250m [39m===[38;5;250m [39m[38;5;21m'suspended'[39m)[38;5;250m [39maudioCtx.resume();
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(mainOsc)[38;5;250m [39m[38;5;18;01mreturn[39;00m;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mpreset[38;5;250m [39m=[38;5;250m [39mdocument.getElementById([38;5;21m'preset'[39m).value;
[38;5;250m [39mmainOsc[38;5;250m [39m=[38;5;250m [39maudioCtx.createOscillator();
[38;5;250m [39msubOsc[38;5;250m [39m=[38;5;250m [39maudioCtx.createOscillator();
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(preset[38;5;250m [39m===[38;5;250m [39m[38;5;21m'saw'[39m)[38;5;250m [39m{
[38;5;250m [39mmainOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'sawtooth'[39m;[38;5;250m [39msubOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'square'[39m;
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(preset[38;5;250m [39m===[38;5;250m [39m[38;5;21m'acid'[39m)[38;5;250m [39m{
[38;5;250m [39mmainOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'sawtooth'[39m;[38;5;250m [39msubOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'sawtooth'[39m;
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(preset[38;5;250m [39m===[38;5;250m [39m[38;5;21m'sub'[39m)[38;5;250m [39m{
[38;5;250m [39mmainOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'triangle'[39m;[38;5;250m [39msubOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'sine'[39m;
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(preset[38;5;250m [39m===[38;5;250m [39m[38;5;21m'noise'[39m)[38;5;250m [39m{
[38;5;250m [39mmainOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'square'[39m;[38;5;250m [39msubOsc.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'sawtooth'[39m;
[38;5;250m [39m}
[38;5;250m [39mmainOsc.connect(filterNode);
[38;5;250m [39msubOsc.connect(filterNode);
[38;5;250m [39mmainOsc.start();
[38;5;250m [39msubOsc.start();
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mstopSynth()[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(mainOsc)[38;5;250m [39m{[38;5;250m [39mmainOsc.stop();[38;5;250m [39mmainOsc.disconnect();[38;5;250m [39mmainOsc[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mnull[39;00m;[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(subOsc)[38;5;250m [39m{[38;5;250m [39msubOsc.stop();[38;5;250m [39msubOsc.disconnect();[38;5;250m [39msubOsc[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mnull[39;00m;[38;5;250m [39m}
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mupdateSynth(x,[38;5;250m [39my)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(!mainOsc)[38;5;250m [39m[38;5;18;01mreturn[39;00m;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mscaleType[38;5;250m [39m=[38;5;250m [39mdocument.getElementById([38;5;21m'scale'[39m).value;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mfreq;
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(scaleType[38;5;250m [39m===[38;5;250m [39m[38;5;21m'raw'[39m)[38;5;250m [39m{
[38;5;250m [39mfreq[38;5;250m [39m=[38;5;250m [39m[38;5;21m80[39m[38;5;250m [39m*[38;5;250m [39mMath.pow([38;5;21m2[39m,[38;5;250m [39mx[38;5;250m [39m*[38;5;250m [39m[38;5;21m4[39m);
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mcurrentScale[38;5;250m [39m=[38;5;250m [39mscales[scaleType];
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mnoteIndex[38;5;250m [39m=[38;5;250m [39mMath.floor(x[38;5;250m [39m*[38;5;250m [39mcurrentScale.length);
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mnote[38;5;250m [39m=[38;5;250m [39mcurrentScale[Math.min(noteIndex,[38;5;250m [39mcurrentScale.length[38;5;250m [39m-[38;5;250m [39m[38;5;21m1[39m)];
[38;5;250m [39mfreq[38;5;250m [39m=[38;5;250m [39mmtof(note);
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mminVal[38;5;250m [39m=[38;5;250m [39m[38;5;21m100[39m,[38;5;250m [39mmaxVal[38;5;250m [39m=[38;5;250m [39m[38;5;21m10000[39m;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mcutoff[38;5;250m [39m=[38;5;250m [39mminVal[38;5;250m [39m*[38;5;250m [39mMath.pow(maxVal[38;5;250m [39m/[38;5;250m [39mminVal,[38;5;250m [39my);
[38;5;250m [39m[38;5;28;03m// Immediate value scheduling for zero latency[39;00m
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mnow[38;5;250m [39m=[38;5;250m [39maudioCtx.currentTime;
[38;5;250m [39mmainOsc.frequency.setValueAtTime(freq,[38;5;250m [39mnow);
[38;5;250m [39msubOsc.frequency.setValueAtTime(freq[38;5;250m [39m/[38;5;250m [39m[38;5;21m2[39m,[38;5;250m [39mnow);
[38;5;250m [39mfilterNode.frequency.setValueAtTime(cutoff,[38;5;250m [39mnow);
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(document.getElementById([38;5;21m'preset'[39m).value[38;5;250m [39m===[38;5;250m [39m[38;5;21m'acid'[39m)[38;5;250m [39m{
[38;5;250m [39mfilterNode.Q.setValueAtTime([38;5;21m4[39m[38;5;250m [39m+[38;5;250m [39m(y[38;5;250m [39m*[38;5;250m [39m[38;5;21m18[39m),[38;5;250m [39mnow);
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m{
[38;5;250m [39mfilterNode.Q.setValueAtTime([38;5;21m4[39m,[38;5;250m [39mnow);
[38;5;250m [39m}
[38;5;250m [39m}
[38;5;250m [39m[38;5;28;03m// High-Precision Drum Synthesizer[39;00m
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mtriggerDrum(type,[38;5;250m [39mtime)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(type[38;5;250m [39m===[38;5;250m [39m[38;5;21m'kick'[39m)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mosc[38;5;250m [39m=[38;5;250m [39maudioCtx.createOscillator();
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mgain[38;5;250m [39m=[38;5;250m [39maudioCtx.createGain();
[38;5;250m [39mosc.frequency.setValueAtTime([38;5;21m180[39m,[38;5;250m [39mtime);
[38;5;250m [39mosc.frequency.exponentialRampToValueAtTime([38;5;21m30[39m,[38;5;250m [39mtime[38;5;250m [39m+[38;5;250m [39m[38;5;21m0.1[39m);
[38;5;250m [39mgain.gain.setValueAtTime([38;5;21m1.4[39m,[38;5;250m [39mtime);
[38;5;250m [39mgain.gain.exponentialRampToValueAtTime([38;5;21m0.001[39m,[38;5;250m [39mtime[38;5;250m [39m+[38;5;250m [39m[38;5;21m0.14[39m);
[38;5;250m [39mosc.connect(driveNode);
[38;5;250m [39mosc.start(time);[38;5;250m [39mosc.stop(time[38;5;250m [39m+[38;5;250m [39m[38;5;21m0.14[39m);
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(type[38;5;250m [39m===[38;5;250m [39m[38;5;21m'snare'[39m)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mnoiseSrc[38;5;250m [39m=[38;5;250m [39maudioCtx.createBufferSource();
[38;5;250m [39mnoiseSrc.buffer[38;5;250m [39m=[38;5;250m [39mnoiseBuffer;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mfilter[38;5;250m [39m=[38;5;250m [39maudioCtx.createBiquadFilter();
[38;5;250m [39mfilter.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'highpass'[39m;
[38;5;250m [39mfilter.frequency.value[38;5;250m [39m=[38;5;250m [39m[38;5;21m800[39m;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mgain[38;5;250m [39m=[38;5;250m [39maudioCtx.createGain();
[38;5;250m [39mgain.gain.setValueAtTime([38;5;21m0.9[39m,[38;5;250m [39mtime);
[38;5;250m [39mgain.gain.exponentialRampToValueAtTime([38;5;21m0.01[39m,[38;5;250m [39mtime[38;5;250m [39m+[38;5;250m [39m[38;5;21m0.09[39m);
[38;5;250m [39mnoiseSrc.connect(filter);
[38;5;250m [39mfilter.connect(driveNode);
[38;5;250m [39mnoiseSrc.start(time);[38;5;250m [39mnoiseSrc.stop(time[38;5;250m [39m+[38;5;250m [39m[38;5;21m0.09[39m);
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(type[38;5;250m [39m===[38;5;250m [39m[38;5;21m'hat'[39m)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mnoiseSrc[38;5;250m [39m=[38;5;250m [39maudioCtx.createBufferSource();
[38;5;250m [39mnoiseSrc.buffer[38;5;250m [39m=[38;5;250m [39mnoiseBuffer;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mfilter[38;5;250m [39m=[38;5;250m [39maudioCtx.createBiquadFilter();
[38;5;250m [39mfilter.type[38;5;250m [39m=[38;5;250m [39m[38;5;21m'highpass'[39m;
[38;5;250m [39mfilter.frequency.value[38;5;250m [39m=[38;5;250m [39m[38;5;21m6000[39m;
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mgain[38;5;250m [39m=[38;5;250m [39maudioCtx.createGain();
[38;5;250m [39mgain.gain.setValueAtTime([38;5;21m0.4[39m,[38;5;250m [39mtime);
[38;5;250m [39mgain.gain.exponentialRampToValueAtTime([38;5;21m0.001[39m,[38;5;250m [39mtime[38;5;250m [39m+[38;5;250m [39m[38;5;21m0.04[39m);
[38;5;250m [39mnoiseSrc.connect(filter);
[38;5;250m [39mfilter.connect(driveNode);
[38;5;250m [39mnoiseSrc.start(time);[38;5;250m [39mnoiseSrc.stop(time[38;5;250m [39m+[38;5;250m [39m[38;5;21m0.04[39m);
[38;5;250m [39m}
[38;5;250m [39m}
[38;5;250m [39m[38;5;28;03m// Web Audio Lookahead Scheduler[39;00m
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mnextNote()[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mbpm[38;5;250m [39m=[38;5;250m [39mparseInt(document.getElementById([38;5;21m'bpm'[39m).value);
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39msecondsPerBeat[38;5;250m [39m=[38;5;250m [39m[38;5;21m60.0[39m[38;5;250m [39m/[38;5;250m [39mbpm;
[38;5;250m [39mnextNoteTime[38;5;250m [39m+=[38;5;250m [39m[38;5;21m0.25[39m[38;5;250m [39m*[38;5;250m [39msecondsPerBeat;[38;5;250m [39m[38;5;28;03m// 16th note step[39;00m
[38;5;250m [39mcurrent16thNote[38;5;250m [39m=[38;5;250m [39m(current16thNote[38;5;250m [39m+[38;5;250m [39m[38;5;21m1[39m)[38;5;250m [39m%[38;5;250m [39m[38;5;21m16[39m;
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mscheduleNote(step,[38;5;250m [39mtime)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mpatKey[38;5;250m [39m=[38;5;250m [39mdocument.getElementById([38;5;21m'beat-pattern'[39m).value;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mpat[38;5;250m [39m=[38;5;250m [39mdrumPatterns[patKey];
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(pat.kick[step])[38;5;250m [39mtriggerDrum([38;5;21m'kick'[39m,[38;5;250m [39mtime);
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(pat.snare[step])[38;5;250m [39mtriggerDrum([38;5;21m'snare'[39m,[38;5;250m [39mtime);
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(pat.hat[step])[38;5;250m [39mtriggerDrum([38;5;21m'hat'[39m,[38;5;250m [39mtime);
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mscheduler()[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mwhile[39;00m[38;5;250m [39m(nextNoteTime[38;5;250m [39m<[38;5;250m [39maudioCtx.currentTime[38;5;250m [39m+[38;5;250m [39mscheduleAheadTime)[38;5;250m [39m{
[38;5;250m [39mscheduleNote(current16thNote,[38;5;250m [39mnextNoteTime);
[38;5;250m [39mnextNote();
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(beatPlaying)[38;5;250m [39m{
[38;5;250m [39mtimerID[38;5;250m [39m=[38;5;250m [39mwindow.setTimeout(scheduler,[38;5;250m [39mlookahead);
[38;5;250m [39m}
[38;5;250m [39m}
[38;5;250m [39mdocument.getElementById([38;5;21m'beat-btn'[39m).addEventListener([38;5;21m'click'[39m,[38;5;250m [39m(e)[38;5;250m [39m=>[38;5;250m [39m{
[38;5;250m [39minitAudio();
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(audioCtx.state[38;5;250m [39m===[38;5;250m [39m[38;5;21m'suspended'[39m)[38;5;250m [39maudioCtx.resume();
[38;5;250m [39mbeatPlaying[38;5;250m [39m=[38;5;250m [39m!beatPlaying;
[38;5;250m [39me.target.classList.toggle([38;5;21m'active'[39m,[38;5;250m [39mbeatPlaying);
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(beatPlaying)[38;5;250m [39m{
[38;5;250m [39mcurrent16thNote[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;
[38;5;250m [39mnextNoteTime[38;5;250m [39m=[38;5;250m [39maudioCtx.currentTime;
[38;5;250m [39mscheduler();
[38;5;250m [39m}[38;5;250m [39m[38;5;18;01melse[39;00m[38;5;250m [39m{
[38;5;250m [39mclearTimeout(timerID);
[38;5;250m [39m}
[38;5;250m [39m});
[38;5;250m [39m[38;5;28;03m// Touch / Mouse Interaction with RAF Decoupling for smooth performance[39;00m
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mpad[38;5;250m [39m=[38;5;250m [39mdocument.getElementById([38;5;21m'pad'[39m);
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mcanvas[38;5;250m [39m=[38;5;250m [39mdocument.getElementById([38;5;21m'visualizer'[39m);
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mctx[38;5;250m [39m=[38;5;250m [39mcanvas.getContext([38;5;21m'2d'[39m);
[38;5;250m [39m[38;5;18;01mlet[39;00m[38;5;250m [39mtouchX[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39mtouchY[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mresizeCanvas()[38;5;250m [39m{
[38;5;250m [39mcanvas.width[38;5;250m [39m=[38;5;250m [39mpad.clientWidth;[38;5;250m [39mcanvas.height[38;5;250m [39m=[38;5;250m [39mpad.clientHeight;
[38;5;250m [39m}
[38;5;250m [39mwindow.addEventListener([38;5;21m'resize'[39m,[38;5;250m [39mresizeCanvas);
[38;5;250m [39mresizeCanvas();
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mhandleInputStart(e)[38;5;250m [39m{
[38;5;250m [39misTouching[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mtrue[39;00m;
[38;5;250m [39mstartSynth();
[38;5;250m [39mhandleInputMove(e);
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mhandleInputEnd()[38;5;250m [39m{
[38;5;250m [39misTouching[38;5;250m [39m=[38;5;250m [39m[38;5;18;01mfalse[39;00m;
[38;5;250m [39mstopSynth();
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mhandleInputMove(e)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(!isTouching)[38;5;250m [39m[38;5;18;01mreturn[39;00m;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mrect[38;5;250m [39m=[38;5;250m [39mpad.getBoundingClientRect();
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mclientX[38;5;250m [39m=[38;5;250m [39me.touches[38;5;250m [39m?[38;5;250m [39me.touches[[38;5;21m0[39m].clientX[38;5;250m [39m:[38;5;250m [39me.clientX;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mclientY[38;5;250m [39m=[38;5;250m [39me.touches[38;5;250m [39m?[38;5;250m [39me.touches[[38;5;21m0[39m].clientY[38;5;250m [39m:[38;5;250m [39me.clientY;
[38;5;250m [39mtouchX[38;5;250m [39m=[38;5;250m [39mMath.max([38;5;21m0[39m,[38;5;250m [39mMath.min([38;5;21m1[39m,[38;5;250m [39m(clientX[38;5;250m [39m-[38;5;250m [39mrect.left)[38;5;250m [39m/[38;5;250m [39mrect.width));
[38;5;250m [39mtouchY[38;5;250m [39m=[38;5;250m [39mMath.max([38;5;21m0[39m,[38;5;250m [39mMath.min([38;5;21m1[39m,[38;5;250m [39m[38;5;21m1[39m[38;5;250m [39m-[38;5;250m [39m(clientY[38;5;250m [39m-[38;5;250m [39mrect.top)[38;5;250m [39m/[38;5;250m [39mrect.height));
[38;5;250m [39mupdateSynth(touchX,[38;5;250m [39mtouchY);
[38;5;250m [39m}
[38;5;250m [39mpad.addEventListener([38;5;21m'mousedown'[39m,[38;5;250m [39mhandleInputStart);
[38;5;250m [39mwindow.addEventListener([38;5;21m'mouseup'[39m,[38;5;250m [39mhandleInputEnd);
[38;5;250m [39mpad.addEventListener([38;5;21m'mousemove'[39m,[38;5;250m [39mhandleInputMove);
[38;5;250m [39mpad.addEventListener([38;5;21m'touchstart'[39m,[38;5;250m [39mhandleInputStart,[38;5;250m [39m{[38;5;250m [39mpassive:[38;5;250m [39m[38;5;18;01mtrue[39;00m[38;5;250m [39m});
[38;5;250m [39mwindow.addEventListener([38;5;21m'touchend'[39m,[38;5;250m [39mhandleInputEnd);
[38;5;250m [39mpad.addEventListener([38;5;21m'touchmove'[39m,[38;5;250m [39mhandleInputMove,[38;5;250m [39m{[38;5;250m [39mpassive:[38;5;250m [39m[38;5;18;01mtrue[39;00m[38;5;250m [39m});
[38;5;250m [39m[38;5;28;03m// Canvas Visualization Loop[39;00m
[38;5;250m [39m[38;5;18;01mfunction[39;00m[38;5;250m [39mrenderVisualizer()[38;5;250m [39m{
[38;5;250m [39mrequestAnimationFrame(renderVisualizer);
[38;5;250m [39mctx.fillStyle[38;5;250m [39m=[38;5;250m [39m[38;5;21m'rgba(5, 5, 5, 0.25)'[39m;
[38;5;250m [39mctx.fillRect([38;5;21m0[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39mcanvas.width,[38;5;250m [39mcanvas.height);
[38;5;250m [39m[38;5;28;03m// Grid[39;00m
[38;5;250m [39mctx.strokeStyle[38;5;250m [39m=[38;5;250m [39m[38;5;21m'#1a1a1a'[39m;
[38;5;250m [39mctx.lineWidth[38;5;250m [39m=[38;5;250m [39m[38;5;21m1[39m;
[38;5;250m [39m[38;5;18;01mfor[39;00m[38;5;250m [39m([38;5;18;01mlet[39;00m[38;5;250m [39mi[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;[38;5;250m [39mi[38;5;250m [39m<[38;5;250m [39mcanvas.width;[38;5;250m [39mi[38;5;250m [39m+=[38;5;250m [39m[38;5;21m30[39m)[38;5;250m [39m{
[38;5;250m [39mctx.beginPath();[38;5;250m [39mctx.moveTo(i,[38;5;250m [39m[38;5;21m0[39m);[38;5;250m [39mctx.lineTo(i,[38;5;250m [39mcanvas.height);[38;5;250m [39mctx.stroke();
[38;5;250m [39m}
[38;5;250m [39m[38;5;18;01mfor[39;00m[38;5;250m [39m([38;5;18;01mlet[39;00m[38;5;250m [39mj[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;[38;5;250m [39mj[38;5;250m [39m<[38;5;250m [39mcanvas.height;[38;5;250m [39mj[38;5;250m [39m+=[38;5;250m [39m[38;5;21m30[39m)[38;5;250m [39m{
[38;5;250m [39mctx.beginPath();[38;5;250m [39mctx.moveTo([38;5;21m0[39m,[38;5;250m [39mj);[38;5;250m [39mctx.lineTo(canvas.width,[38;5;250m [39mj);[38;5;250m [39mctx.stroke();
[38;5;250m [39m}
[38;5;250m [39m[38;5;28;03m// Touch Cursor[39;00m
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(isTouching)[38;5;250m [39m{
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mcx[38;5;250m [39m=[38;5;250m [39mtouchX[38;5;250m [39m*[38;5;250m [39mcanvas.width;
[38;5;250m [39m[38;5;18;01mconst[39;00m[38;5;250m [39mcy[38;5;250m [39m=[38;5;250m [39m([38;5;21m1[39m[38;5;250m [39m-[38;5;250m [39mtouchY)[38;5;250m [39m*[38;5;250m [39mcanvas.height;
[38;5;250m [39mctx.strokeStyle[38;5;250m [39m=[38;5;250m [39m[38;5;21m'rgba(255, 204, 0, 0.6)'[39m;
[38;5;250m [39mctx.beginPath();[38;5;250m [39mctx.moveTo(cx,[38;5;250m [39m[38;5;21m0[39m);[38;5;250m [39mctx.lineTo(cx,[38;5;250m [39mcanvas.height);[38;5;250m [39mctx.stroke();
[38;5;250m [39mctx.beginPath();[38;5;250m [39mctx.moveTo([38;5;21m0[39m,[38;5;250m [39mcy);[38;5;250m [39mctx.lineTo(canvas.width,[38;5;250m [39mcy);[38;5;250m [39mctx.stroke();
[38;5;250m [39mctx.fillStyle[38;5;250m [39m=[38;5;250m [39m[38;5;21m'#ff3333'[39m;
[38;5;250m [39mctx.shadowColor[38;5;250m [39m=[38;5;250m [39m[38;5;21m'#ff3333'[39m;
[38;5;250m [39mctx.shadowBlur[38;5;250m [39m=[38;5;250m [39m[38;5;21m15[39m;
[38;5;250m [39mctx.beginPath();
[38;5;250m [39mctx.arc(cx,[38;5;250m [39mcy,[38;5;250m [39m[38;5;21m10[39m,[38;5;250m [39m[38;5;21m0[39m,[38;5;250m [39mMath.PI[38;5;250m [39m*[38;5;250m [39m[38;5;21m2[39m);
[38;5;250m [39mctx.fill();
[38;5;250m [39mctx.shadowBlur[38;5;250m [39m=[38;5;250m [39m[38;5;21m0[39m;
[38;5;250m [39m}
[38;5;250m [39m}
[38;5;250m [39mrenderVisualizer();
[38;5;250m [39m[38;5;28;03m// UI Display Listeners[39;00m
[38;5;250m [39mdocument.getElementById([38;5;21m'scale'[39m).addEventListener([38;5;21m'change'[39m,[38;5;250m [39m(e)[38;5;250m [39m=>[38;5;250m [39m{
[38;5;250m [39mdocument.getElementById([38;5;21m'disp-scale'[39m).innerText[38;5;250m [39m=[38;5;250m [39m[38;5;21m`[39m[38;5;21mSKALA: [39m[38;5;21m${[39me.target.options[e.target.selectedIndex].text.toUpperCase()[38;5;21m}[39m[38;5;21m`[39m;
[38;5;250m [39m});
[38;5;250m [39mdocument.getElementById([38;5;21m'preset'[39m).addEventListener([38;5;21m'change'[39m,[38;5;250m [39m(e)[38;5;250m [39m=>[38;5;250m [39m{
[38;5;250m [39mdocument.getElementById([38;5;21m'disp-preset'[39m).innerText[38;5;250m [39m=[38;5;250m [39m[38;5;21m`[39m[38;5;21mSYNTH: [39m[38;5;21m${[39me.target.options[e.target.selectedIndex].text.toUpperCase()[38;5;21m}[39m[38;5;21m`[39m;
[38;5;250m [39m[38;5;18;01mif[39;00m[38;5;250m [39m(mainOsc)[38;5;250m [39m{[38;5;250m [39mstopSynth();[38;5;250m [39mstartSynth();[38;5;250m [39m}
[38;5;250m [39m});
[38;5;250m [39mdocument.getElementById([38;5;21m'beat-pattern'[39m).addEventListener([38;5;21m'change'[39m,[38;5;250m [39m(e)[38;5;250m [39m=>[38;5;250m [39m{
[38;5;250m [39mdocument.getElementById([38;5;21m'disp-pattern'[39m).innerText[38;5;250m [39m=[38;5;250m [39m[38;5;21m`[39m[38;5;21mBEAT: [39m[38;5;21m${[39me.target.options[e.target.selectedIndex].text.toUpperCase()[38;5;21m}[39m[38;5;21m`[39m;
[38;5;250m [39m});
[38;5;250m [39mdocument.getElementById([38;5;21m'bpm'[39m).addEventListener([38;5;21m'change'[39m,[38;5;250m [39m(e)[38;5;250m [39m=>[38;5;250m [39m{
[38;5;250m [39mdocument.getElementById([38;5;21m'disp-bpm'[39m).innerText[38;5;250m [39m=[38;5;250m [39m[38;5;21m`[39m[38;5;21m${[39me.target.value[38;5;21m}[39m[38;5;21m BPM[39m[38;5;21m`[39m;
[38;5;250m [39m});
[38;5;18;01mscript[39;00m>
[38;5;18;01mbody[39;00m>
[38;5;18;01mhtml[39;00m>