// script: js W=240;H=136;SZ=W*H;MW=W/2;MH=H/2; PALETTE=0x3fc0;SCREEN=0x0000;HOFFSET=0x3ff9;abs=Math.abs;floor=Math.floor;max=Math.max;min=Math.min;sin=Math.sin;cos=Math.cos;rnd=Math.random;pow=Math.pow;sqrt=Math.sqrt;pi=Math.PI;tau=pi*2;function lerp(a,b,t){return a+(b-a)*t};function lin(sx,ex,sy,ey,t,cl=false){if (cl) {t=clamp(sx,ex,t);};return lerp(sy,ey,(t-sx)/(ex-sx))};function uf(a,b){return lerp(a,b,rnd())};function ri(mn,mx){return mn+floor(rnd()*(mx-mn+1))};function clamp(mn,mx,t){return max(min(mx,t),mn)};function ss(x){x=clamp(0,1,x);return x*x*(3.0-2.0*x)};function range(n){return Array.from(Array(n)).map((_,i)=>i)};function hsv2rgb(h,s,v){var h=(h%360); if (h<0){h=(h+360)%360;} let c=v*s; let x=c*(1-abs(((h/60)%2)-1)); let m=v-c; let [r,g,b]=[0,0,0]; if (h<60){[r,g]=[c,x];} else if (h<120){[r,g]=[x,c];} else if (h<180){[g,b]=[c,x];} else if (h<240){[g,b]=[x,c];} else if (h<300){[r,b]=[x,c];} else {[r,b]=[c,x];} return [r,g,b].map((x)=>(x+m)*255|0);};function pick(...vs){return vs[ri(0,vs.length-1)];};function hash(i){var s=floor(i);/*var s=i*747796405+2891336453;*/var w=((s>>((s>>28)+4))^s)*277803737;return (w>>22)^w;}; function viz_track(s=20,cl=false){vbank(1);if(cl){cls();};pix(0,0,11);pix(s,0,11);line(0,1,s*2,1,0);line(0,2,s*2,2,0);pix(le*s,1,12);pix(he*s,2,13);vbank(0);} he=0 le=0 /* Finkel's Prelude: min,max,abs,floor,pow,sin,cos,rnd pi,tau,sqrt,hash lerp,lin,uf,ri,clamp,ss,range,hsv2rgb pick */ function track(){ damp=clamp(0,1,time()/1000) le=max(le,fft(2,4)*0.8*damp) le*=0.9 le=max(0,le-0.3) he=max(he,fft(200,250)*1.5*damp) he*=0.85 } function BOOT(){ cls(0) } buf=Array(SZ) function TIC(){ t=time()/1000 track() vbank(0) s=lin(-1,1,5,9,sin(t+le*rnd()*5)) cstack(0,0,s) if(he>0.7){ l=floor(uf(2000,SZ/2)) st=uf(0,SZ-l) for(i=st;i0.002){ poke4(i,v) } } c=lin(0,1,0,2,le) for(i=0;i1.1 a=a?pick(true,false):false range(16).flatMap(i=>{ if(i==0){ return hsv2rgb(t,1,0.2) } off=0 if(le>0.6){ off=pick(0,0,0,180) } x=i/15 return hsv2rgb( t+rnd()*200+off, lerp(0.3,1,x), 1, ) }).forEach((c,i)=>{ poke(PALETTE+i,a?255-c:c) }) } function BDR(){ if(rnd()>lin(0,1,1,0.9,he,true)){ make_pal() } if(rnd()>lin(0,1,1,0.97,le,true)){ poke(HOFFSET,uf(-1,1)*he*15) } }