memoscan
← all memos

Memo 0x42a870d6…a50ed3 on Ethereum

let av_data=[],av_data_old=[],fps=20,spf=0,spf0=0,spfChord=23,spfChord0=0,fades_a_flag=!0,fades_b_flag=!0,chordPerSec=0,fpsArray=Array(20).fill(fps);urlP("hash")&&66==urlP("hash").length&&(tokenData.hash=urlP("hash"));class Random{constructor(){this.useA=!1;let e=function(e){let n=parseInt(e.substr(0,8),16),t=parseInt(e.substr(8,8),16),a=parseInt(e.substr(16,8),16),o=parseInt(e.substr(24,8),16);return function(){n|=0,t|=0,a|=0,o|=0;let e=(n+t|0)+o|0;return o=o+1|0,n=t^t>>>9,t=a+(a<<3)|0,a=a<<21|a>>>11,a=a+e|0,(e>>>0)/4294967296}};this.prngA=new e(tokenData.hash.substr(2,32)),this.prngB=new e(tokenData.hash.substr(34,32));for(let e=0;e<1e6;e+=2)this.prngA(),this.prngB()}random_dec(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}random_num(e,n){return e+(n-e)*this.random_dec()}random_int(e,n){return Math.floor(this.random_num(e,n+1))}random_bool(e){return this.random_dec()<e}random_choice(e){return e[this.random_int(0,e.length-1)]}jitter(e,n){return R.random_num(e-n,e+n)}}let R=new Random,audioRandSeed=R.random_dec();const PARAMS={rotation_mult:.25,positive_space_amt:5,uTCM:0,fadeA:1,fadeB:1,zoomA:1.2,zoomB:.9,colorize:!0,paused:!1};let colorize=PARAMS.colorize,paused=PARAMS.paused;const cnv_scale=2;let show_gui=!0,zIndex="-99",prev_dim={};const average=e=>e.reduce(((e,n)=>e+n))/e.length;function titleCase(e){e=e.toLowerCase().split(" ");for(let n=0;n<e.length;n++)e[n]=e[n].charAt(0).toUpperCase()+e[n].slice(1);return e.join(" ")}function urlP(e){return urlParams=new URLSearchParams(window.location.search),urlParams.get(e)?titleCase(urlParams.get(e)):""}function rco(e){let n=[];return e.forEach(((e,t)=>{for(let t=0;t<e.w;t++)n.push(e)})),R.random_choice(n)}function shuffle(e){for(let n=e.length-1;n>0;n--){const t=Math.floor(R.random_dec()*(n+1));[e[n],e[t]]=[e[t],e[n]]}}function gj(e,n,t=!1){let a=e.filter((({n:e})=>e==n));return t?(a=a.map((({v:e})=>e)),[...a]):a[0]}function hexRgb(e){let n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return n?{r:parseInt(n[1],16),g:parseInt(n[2],16),b:parseInt(n[3],16)}:null}function hexV3(e){let n,t=/^\#([A-Fa-f\d]+)$/.exec(e)[1];return 3===t.length?n=[parseInt(t[0]+t[0],16)/255,parseInt(t[1]+t[1],16)/255,parseInt(t[2]+t[2],16)/255]:6===t.length&&(n=[parseInt(t[0]+t[1],16)/255,parseInt(t[2]+t[3],16)/255,parseInt(t[4]+t[5],16)/255]),n}function lerpHex(e,n,t){let a=+e.replace("#","0x"),o=a>>16,r=a>>8&255,i=255&a,u=+n.replace("#","0x");return"#"+((1<<24)+(o+t*((u>>16)-o)<<16)+(r+t*((u>>8&255)-r)<<8)+(i+t*((255&u)-i))|0).toString(16).slice(1)}function hex3to6(e){return"#"!=e[0]&&(e="#"+e),e.length>=7?e:e=e.split("").map((e=>"#"==e?e:e+e)).join("")}function lerp(e,n,t){return e*(1-t)+n*t}function mapRng(e,n,t,a,o){return(e-n)/(t-n)*(o-a)+a}function getDate(e=!1){let n=(new Date).toLocaleString("en-US",{timeZone:"America/Los_Angeles"}),t=new Date(n).getDay(),a=n.split("/");return e?t:a[0]+a[1]}function getDim(){let e={};return e.w_scaled_small=window.innerWidth,e.h_scaled_small=window.innerHeight,e.min_scaled_small=Math.min(e.w_scaled_small,e.h_scaled_small),e.w=e.w_scaled_small*cnv_scale,e.h=e.h_scaled_small*cnv_scale,urlP("dl")&&(console.log("Rendering in HD..."),e.w=5700,e.h=5700),e.min=Math.min(e.w,e.h),e.max=Math.max(e.w,e.h),e}function resize(){dim=getDim(),cnv.width=dim.w,cnv.height=dim.h,cnv.style.width=dim.w_scaled_small+"px",cnv.style.height=dim.h_scaled_small+"px",prev_dim=dim,gl.viewport(0,0,dim.w,dim.h),document.body.style.backgroundColor="#000000"}function keyup(e){"p"==e.key?(paused=!paused,setTimeout((e=>requestAnimationFrame(render)),p.ms.v)):"r"==e.key?location.reload():"s"==e.key?download():"g"==e.key?paused=!1:"c"==e.key?(paused=!1,p.ms=gj(pp.ms,"Conceptual")):"m"==e.key&&(paused=!1,p.ms=gj(pp.ms,"Meditative"))}function download(){let e=document.createElement("a");fn=`passages_${get_timestamp()}_${tokenData.hash}.png`,e.download=fn,e.href=cnv.toDataURL("image/png"),console.log(`Downloading ${fn}`),e.click()}function get_timestamp(){return(new Date).toISOString().replace(/[^T0-9]/g,"").replace("T","_")}function createTex(e,n=!1){const t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),n=n?e.CLAMP_TO_EDGE:e.REPEAT,e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,n),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,n),e.pixelStorei(e.UNPACK_ALIGNMENT,1),t}function nearestPowOf2(e){return e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,(e|=e>>32)-(e>>1)}function loadSvg(e,n){let t=new Image;return t.src="data:image/svg+xml, "+encodeURIComponent(e),t.width=dim.w,t.height=dim.h,t.onload=n,t}function loadSvgs(e,n){let t=[],a=e.length,o=()=>{--a,0===a&&n(t)};for(let n=0;n<a;n++){let a=loadSvg(e[n],o);t.push(a)}}function setupShader(e,n,t,a){if(shader=n.createShader(n.VERTEX_SHADER),n.shaderSource(shader,t),n.compileShader(shader),n.attachShader(e,shader),shader=n.createShader(n.FRAGMENT_SHADER),n.shaderSource(shader,a),n.compileShader(shader),n.attachShader(e,shader),n.linkProgram(e),!n.getProgramParameter(e,n.LINK_STATUS))throw new Error(n.getProgramInfoLog(e));n.useProgram(e);const o=n.getAttribLocation(e,"aPosition"),r=n.getAttribLocation(e,"aTexCoord"),i=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,i),n.bufferData(n.ARRAY_BUFFER,Float32Array.of(0,1,0,0,1,1,1,0),n.STATIC_DRAW);const u=n.createBuffer();return n.bindBuffer(n.ARRAY_BUFFER,u),n.bufferData(n.ARRAY_BUFFER,Float32Array.of(0,1,0,0,1,1,1,0),n.STATIC_DRAW),n.useProgram(e),n.enableVertexAttribArray(o),n.bindBuffer(n.ARRAY_BUFFER,i),n.vertexAttribPointer(o,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(r),n.bindBuffer(n.ARRAY_BUFFER,u),n.vertexAttribPointer(r,2,n.FLOAT,!1,0,0),e}function getPalRgb(e,n,t,a=50,o=cw){let r=[],i=[];for(let t=0;t<e.length-1;t++){numSteps=n[t];for(let n=0;n<numSteps;n++)r.push(lerpHex(e[t],e[t+1],n/numSteps))}r=r.slice(0,333);for(let e=0;e<a;e++)r.push(o);numSteps=5;for(let e=0;e<numSteps;e++)r.push(lerpHex(r[r.length-1],r[0],e/numSteps));return i=[],r.forEach((e=>{cRgb=hexRgb(e),i.push(cRgb.r,cRgb.g,cRgb.b)})),[e,i]}function svgElement(e,n){obj_string="";for(const[e,t]of Object.entries(n))obj_string+=` ${e}="${t}"`;return`<${e} ${obj_string}/>`}function easeOut(e,n,t,a){return-t/2*(Math.cos(Math.PI*e/a)-1)+n}function rT(e,n=5){return parseFloat(e.toFixed(n))}let cw="#F2F3EE",cb="#222222",zephyrPal=["#4E6E61","#365","#4C3F5D","#336","#358","#CCC","#45A","#576","#5493B6","#7AC","#89292D","#87A","#8F3935","#A33","#B8513B","#B78","#C54","#C95","#D57C30","#D94","#DA9","#C99","#DEC254"],palette=[{w:2,n:"Riley",v:["#E8E2D6","#656463","#333","#111","#F3F3EF","#000",cw,cb]},{w:5,n:"Front Row",v:["#336","#5493B6","#89292D","#87A",cw,cb]},{w:3,n:"Halo",v:["#0D4D62","#073542","#12485D","#1C5E78","#175166","#113C4A","#122F3C","#194455","#1F4A5E","#2D3D49","#292E35","#33323C","#413F49","#474651","#666370","#69646F","#443234","#604F54","#5E4849","#5F4244","#83656B","#92747A","#815F62","#6D4544","#815354","#AF7477","#9E5D5D","#BA6D6C","#D18688","#D97472","#E36B67","#C76C67","#F3ACA9","#EFA9A9","#FAC5C8","#E4B5B6","#E6C6C3","#FAECEC","#D9C9C0","#F6F2ED"]},{w:7,n:"Liquid Dusk",v:["#F6DAA8","#B68662","#230D00","#B68662","#BF8C61","#C88F5A","#D19559","#D39959","#D69B55","#E8A557","#EFA953","#E3A64B","#E5BA5C","#EFD171","#E6C96D","#E8CE81","#EBDDAC","#E9E7CE","#ECE3E4","#E4E5E9","#E6E7E1","#F5E3BD","#E7BC6E","#BD7E1F","#B36F1C","#995317","#7F3B0E","#7F4017","#86522A","#895F35","#F2F3EE","#926B40","#A2774C","#BF9469","#9C7347","#784F31","#6A4027","#643A24","#6C4633","#5D3C2B","#2C1609","#F2F3EE","#6D452C","#8E5D35","#B47F49","#D09E61","#DDB67B","#F6DAA8","#D7C499","#E5C384","#BF9D5E","#F2F3EE","#F2F3EE"]},{w:6,n:"Darkness",v:["#111","#656463",cb,"#333",cb,"#000","#454443",cb,"#000","#656463","#313035"]},{w:8,n:"Oracle",v:["#000",R.random_choice(zephyrPal),cb,cw,cb,cw]},{w:5,n:"Young Again",v:["#a36aa5","#006eb8","#fcb315","#e31f26",cw,cb]},{w:1,n:"Squidgit",v:["#7a4456","#c2ae93","#c27544","#762c19",cw,cb]},{w:1,n:"BB",v:["#12354e","#c2ae93","#bb7125","#eea78c",cw,cb]},{w:6,n:"Zephyr",v:[...zephyrPal,cw,cw,cb]},{w:5,n:"Moonpool",v:["#9DADC6","#F2F3EE","#F2F3EE","#6E8FB0","#758EAD","#8495AF","#79859D","#8B97AF","#9DADC6","#F2F3EE","#5D718C","#6D7E98","#7989A2","#8999B2","#8A9BB7","#8099B7","#446584","#42698A","#3C6787","#537696","#F2F3EE","#626169","#F2F3EE","#587794","#496783","#445E79","#4D657F","#5E748C","#72849A","#788596","#394050","#00010F","#71788A","#525F72","#0E1D34","#08172E","#485367","#636B7E","#5A7995","#F2F3EE","#2E4863","#34455F","#1F2B45","#34405A","#687892","#73839D","#1C2A44","#434D66","#5F6680","#1E2841","#F2F3EE","#626169","#4D5973","#606F84","#3E4A5A","#00000B","#626169","#6C809B","#4E627D","#F2F3EE","#F2F3EE"]},{w:1,n:"Dimension",v:["#82FBFF","#83FCF5","#CF77D0","#B376BF","#CA5D94","#A1386D","#BA6775","#C49A9C","#A2B4B1","#42352E","#000000","#3A1C2E","#2D1019","#3F2329","#322200","#653E48","#9C0078","#B7A0A5","#CAB274","#D4EDA6","#80EBFF","#00D7FF","#A7FFF4","#D8D54A","#C1AB5E","#AEC48E","#8AA1B8","#9A408A","#405059","#3C4D47","#280000","#3B3733","#717368","#394B46","#1B2D1E","#0A110D","#231D16","#231D10","#221920","#272027"]},{w:5,n:"Ceremony",v:["#BA3813","#BD3B15","#BE3E16","#C24418","#C94C1A","#BD491A","#BB541D","#CE6924","#D6842E","#CF9637","#E1B93D","#EBCC40","#E9D13F","#89AF54","#7FAE5D","#5E8C56","#599168","#46755B","#40766A","#3D7A72","#356F6F","#2D6167","#26494F","#23444D","#275A6D","#27576D","#224C60","#203945","#203C49","#244A5B","#254755","#2B4954","#2B454B","#314749","#2B3433","#303531","#3F433E","#3F4038","#413E34","#473E32","#4A3E2F","#524131","#3A2B1C"]},{w:7,n:"Laraaji",v:["#F36C32","#D26C62","#D26D62","#DB796A","#D67669","#D56C5C","#D690A4","#DAA6C5","#C98A90","#B9735F","#B4705E","#D37967","#CD7665","#F8DDB1","#F6B692","#F3A684","#F39879","#F6BC93","#F0B385","#F6CAB6","#FADBE0","#F9D5D8","#F5A598","#F49073","#F59980","#EF7E6A","#F28A73","#EF7B69","#F48872","#F3896F","#EF7A67","#F39078","#EF8A75","#D65A59","#F1692E","#F4723B","#D86038","#832110","#DC5525","#F3672C","#F2692E","#F36C32","#F13921","#EE3822","#F03620","#E95127","#D54723","#F34B23","#F1622B","#F36D31","#F3692D","#D65A59"]},{w:5,n:"Awake",v:["#D79837","#D7892E","#CD7D4E","#CD9C83","#455FAF","#0F5AB0","#C9AE98","#E3A336","#DB8F34","#D1946B","#606EAC","#677BB4","#DBAF79","#E7B33D","#E4B266","#9892AF","#A39CA7","#F1E2AA","#E3F2F8",cw,"#EAE3BA",cw,"#E4A336","#DC9542","#E8C870","#EFD97F","#EDC64D","#B85626","#B55229","#C6742E","#C06E4F","#A56633","#CE9055","#D49349","#E4B43B","#B6522C","#C05D26","#C76D26","#C06E44","#C26D38","#CE7F30","#CD843B","#BC6B3E","#BC441B","#B9411D","#A24033","#874B5F","#736295","#4E64B4","#2D60C6","#1857BB","#2055B0"]},{w:5,n:"Stonesteps",v:["#675C7E","#3D7ECD","#3661AD","#13459A","#415AA6","#7A86C5","#6175B6","#5F72BB","#7B90D1","#A2AEDF","#6A759D","#675C7E","#78688E","#6F75A2",cb,"#766285","#835A78","#9C6982","#B1B3D6","#979BC8","#8B82B1","#9674A3","#997092","#9A7384","#A67C7B","#B38A7A","#BB9577","#B7B28B","#9EC9CB","#ABD4E3","#edefe2","#96C0B7","#C0AD84","#BA937A","#AF827E","#A9787B","#A68396","#AB96B2","#BEB4CB","#A995AE","#7868A6","#8B5E82","#2F70B1","#4F4D87","#5A5695","#28428F","#7D7BAB","#8E9DCD","#788ECE","#647CBF","#4261AE","#3D6ABC","#4D73C3","#2F5BB4","#1F50AC","#406DB7","#6B91D5","#3A56AA"]},{w:4,n:"Halcyon",v:["#3F2D39","#9A95A0","#756485","#B6A5C8","#9B85A2","#835061","#C58FAD","#BC849E","#883E3F","#BD636E","#CF707D","#703946","#8C495C","#B9627D","#683D4D","#7F4364","#3F2D39","#5E3750","#252830","#4A354F","#3A2D3E","#1E231D","#242525","#222523","#222423","#212322","#212322","#212322","#9C4E47","#4E282B","#B26A53","#CE7C5D","#884331","#9A605B","#C48A8C","#A06B6A","#714A4F","#A88DB1","#A38AAE","#594662","#B1A9B4"]}],pp={path:[{w:77,n:"Inner",v:!1},{w:15,n:"Earth",v:!1},{w:7,n:"Earth & Sky",v:!0}],ms:[{w:0,n:"Conceptual",v:120},{w:1,n:"Meditative",v:15}],shadow:[{w:18,n:"Sealed",v:!0},{w:1,n:"Open",v:!1}],song:[{w:5,n:"Pathway",v:0},{w:5,n:"Plane",v:1},{w:5,n:"Beyond",v:2},{w:5,n:"Positive Space",v:3},{w:5,n:"Corridor",v:4},{w:5,n:"Flux",v:5},{w:0,n:"Expand",v:6}],chords:[{w:5,n:"I iii IV ii V",v:0},{w:5,n:"ii IV iii IV i",v:1},{w:5,n:"I IV V I V",v:2},{w:5,n:"vi I iii ii I",v:3},{w:5,n:"I IV V I I",v:4},{w:5,n:"vi vi IV iii I",v:5},{w:5,n:"vi I vi ii I",v:6},{w:5,n:"ii iii V vi I",v:7},{w:5,n:"ii V I ii IV",v:8},{w:5,n:"V V I I iii",v:9},{w:5,n:"I ii ii I vi",v:10},{w:1,n:"I ii V vi vii°",v:11}],cRep:[{w:1,n:"Few",v:5},{w:1,n:"Some",v:7},{w:1,n:"Many",v:9}],gtick:[{w:1,n:"True",v:!0},{w:100,n:"False",v:!1}],midnighttick:[{w:1,n:"True",v:!0},{w:100,n:"False",v:!1}],aspectMult:[{w:0,n:"Firefox",v:["uv.xy","uv.xy"]},{w:0,n:"Regular",v:["uv.x","uv.y"]}],prophecy:[{w:1,n:"Chosen",v:"Untold"}],pal:palette},p={};for(let e in pp)p[e]=rco(pp[e]);p.gtick.v&&(p.shadow=gj(pp.shadow,"Open"),p.pal=gj(pp.pal,"Liquid Dusk")),p.midnighttick.v&&(p.shadow=gj(pp.shadow,"Open"),p.pal=gj(pp.pal,"Darkness")),11==p.chords.v&&(p.song=gj(pp.song,"Expand"));for(let e=0;e<p.pal.v.length;e++)p.pal.v[e]=hex3to6(p.pal.v[e]);pal=p.pal.v,palRand=[];for(let e=0;e<p.cRep.v;e++)palRand=palRand.concat(pal);let pal_steps=[];if(palRand.forEach((e=>{pal_steps.push(2*R.random_dec()+1)})),"Oracle"==p.pal.n){let e=gj(pp.pal,"Oracle");e=e.v[1],p.prophecy.v=e.replace("#","")}"Inner"==p.path.n?p.path.a=0:p.path.a=.18;for(let e=0;e<p.pal.v.length;e++)p.pal.v[e]=hex3to6(p.pal.v[e]);console.table(p),-1!=navigator.userAgent.indexOf("Firefox")?p.aspectMult=gj(pp.aspectMult,"Firefox"):p.aspectMult=gj(pp.aspectMult,"Regular");let cnv,dim=getDim();console.log(tokenData.hash);let frameCount=0,main_run_count=0,chordFrameCount=0,chordFrameCountLongA=0,chordFrameCountLongB=0,colorTriggerCount=0,colorCount=0,colorIdx=0,chordDuration=900,chordDurationLongA=400,chordDurationLongB=400,zooms_a=[1.2,1.4],zooms_b=[.9,.75],fades_a=[1,1],fades_b=[1,1],positive_space_amt_positions=[0,10];function svgTemplate(e,n=0){return zoomView=`viewBox="0 0 ${dim.max} ${dim.max}"`,blur_base=.003,fix_blur_clip='x="-50%" y="-50%" width="200%" height="200%"',`\n<svg xmlns="http://www.w3.org/2000/svg" width="${dim.max}" height="${dim.max}" \n${zoomView}\nstroke="black"\nfill="black"\nstroke-width="5"\n>\n\n<filter id="blurMultiple" ${fix_blur_clip}>\n<feGaussianBlur stdDeviation="${rT(dim.min*blur_base*n)}"/>\n</filter> \n\n\n\n<g filter="url(#blurMultiple)" >\n${e}\n</g>\n\n</svg>\n`}function svgEmpty(){return svgTemplate("")}function svgRays(e=5,n=.02,t=.3,a="white",o=!1,r=50,i=1,u=360,l=-dim.max,s=2*dim.max,m=!1,c=0,d=.44){dash=o?rT(Math.hypot(s-l,s-l)/r,5):"";let p=`\n<mask id="donut">\n<rect width="100%" height="100%" fill="black" />\n<circle r="${rT(dim.min*d)}" cx="${rT(dim.max/2)}" cy="${rT(dim.max/2,5)}" fill="white" />\n</mask>`;for(p+='<g mask="url(#donut)">',ray=svgElement("line",{id:"ray",x1:rT(l,5),y1:rT(l,5),x2:rT(s,5),y2:rT(s,5),"stroke-width":rT(dim.max*n,5),"stroke-opacity":t,stroke:a,"stroke-dasharray":dash}),p+=ray,idx=1;idx<e;idx++)p+=`<use href="#ray" transform="rotate(${rT(idx/e*u)}, ${rT(dim.max/2,5)}, ${rT(dim.max/2)})"/>`,m&&(p+=`<use href="#ray" transform="rotate(${180+rT(idx/e*u)}, ${rT(dim.max/2,5)}, ${rT(dim.max/2)})"/>`);return p+="</g>",svgTemplate(p,i)}function svgRayDonut(e=20,n=360,t=20,a=.1,o=.05,r=.1,i="white",u=1,l=.15,s=.4,m=!1,c=!1,d=!1){let p=`\n<mask id="donut">\n<rect width="100%" height="100%" fill="black" />\n<circle r="${rT(dim.min*s)}" cx="${rT(dim.max/2)}" cy="${rT(dim.max/2,5)}" fill="white" />\n</mask>`;for(p+='<g mask="url(#donut)">',c&&(p+=svgElement("rect",{width:"100%",height:"100%",fill:"black","fill-opacity":1})),p+='<g id="ray" >',idx=0;idx<t;idx++)ray=svgElement("line",{x1:rT(dim.max/2-dim.min*a,5),y1:rT(dim.max/2+dim.min*idx/t,5),x2:rT(dim.max/2+dim.min*a,5),y2:rT(dim.max/2+dim.min*idx/t,5),"stroke-width":rT(dim.min*o,5),"stroke-opacity":r,stroke:i}),p+=ray;for(p+="</g>",idx=1;idx<e;idx++)p+=`<use href="#ray" transform="rotate(${rT(idx/e*n)}, ${rT(.5*dim.max)}, ${rT(.5*dim.max)})"/>`;return d&&(p+=svgElement("rect",{width:"100%",height:"100%",fill:"red","fill-opacity":.2})),p+="</g>",m&&(p+=`<radialGradient id="radial${l}" >\n<stop offset="80%" stop-color="#ff000000" />\n<stop offset="100%" stop-color="#ff0000c0" />\n</radialGradient>`,obj={cx:rT(dim.max/2,5),cy:rT(dim.max/2,5),r:rT(dim.min*s,5),stroke:"none",fill:`url('#radial${l}')`,"fill-opacity":1,transform:`rotate(${rT(R.random_num(0,360))}, ${rT(dim.max/2)}, ${rT(dim.max/2)})`},p+=svgElement("circle",obj)),svgTemplate(p,u)}function main(){let e=R.random_choice([[R.random_num(.15,.25),R.random_num(.18,.3),.46]]);raycountAB=2*Math.round(R.random_num(15,35)/2),raycountCD=2*Math.round(R.random_num(20,35)/2),raycountEF=2*Math.round(R.random_num(25,40)/2),numlinesAB=Math.round(R.random_num(5,40)),numlinesCD=Math.round(R.random_num(5,40)),numlinesEF=Math.round(R.random_num(40,40)),widthmultAB=R.random_num(.1,.4),widthmultCD=R.random_num(.2,.5),widthmultEF=R.random_num(.3,.5),strokemultAB=R.random_num(.01,.02),strokemultCD=R.random_num(.01,.028),strokemultEF=R.random_num(.01,.022),svgsTxt=[svgRayDonut(rayCount=raycountAB,degrees=360,num_lines=numlinesAB,widthMult=widthmultAB,strokeMult=strokemultAB,opacity=.1,color="white",blur_amount=1,cutA=-.05,cutB=e[0],shadow=p.shadow.v,bg=!0),svgRayDonut(rayCount=raycountCD,degrees=360,num_lines=numlinesCD,widthMult=widthmultCD,strokeMult=strokemultCD,opacity=.1,color="white",blur_amount=.8,cutA=e[0],cutB=e[1],shadow=p.shadow.v,bg=!0),svgRayDonut(rayCount=raycountEF,degrees=360,num_lines=numlinesEF,widthMult=widthmultEF,strokeMult=strokemultEF,opacity=.1,color="white",blur_amount=1,cutA=e[1],cutB=e[2],shadow=p.shadow.v,bg=!0),svgRayDonut(rayCount=1.5*raycountEF,degrees=360,num_lines=.5*numlinesEF,widthMult=1.2*widthmultEF,strokeMult=strokemultEF,opacity=.12,color="red",blur_amount=1.5,cutA=e[2],cutB=2,bg=!0),svgRayDonut(rayCount=1.5*raycountEF,degrees=360,num_lines=.5*numlinesEF,widthMult=2.1*widthmultEF,strokeMult=1.1*strokemultEF,opacity=.1,color="white",blur_amount=1,cutA=e[2],cutB=2),svgRays(rayCount=Math.round(R.random_num(25,40)),strokeMult=R.random_num(.02,.05),opacity=p.path.a,color="white",dashed=!0,dash_count=R.random_num(80,120),blur_amount=Math.round(R.random_num(1,1.8)),degrees=92.5,start_point=0*dim.max,end_point=.48*dim.max,double=p.path.v),svgEmpty(),svgEmpty(),svgEmpty(),svgEmpty(),svgEmpty(),svgEmpty(),svgEmpty(),svgEmpty(),svgEmpty(),svgEmpty()],loadSvgs(svgsTxt,getProgram),console.log("primary color:",p.pal.v[0])}[p.pal.v,palRgb]=getPalRgb(palRand,pal_steps,p.cRep.v,PARAMS.positive_space_amt),cnv=document.createElement("canvas"),cnv.id="artwork",gl=cnv.getContext("webgl",{antialias:!1,preserveDrawingBuffer:!0}),gl.getExtension("OES_standard_derivatives");let getProgram=e=>{const n=`\n#define PI 3.1415926538\n#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives : enable\n#endif\n\nprecision highp float; \nuniform vec2 uR;\nuniform float uT;\nuniform float uTCM;\nuniform float uFPS;\nuniform bool uColorize;\nuniform float uGuiA;\nuniform float uFadeA;\nuniform float uFadeB;\nuniform float uZoomA;\nuniform float uZoomB;\nuniform sampler2D texPal;\nuniform sampler2D texA;\nuniform sampler2D texB;\nuniform sampler2D texC;\nuniform sampler2D texD;\nuniform sampler2D texE;\nuniform sampler2D texF;\nuniform sampler2D texG;\nuniform sampler2D texH;\nvarying vec2 vTC;\n\nfloat uTC = mod(floor(uT * 60./uFPS), 6531.)/6531.+uTCM;\nfloat uTS = mod(floor(uT * 60./uFPS), 2000.)/2000.;\n\nfloat map(float val, float start1, float stop1, float start2, float stop2) {\nreturn ((val - start1) / (stop1 - start1)) * (stop2 - start2) + start2;\n}\n\nvec4 getSvg(vec2 uv, sampler2D tex) {\nvec4 tx = texture2D(tex, vec2(uv.x, uv.y));\nreturn tx;\n}\n\nvec3 colorize(vec2 uv, vec4 c) {\nvec4 cOut = c;\nfloat cBrightness = (c.r + c.g + c.b) / 3.;\nfloat d = distance(uv, vec2(.0));\n\nvec4 cMapped = texture2D(texPal, vec2(mod(cBrightness+uTC+${R.random_dec()+1e-4}, 1.)));\ncOut = mix(cMapped, vec4(.0), (c.r-c.b)*1.5);\n\nfloat colorizeThreshold = 0.12;\nif (cBrightness < colorizeThreshold) {\ncOut = vec4(.1,.1,.1,1.);\n}\n\n\nreturn vec3(cOut.r, cOut.g, cOut.b);\n}\n\nfloat quadraticInOut(float t) {\nfloat p = 2.0 * t * t;\nreturn t < 0.5 ? p : -p + (4.0 * t) - 1.0;\n}\n\nvec2 zoomCos(vec2 uv, float amp, float phase_offset, float speed) {\nreturn uv * (amp*cos(speed*2.*PI+2.*PI*phase_offset)+1.);\n}\n\nmat2 rot(float a){\na *= 2.*PI;\nreturn mat2(cos(a), -sin(a), sin(a), cos(a));\n}\n\nvec2 rotate(vec2 uv, float amp, float phase_offset, float speed) {\nreturn uv * rot(amp*sin(speed*2.*PI+2.*PI*phase_offset));\n}\n\nvec2 translate(vec2 uv, float amp, float phase_offset, float speed) {\nreturn uv + amp*sin(speed*2.*PI+2.*PI*phase_offset);\n}\n\nvec3 draw(vec2 uv) {\nvec3 c = vec3(0.);\nvec4 cOut = vec4(0., 0., 0., 1.);\n\nvec2 point5 = vec2(0.5);\n\nfloat aspect = uR.x/uR.y;\nif (aspect < 1.) {\n${p.aspectMult.v[0]} *= aspect;\n} else {\n${p.aspectMult.v[1]} *= 1./aspect;\n}\n\nvec2 uvTemp = uv;\nuv *= uZoomA;\nfloat amp = ${R.random_num(.002,.015)};\nfloat phase = ${R.random_dec()}; \nuv = rotate(uv, amp, phase, -uTS);\nvec4 cA = getSvg(uv+.5, texA);\n\nuv = uvTemp;\nuv *= uZoomB;\namp = ${R.random_num(.002,.015)};\nphase = ${R.random_dec()}; \nuv = rotate(uv, amp, phase, -uTS);\nvec4 cB = getSvg(uv+.5, texB);\n\nuv = uvTemp;\namp = ${R.random_num(.002,.015)};\nphase = ${R.random_dec()}; \nuv = rotate(uv, amp, phase, -uTS);\nvec4 cC = getSvg(uv+.5, texC);\n\nuv = uvTemp;\namp = ${R.random_num(.001,.002)};\nphase = ${R.random_dec()}; \nuv = rotate(uv, amp, phase, -uTS);\nvec4 cD = getSvg(uv+.5, texD); \n\nuv = uvTemp;\nuv = rotate(uv, amp, phase, uTS);\nvec4 cE = getSvg(uv+.5, texE); \n\nuv = uvTemp;\nvec4 cF = getSvg(uv+.5, texF); \n\nuv = uvTemp;\namp = ${R.random_num(.001,.006)};\nphase = ${R.random_dec()}; \nuv = rotate(uv, amp, phase, -uTS);\nvec4 cG = getSvg(uv+.5, texG); \n\nuv = uvTemp;\nuv = rotate(uv, amp, phase, uTS);\nvec4 cH = getSvg(uv+.5, texH); \ncOut = mix(cOut, cE, mix(0., cE.a, 1.));\ncOut = mix(cOut, cD, mix(0., cD.a, 1.));\ncOut = mix(cOut, cC, mix(0., cC.a, 1.));\ncOut = mix(cOut, cB, mix(0., cB.a, uFadeB)); \ncOut = mix(cOut, cA, mix(0., cA.a, uFadeA));\n\ncOut = mix(cOut, cF, mix(0., cF.a, 1.));\n\nuv = uvTemp;\n\nc = vec3(cOut.r, cOut.g, cOut.b);\n\nif (uColorize){\nc = colorize(uv, vec4(c,1.));\n} \n\nreturn c;\n}\n\nvoid main() {\nvec2 uv = (gl_FragCoord.xy/uR.xy);\nuv -= .5;\n\nvec3 c = vec3(0.);\nc = draw(uv);\n\nconst vec2 H2=vec2(.5698402909980532,.7548776662466927);\nconst float aa=1.5, ns=8.;\nfloat ps=1./uR.y;\n\nfor(float i=0.;i<ns;i+=1.){\nvec2 d=fract(H2*i+.5)-.5;\nc += draw(uv+d*ps*aa);\n}\nc/=ns;\n\nvec4 col = vec4(c,1.);\n\ngl_FragColor = col;\n\n}\n`;let t=gl.createProgram();t=setupShader(t,gl,"\nprecision highp float;attribute vec2 aPosition;attribute vec2 aTexCoord;varying vec2 vTC;\nvoid main(){vTC=aTexCoord;vec4 p4=vec4(aPosition*2.-1.,0,1.);gl_Position=p4;}\n",n),colorMap=createTex(gl,clamp=!0),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,palRgb.length/3,1,0,gl.RGB,gl.UNSIGNED_BYTE,new Uint8Array(palRgb)),textures=[colorMap];for(let n=0;n<e.length;++n)svg=createTex(gl,clamp=!0),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,e[n]),textures.push(svg);for(let e=0;e<textures.length;e++)gl.activeTexture(gl.TEXTURE0+e),gl.bindTexture(gl.TEXTURE_2D,textures[e]);uR=gl.getUniformLocation(t,"uR"),uT=gl.getUniformLocation(t,"uT"),uTCM=gl.getUniformLocation(t,"uTCM"),uFPS=gl.getUniformLocation(t,"uFPS"),uGuiA=gl.getUniformLocation(t,"uGuiA"),uFadeA=gl.getUniformLocation(t,"uFadeA"),uFadeB=gl.getUniformLocation(t,"uFadeB"),uZoomA=gl.getUniformLocation(t,"uZoomA"),uZoomB=gl.getUniformLocation(t,"uZoomB"),uColorize=gl.getUniformLocation(t,"uColorize"),texPal=gl.getUniformLocation(t,"texPal"),texA=gl.getUniformLocation(t,"texA"),texB=gl.getUniformLocation(t,"texB"),texC=gl.getUniformLocation(t,"texC"),texD=gl.getUniformLocation(t,"texD"),texE=gl.getUniformLocation(t,"texE"),texF=gl.getUniformLocation(t,"texF"),texG=gl.getUniformLocation(t,"texG"),texH=gl.getUniformLocation(t,"texH"),gl.uniform1i(texPal,0),gl.uniform1i(texA,1),gl.uniform1i(texB,2),gl.uniform1i(texC,3),gl.uniform1i(texD,4),gl.uniform1i(texE,5),gl.uniform1i(texF,6),gl.uniform1i(texG,7),gl.uniform1i(texH,8),document.body.appendChild(cnv),addEventListener("keyup",keyup),addEventListener("resize",resize),resize(),render(),urlP("dl")&&(paused=!0,download())};function render(){0==av_data[0]&&av_data!=av_data_old&&av_data.length>0&&(fades_a_flag&&chordFrameCountLongA>=chordDurationLongA&&R.random_dec()<.7&&(PARAMS.fadeA<.5?(chordFrameCountLongA=0,chordDurationLongA=fades_a[0]==fades_a[1]?.8*chordDuration:chordDuration*R.random_int(2,4)*.8,fades_a=[0,1]):R.random_dec()<.3&&(chordFrameCountLongA=0,chordDurationLongA=fades_a[0]==fades_a[1]?.8*chordDuration:chordDuration*R.random_int(2,4)*.8,fades_a=[1,0])),fades_b_flag&&chordFrameCountLongB>=chordDurationLongB&&R.random_dec()<.7&&(PARAMS.fadeB<.5?(chordFrameCountLongB=0,chordDurationLongB=fades_b[0]==fades_b[1]?.8*chordDuration:chordDuration*R.random_int(2,4)*.8,fades_b=[0,1]):R.random_dec()<.3&&(chordFrameCountLongB=0,chordDurationLongB=fades_b[0]==fades_b[1]?.8*chordDuration:chordDuration*R.random_int(2,4)*.8,fades_b=[1,0])),colorTriggerCount%2==0?(zooms_a=[1.4,1.2],zooms_b=[.75,.9],positive_space_amt_positions=[0,10]):(zooms_a=[1.2,1.4],zooms_b=[.9,.75],positive_space_amt_positions=[0,10]),colorTriggerCount++,chordFrameCount=0),PARAMS.zoomA=easeOut(chordFrameCount,zooms_a[0],zooms_a[1]-zooms_a[0],chordDuration),PARAMS.zoomB=easeOut(chordFrameCount,zooms_b[0],zooms_b[1]-zooms_b[0],chordDuration),PARAMS.fadeA=easeOut(chordFrameCountLongA,fades_a[0],fades_a[1]-fades_a[0],chordDurationLongA),PARAMS.fadeB=easeOut(chordFrameCountLongB,fades_b[0],fades_b[1]-fades_b[0],chordDurationLongB),PARAMS.fadeC=easeOut(chordFrameCountLongB,fades_b[0],fades_b[1]-fades_b[0],chordDurationLongB),paused=PARAMS.paused,paused&&0!=frameCount||(gl.uniform2f(uR,dim.w,dim.h),gl.uniform1f(uT,frameCount),gl.uniform1f(uTCM,PARAMS.uTCM),gl.uniform1f(uFPS,fps),gl.uniform1f(uGuiA,PARAMS.rotation_mult),gl.uniform1f(uFadeA,PARAMS.fadeA),gl.uniform1f(uFadeB,PARAMS.fadeB),gl.uniform1f(uZoomA,PARAMS.zoomA),gl.uniform1f(uZoomB,PARAMS.zoomB),gl.uniform1f(uColorize,PARAMS.colorize),gl.drawArrays(gl.TRIANGLE_STRIP,0,4),[p.pal.v,palRgb]=getPalRgb(palRand,pal_steps,p.cRep.v,PARAMS.positive_space_amt),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,palRgb.length/3,1,0,gl.RGB,gl.UNSIGNED_BYTE,new Uint8Array(palRgb)),gl.bindTexture(gl.TEXTURE_2D,textures[0])),!paused&&av_data.length>0&&(av_data_old=av_data,setTimeout((e=>requestAnimationFrame((()=>{if(render(),frameCount<500){if(!spf0)return spf0=performance.now(),void(fps=30);performance.now()!=spf0&&(spf=(performance.now()-spf0)/1e3),spf0=performance.now(),fpsIdx=frameCount%500,fpsArray[fpsIdx]=1/spf,fps=average(fpsArray),chordDuration=Math.floor(.8*spfChord*fps)}}))),p.ms.v),chordFrameCount<=chordDuration&&av_data.length>0&&chordFrameCount++,chordFrameCountLongA<=chordDurationLongA&&av_data.length>0&&chordFrameCountLongA++,chordFrameCountLongB<=chordDurationLongB&&av_data.length>0&&chordFrameCountLongB++,frameCount++),0==frameCount&&(av_data=[R.random_num(0,1e3)])}