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