0x1d09…a0c1

All memos sent from and to 0x1d09…a0c1.

const i=[[0,0,2e3,2e3],[0,0,1326,2e3],[0,0,1999,2e3],[0,0,126,2e3],[0,0,2e3,83],[0,0,895,2e3],[0,0,875,2e3],[0,0,2e3,426],[0,0,2e3,1474],[0,0,2e3,1e3],[0,0,2e3,1574],[0,0,1478,2e3]],h=[[0,38,77,115,154,192,231,269,308,346,385,423,462,500,538,577,615,654,692,731,769,808,846,885,923,962],[0,140,256,360,360,360,442,535,593],[1083,0,0,0,0,0,916,916,916,916,916,916,916,916,916,916,916,916],[0,0,0,0,0,0,0,0,0,0,21],[0,50,233,367,433,633,667,1058,1550,1925],[0,0,79,79,79,79,79,184],[0,0,0,0,0,0,0,0,0,0,0,0],[0,410,820,852,1066,1098,1311,1525,1557,1590,1639,1918],[0,0,184,184,184,184,395,526,632,1053],[0,89,689],[0,43,128,128,426,468,553,553,787,787,915,957,1021,1021],[0,0,65,348]],m=[[0,38,77,115,154,192,231,269,308,346,385,423,462,500,538,577,615,654,692,731,769,808,846,885,923,962],[0,0,314,535,535,535,616,860,860],[0,0,400,800,1200,1600,0,167,333,500,667,833,1e3,1166,1333,1500,1666,1833],[0,0,0,0,0,0,284,453,505,526,579],[0,0,0,0,0,0,17,33,50,50],[0,237,421,789,1e3,1237,1237,1474],[0,100,150,150,200,275,325,400,450,525,525,525],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,105,105,158,211,447],[0,0,0],[0,0,85,128,319,319,426,489,574,617,681,681,745,787],[0,130,391,978]],y=[[2e3,1923,1846,1769,1692,1615,1538,1462,1385,1308,1231,1154,1077,1e3,923,846,769,692,615,538,462,385,308,231,154,77],[1326,1186,907,721,616,616,534,244,186],[916,916,916,916,916,916,167,167,167,167,167,167,167,167,167,167,167,167],[126,126,126,126,126,126,126,126,126,126,84],[2e3,1950,1767,1633,1567,1367,1333,942,450,75],[895,895,816,816,737,579,526,421],[875,650,450,400,400,350,300,250,175,125,50,50],[2e3,1590,1180,1148,934,902,689,475,443,410,361,33],[2e3,2e3,1737,1737,1737,1658,1447,1237,921,395],[2e3,1822,622],[2e3,1915,1447,1447,1e3,915,745,745,511,511,319,277,128,128],[1478,1413,1304,913]],g=[[2e3,1923,1846,1769,1692,1615,1538,1462,1385,1308,1231,1154,1077,1e3,923,846,769,692,615,538,462,385,308,231,154,77],[2e3,2e3,1465,1128,1128,1047,837,395,395],[2e3,1999,1599,1199,800,400,2e3,1833,1666,1500,1333,1166,1e3,833,667,500,333,167],[2e3,1895,1705,1242,895,863,558,337,285,211,63],[83,83,83,83,83,83,66,50,33,33],[2e3,1553,1368,1001,790,553,553,316],[2e3,1800,1750,1750,1700,1625,1575,1500,1450,1325,1325,50],[426,426,426,426,426,426,426,426,426,426,426,426],[1474,1395,1263,1211,1158,921,842,711,605,289],[1e3,1e3,1e3],[1574,1574,1383,1298,915,915,744,681,532,489,319,319,149,107],[2e3,1370,1109,522]],k=[["#f25600","#bdd8ff","#ff3e6c","#ffc2c2","#ff7381","#191aff","#ffe8cc","#758dff","#ffb899","#b6bdfc","#ffe2d9","#f66951","#ffa4dc","#80b5ff","#d6d2ff","#ff2d0a","#ffb9a8","#ff8e86","#ffdef2","#fff1ec","#fa5","#ffd2d2","#ff8db0","#ffc3d8","#ffe8dc","#ff0a95"],["#2d3742","#171d26","#d80077","#96c8e2","#d80077","#ff2610","#ff8500","#96c8e2","#ffb133"],["#ffce00","#009de2","#95c6d1","#00af7d","#f73400","#d80053","#009de2","#26727a","#1542ff","#0b3642","#f73400","#725b5b","#95c6d1","#121fb5","#00af7d","#725b5b","#95c6d1","#0b3642"],["#001cbe","#1b63cc","#2dbcd3","#3793ef","#cc2b00","#001cbe","#1b63cc","#009326","#1b63cc","#1b63cc","#f73e26"],["#0079d2","#74a1b6","#222f38","#f13900","#c0b6b1","#f13900","#ffcbcb","#f13900","#078112","#0037ff"],["#002356","#00359e","#101721","#f93500","#101721","#ffa300","#00751e","#00359e"],["#0b00a0","#004daa","#00a1c6","#00a1c6","#d80053","#0027ea","#ff3b6e","#004441","#007dc9","#ff3b6e","#ff9700","#ff6e00"],["#f9eded","#ffded7","#223d32","#ffc5e2","#ff7de3","#ffdec0","#e5c1e1","#ff99c7","#223d32","#e5c1e1","#dce1e5","#140f7c"],["#c9007d","#ffc5e6","#ff6e00","#ff6e00","#ff8aab","#f20085","#ff39da","#ffac12","#f30","#c9007d"],["#00438c","#e83100","#00438c"],["#e22000","#7abdcc","#e22000","#006349","#1fa000","#0084d1","#0084d1","#7abdcc","#e22000","#7abdcc","#e22000","#006349","#1fa000","#0084d1"],["#81aee2","#0041c4","#ff4133","#ffce00"]],t=tokenData.tokenId%1e3,e=document.createElement("canvas"),n=e.getContext("2d");n.imageSmoothingEnabled=!1;n.webkitImageSmoothingEnabled=!1;n.msImageSmoothingEnabled=!1;e.width=i[t][2]-i[t][0];e.height=i[t][3]-i[t][1];let l=1,s=1;function u(){e.style.display="block",e.style.position="absolute",e.style["max-width"]=window.innerWidth+"px",e.style["max-height"]=window.innerHeight+"px",e.style.padding="0",e.style.margin="auto",e.style.top="0",e.style.right="0",e.style.bottom="0",e.style.left="0";let f=i[t][2]-i[t][0],c=i[t][3]-i[t][1];c>f?(e.style.height="80%",e.style.width="auto"):c<f?(e.style.width="80%",e.style.height="auto"):f==c&&(e.style.width=`${Math.min(window.innerHeight,window.innerWidth)*.8}px`,e.style.height=`${Math.min(window.innerHeight,window.innerWidth)*.8}px`),window.requestAnimationFrame(()=>b(n,e,o))}window.addEventListener("resize",u,!0);document.querySelector("body").appendChild(e);let o=!1,a=1;u();function b(f,c,r){f.clearRect(0,0,c.width,c.height);for(let d=0;d<h[t].length;d++)f.save(),f.fillStyle=k[t][d],f.fillRect(h[t][d]*a/s,m[t][d]*a/l,y[t][d]*a/s,g[t][d]*a/l),f.restore(),r&&(f.save(),f.lineWidth=1*a,f.strokeStyle="black",f.strokeRect(h[t][d]*a/s,m[t][d]*a/l,y[t][d]*a/s,g[t][d]*a/l),f.restore())}b(n,e,o);document.addEventListener("keydown",function(f){f.key.toLowerCase()=="l"&&(o=!o,b(n,e,o)),f.key.toLowerCase()=="1"&&(a=1,w()),f.key.toLowerCase()=="2"&&(a=2,w()),f.key.toLowerCase()=="3"&&(a=3,w())});function w(){let f=i[t][2]-i[t][0],c=i[t][3]-i[t][1];e.width=f*a/s,e.height=c*a/l,b(n,e,o),L(e)}function L(f,c="image/png"){let r="portraits",d=document.createElement("a");d.setAttribute("download",`${r}.png`);let p=f.toDataURL(c).replace(/^data:image\/png/,"data:application/octet-stream");d.setAttribute("href",p),d.click()}
Portraits is a collection of mirrors that reinterprets what a portrait depicts. Each mirror is based on a name, a word, or a phrase that is algorithmically translated into nestling rectangles of color. Inviting dialogue with its viewers through imbued text, form, color, and fragmented reflections, each mirror is just as exact and slippery as the language used to create it.
Jeff Davis, inspired by Frank Lloyd Wright's stained glass and design principles, has embarked on a groundbreaking project called "Optimism." Growing up in the Chicago suburbs, Davis was influenced by the Prairie School aesthetic and Wright's simplicity, geometric structure, and proportion in residential architecture. Wright's concept of "optimistic tones" resonated deeply with Davis, leading him to believe that art can convey optimism and enrich the world through aesthetic experiences. An accomplished artist in generative art and painting, Jeff collaborates with TRAME and Atelier Loire to embark on a groundbreaking stained glass project in which he explores stained glass as a medium for creating colored light. The project combines generative scripts, NFT minting, and aluminum framework to represent the culmination of Davis's creative journey, blending tradition, technology, and creative innovation into a visionary artwork that expresses a brighter and more harmonious future.
let tokenId = tokenData.tokenId; tokenData = tokenData.hash let R, w, h, grid, u, margin; let heights, rows, rh, n, y, divider; let p1, p2, progression, peek; let c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, colors, alpha; let br, bx, by, bw, brh, bh, bshapes; function setup() { colorMode(HSB); R = new Random(); w = window.innerWidth; h = window.innerHeight; if (w / h > 9 / 17) { w = 9 / 17 * h; } else { h = 17 / 9 * w; } createCanvas(w, h); grid = 64; u = w / 36; margin = 2 * u; heights = [1, 2, 4, 8, 16]; rows = [1, 2, 4, 8]; n = 15; y = 0; bshapes = []; c1 = color(359, 100, 100); c2 = color(18, 100, 100); c3 = color(27, 100, 100); c4 = color(34, 100, 98); c5 = color(41, 99, 97); c6 = color(49, 99, 96); c7 = color(57, 99, 94); c8 = color(65, 99, 87); c9 = color(87, 87, 87); c10 = color(113, 77, 86); c11 = color(154, 100, 83); c12 = color(178, 100, 79); c13 = color(194, 100, 95); c14 = color(199, 95, 96); c15 = color(207, 91, 96); c16 = color(215, 87, 96); c17 = color(223, 82, 97); c18 = color(231, 77, 97); c19 = color(245, 80, 98); colors = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19]; p1 = R.random_int(0, colors.length - 1); p2 = R.random_int(0, colors.length - 1); while (Math.abs(p2 - p1) < 3 || Math.abs(p2 - p1) > 6) { p2 = R.random_int(0, colors.length - 1); } progression = []; alpha = [0.5, 0.25]; while (n < grid) { rh = heights[R.random_int(0, heights.length - 1)]; while (n + rh > grid) { rh = heights[R.random_int(0, heights.length - 1)]; } rows.push(rh); n = n + rh; } rows = scramble(rows); if (rows[0] !== 1 && rows[0] !== 2) { for (let i = 1; i < rows.length; i++) { if (rows[i] === 1 || rows[i] === 2) { let temp = rows[i]; rows.splice(i, 1); rows.unshift(temp); break; } } } for (let i = 0; i < rows.length; i++) { progression.push(Math.round(lerp(p1, p2, i / (rows.length - 1)))); } peek = R.random_int(1, rows.length - 2); while (rows[peek] > 15) { peek = R.random_int(1, rows.length - 2); } for (let i = 0; i < rows.length; i++) { br = i; bx = R.random_int(1, 16 / rows[br] - 2) * rows[br]; by = 0; for (let i = 0; i < br; i++) { by = rows[i] + by; } bw = rows[br]; brh = R.random_int(3, Math.min(Math.ceil(rows.length), rows.length - br)); bh = 0; for (let i = br; i < br + brh; i++) { bh = rows[i] + bh; } if (rows[i] < 4) { bshapes.push({ br: br, bx: bx, by: by, bw: bw, bh: bh }); } } if (bshapes[bshapes.length - 1].bh == null) { bshapes[bshapes.length - 1].bh = 64 - bshapes[bshapes.length - 1].by; } else { if (bshapes[bshapes.length - 2].bh == null) { bshapes[bshapes.length - 2].bh = 64 - bshapes[bshapes.length - 2].by; } else { bshapes[bshapes.length - 3].bh = 64 - bshapes[bshapes.length - 3].by; } } for (let i = 0; i < 17 - bshapes.length; i++) { br = R.random_int(0, rows.length - 3); while (rows[br] > 2) { br = R.random_int(0, rows.length - 3); } bx = R.random_int(1, 16 / rows[br] - 2) * rows[br]; by = 0; for (let i = 0; i < br; i++) { by = rows[i] + by; } bw = rows[br]; brh = R.random_int(3, Math.min(Math.ceil(rows.length), rows.length - br)); bh = 0; for (let i = br; i < br + brh; i++) { bh = rows[i] + bh; } bshapes.push({ br: br, bx: bx, by: by, bw: bw, bh: bh }); } bshapes.sort((a, b) => a.bw - b.bw); } function draw() { background(0, 0, 100); stroke(0, 0, 25); strokeWeight(u / 3.75); for (let i = 0; i < rows.length; i++) { fill(hue(colors[progression[i]]), saturation(colors[progression[i]]), brightness(colors[progression[i]]), alpha[R.random_int(0, alpha.length - 1)]); if (i == peek) { fill(hue(colors[progression[i]]), saturation(colors[progression[i]]), brightness(colors[progression[i]]), 0); } divider = rows[i]; for (let j = 0; j < 1 * grid / (2 * divider); j++) { rect((j * u * divider) + margin, y * u + margin, u * divider, rows[i] * u); } y = y + rows[i]; } for (let i = 0; i < bshapes.length; i++) { fill(colors[progression[bshapes[i].br]]); rect(bshapes[i].bx * u + margin, bshapes[i].by * u + margin, bshapes[i].bw * u, bshapes[i].bh * u); rect(w - margin - (bshapes[i].bx * u) - (bshapes[i].bw * u), bshapes[i].by * u + margin, bshapes[i].bw * u, bshapes[i].bh * u); } for (let i = 1; i < 9; i++) { line(margin, margin + (i * 8 * u), w - margin, margin + (i * 8 * u)); } noLoop(); } function scramble(arr) { let newarr = []; let length = arr.length; for (let i = 0; i < length; i++) { let choice = R.random_int(0, arr.length - 1); newarr.push(arr[choice]); arr.splice(choice, 1); } return (newarr); } function keyTyped() { if (key === 's') { w = 9 * 300; h = 17 * 300; u = w / 36; margin = 2 * u; y = 0; resizeCanvas(w, h, true); redraw(); saveCanvas(tokenId, 'png'); setup(); redraw(); } } class Random { constructor() { this.useA = false; let sfc32 = function(uint128Hex) { let a = parseInt(uint128Hex.substr(0, 8), 16); let b = parseInt(uint128Hex.substr(8, 8), 16); let c = parseInt(uint128Hex.substr(16, 8), 16); let d = parseInt(uint128Hex.substr(24, 8), 16); return function() { a |= 0; b |= 0; c |= 0; d |= 0; let t = (((a + b) | 0) + d) | 0; d = (d + 1) | 0; a = b ^ (b >>> 9); b = (c + (c << 3)) | 0; c = (c << 21) | (c >>> 11); c = (c + t) | 0; return (t >>> 0) / 4294967296; }; }; this.prngA = new sfc32(tokenData.substr(2, 32)); this.prngB = new sfc32(tokenData.substr(34, 32)); for (let i = 0; i < 1e6; i += 2) { this.prngA(); this.prngB(); } } random_dec() { this.useA = !this.useA; return this.useA ? this.prngA() : this.prngB(); } random_num(a, b) { return a + (b - a) * this.random_dec(); } random_int(a, b) { return Math.floor(this.random_num(a, b + 1)); } random_bool(p) { return this.random_dec() < p; } random_choice(list) { return list[this.random_int(0, list.length - 1)]; } }
(()=>{"use strict";{const o=Math.PI,s=2*o,f=Math.cos,c=Math.sin,d=Math.pow,g=Math.sqrt,u=Math.floor,v=Math.abs,w=Math.min,p=Math.max,m=1/3,y=1/6,b=new Float32Array([1,1,0,-1,1,0,1,-1,0,-1,-1,0,1,0,1,-1,0,1,1,0,-1,-1,0,-1,0,1,1,0,-1,1,0,1,-1,0,-1,-1]);class x{constructor(t,e,r,n,i,a){this.x=t,this.y=e,this.frac=n,this.s=r,this.angle=i,this.frac2=1,this.frac3=1,this.frac4=1,this.t=0,this.n_sides=a,this.fc=0,this.done=!1}}const M={init(t){this.r=this.alea(t),this.p=this.bp(this.r),this.perm=new Uint8Array(512),this.p12=new Uint8Array(512);for(var e=0;e<512;e++)this.perm[e]=this.p[255&e],this.p12[e]=this.perm[e]%12},bp(t){var e,r=new Uint8Array(256);for(e=0;e<256;e++)r[e]=e;for(e=0;e<255;e++){var n=e+~~(t()*(256-e)),i=r[e];r[e]=r[n],r[n]=i}return r},masher(){var t=4022871197;return function(e){e=e.toString();for(var r=0;r<e.length;r++){var n=.02519603282416938*(t+=e.charCodeAt(r));n-=t=n>>>0,t=(n*=t)>>>0,t+=4294967296*(n-=t)}return 2.3283064365386963e-10*(t>>>0)}},alea(){var t=0,e=0,r=0,n=1,i=this.masher();t=i(" "),e=i(" "),r=i(" ");for(var a=0;a<arguments.length;a++)(t-=i(arguments[a]))<0&&(t+=1),(e-=i(arguments[a]))<0&&(e+=1),(r-=i(arguments[a]))<0&&(r+=1);return i=null,function(){var i=2091639*t+2.3283064365386963e-10*n;return t=e,e=r,r=i-(n=0|i)}},n3(t,e,r){var n,i,a,l,h,o,s,f,c,d,g=this.p12,v=this.perm,w=(t+e+r)*m,p=u(t+w),x=u(e+w),M=u(r+w),R=(p+x+M)*y,S=t-(p-R),A=e-(x-R),k=r-(M-R);S>=A?A>=k?(h=1,o=0,s=0,f=1,c=1,d=0):S>=k?(h=1,o=0,s=0,f=1,c=0,d=1):(h=0,o=0,s=1,f=1,c=0,d=1):A<k?(h=0,o=0,s=1,f=0,c=1,d=1):S<k?(h=0,o=1,s=0,f=0,c=1,d=1):(h=0,o=1,s=0,f=1,c=1,d=0);var q=S-h+y,C=A-o+y,E=k-s+y,U=S-f+2*y,F=A-c+2*y,I=k-d+2*y,H=S-1+3*y,L=A-1+3*y,P=k-1+3*y,W=255&p,_=255&x,z=255&M,D=.6-S*S-A*A-k*k;if(D<0)n=0;else{var j=3*g[W+v[_+v[z]]];n=(D*=D)*D*(b[j]*S+b[j+1]*A+b[j+2]*k)}var B=.6-q*q-C*C-E*E;if(B<0)i=0;else{var G=3*g[W+h+v[_+o+v[z+s]]];i=(B*=B)*B*(b[G]*q+b[G+1]*C+b[G+2]*E)}var J=.6-U*U-F*F-I*I;if(J<0)a=0;else{var K=3*g[W+f+v[_+c+v[z+d]]];a=(J*=J)*J*(b[K]*U+b[K+1]*F+b[K+2]*I)}var N=.6-H*H-L*L-P*P;if(N<0)l=0;else{var O=3*g[W+1+v[_+1+v[z+1]]];l=(N*=N)*N*(b[O]*H+b[O+1]*L+b[O+2]*P)}return 32*(n+i+a+l)}},R=(a=[[54,875,410,1692,4017,2269,2734],[0,4095,3549,1365,546],[18,375,1688,4041,3619],[0,679,120,3324,341,50,34],[3892,3106,2050,1536,768,512],[618,72,38,19,18,2],[3171,2131,3478,4023,4093,2455,308,18],[4095,3985,2541,715,869,18],[3838,3021,1675,1145,600,54,2],[2115,3685,3990,4041,3547,3566],[4042,3447,2425,1111,563,2748],[869,1465,0,291,4001,3822,4095],[785,1552,4090,2624,3459,4090,120],[3994,3976,3419,4015,1338,514,3766],[512,1794,3141,3957,3989,3635],[3654,4054,218,395,52],[4078,2988,70,154,2543,3567,138,4060],[3685,4084,2507,1450,3822,530,1604]],l=[],h=[[1,1,0],[0,1,1],[1,0,1],[.5,1,0],[1,.5,0],[0,.5,1],[0,1,.5],[.5,0,1],[1,0,.5],[1,1,.5]],{g:function(t,e,r){let n=u(l.length*(v(t)%1)),i=l[n];return 1==r?A?[0,0,1]:[.83,.83,.83]:2==r?A?[1,0,0]:[1,.84,0]:e?h[n]:i},i:function(t){l=[],A||(h=[]);for(var e=0;e<a[t].length;++e){let r=a[t][e],n=(15&r)/16,i=(r>>4&15)/16,o=(r>>8&15)/16;l.push([o,i,n]),A||h.push([o,i,n])}},s:function(){return l.length}}),S=window.location.search;let A=new URLSearchParams(S).has("loom");const k=document.createElement("canvas");k.style="position:absolute;background:white;top:0;left:0;right:0;bottom:0;margin:0 auto;",document.body.prepend(k);const q=k.getContext("2d"),C=document.createElement("canvas"),E=C.getContext("2d");if(A){var t=document.createElement("canvas");t.style="position:absolute;background:white;top:8000px;left:0;right:0;bottom:0;margin:0 auto;",document.body.append(t),t.width=1e3,t.height=100;var e=t.getContext("2d")}M.init(tokenData.hash);let U=M.r,F=u(18*U()),I=1+10*U(),H=u(10+30*U()),L=u(1+40*U()),P=u(1+25*U()),W=U(),_=U()*s,z=U()>.8?30:U()>.4?0:10+u(5*U()),D=U()>.5,j=U()>.5,B=U()>.4?3:U(),G=U()>.8;G&&(H*=3);let J=U()>.5?100:3+u(4*U()),K=U()>.92,N=50+u(50*U()),O=.02+.08*U(),Q=U()>.9,T=2+u(8*U()),V=.03*(.5+U()),X=.5*d(2*(U()-.5),3),Y=.5+U(),Z=.5+U(),$=U()-.5,tt=U()-.5,et=U()-.5,rt=U()-.5,nt=0;for(;M.n3(0,-4.9-nt,0)<-.8;)nt=100*U();R.i(F);let it=1/R.s(),at=5*u(window.innerWidth/5),lt=window.innerHeight,ht=25/17,ot=at*ht;function st(){let t=5*u(window.innerWidth/5),e=window.innerHeight,r=25/17,n=t*r;e>n?e=n:t=5*u(e/r/5),k.width=t,k.height=e,q.drawImage(C,0,0,k.width,k.height)}lt>ot?lt=ot:at=5*u(lt/ht/5),k.width=at,k.height=lt,at=5350,lt=7868,A&&(at/=5,k.width=at,k.height=lt),C.width=at,C.height=lt,p(at,lt),window.addEventListener("resize",st);let ft=at,ct=lt;A||(ft/=5);let dt=[];for(var r=0;r<H;++r){let bt=1.7*(U()-.5),xt=1.7*(U()-.5)*ht,Mt=.01+.4*U(),Rt=Mt;for(var n=0;n<dt.length;++n){let St=bt-dt[n].x,At=xt-dt[n].y,kt=g(St*St+At*At)-dt[n].s;if(kt<0){Rt=0;break}Rt=w(Rt,kt)}if(Rt>.05*Mt){let qt=U()>.5?100:3+u(4*U());G&&(qt=J);let Ct=new x(bt,xt,Rt,U(),U()*s,qt);Ct.frac2=U(),Ct.frac3=.5+1.5*U(),Ct.frac4=U(),Ct.t=U()>.9?1:0,dt.push(Ct)}}E.clearRect(0,0,at,lt),E.strokeStyle="none";let gt=[],ut=[];for(var i=0;i<ct;i++)ut[i]=U()>.95?.2*U()-.1:0;for(i=1;i<ct-1;i++)gt[i]=.33*(ut[i-1]+ut[i]+ut[i+1]);gt[0]=0,gt[ct-1]=0;let vt=[];for(i=0;i<P;++i)vt[i]=U()>.9?.2*(U()-.5):0;let wt=0,pt=[];for(i=0;i<z;++i){let Et=U()*s,Ut=2*f(Et),Ft=2*c(Et);Et=Et+o+(U()-.5)*o;let It=2*f(Et)-Ut,Ht=2*c(Et)-Ft,Lt=It*It+Ht*Ht,Pt=.9+.2*U(),Wt=U()>.5?1:0,_t=.4*U();pt.push({x:Ut,y:Ft,dx:It,dy:Ht,l:Lt,p:Pt,t:Wt,q:_t})}function mt(t,e,r){let n=t,i=e;for(var a=0;a<pt.length;++a){let t=n-pt[a].x,e=i-pt[a].y,l=(t*pt[a].dx+e*pt[a].dy)/pt[a].l,h=pt[a].x+pt[a].dx*l,o=pt[a].y+pt[a].dy*l,s=n-h,c=i-o,d=c*c+s*s;-t*pt[a].dy+e*pt[a].dx>0&&(r+=pt[a].q,0==pt[a].t?(n=h+s*pt[a].p,i=o+c*pt[a].p):(n+=pt[a].dx/pt[a].l*.02,i+=pt[a].dy/pt[a].l*.02,r+=f(.4*d)*pt[a].p*.2))}return[n,i,r]}function yt(t){if(!(wt>=ft)){requestAnimationFrame(yt);for(var e=wt;e<w(wt+20,ft);e++){let t=e/ft,i=(e+1)/ft,a=(e-1)/ft;for(var r=0;r<ct;r++){let l=2*(t-.5),h=2*(.5-r/ct)*ht,w=2*(i-.5),m=2*(.5-(r+5)/ct)*ht,y=2*(a-.5),b=2*(.5-(r-5)/ct)*ht,x=0;[l,h,x]=mt(l,h,x);let S=!1,k=0,q=M.n3(3*l,3*h,8.45),C=M.n3(9*l,9*h,4.87)*V*q,F=M.n3(9*l,9*h,4.27)*V*q,H=u((h+2)*P),z=(u((m+2)*P),u((b+2)*P),(h+2)*P-H),G=(H+.5)/P-2,J=u((l+1)*L),at=(u((w+1)*L),u((y+1)*L),(J+.5)/L-1),lt=z-.5;p(2*v(h-G)*P,2*v(l-at)*L),l+=vt[H%P];let ot=v(2*lt),st=.5*M.n3(5*l,5*h,.18)+.5;st=d(st,3),x+=1*h+W+2+U()*O;let ft=10427*H+10429*J;K&&(x+=ft%N/N),ft%9==0&&(x+=H*it+J*I*it),D&&ft%13==0&&(x+=j?.2*f(100*l):.2*f(100*h));let ut=$,wt=tt;Q&&(7*H+5*J)%2==0&&(ut=et,wt=rt);let pt=l,yt=h;l+=C,h+=F;let bt=Math.atan2(h-wt,l-ut);bt=(bt+o+_)/s*T;let xt=(l-ut)*(l-ut)+(h-wt)*(h-wt),Mt=bt-u(bt)+d(xt,Y)*X;for(;Mt<0;)Mt+=1;Mt%=1;let Rt=(u(Mt/it)+.5)*it;ot=v(Mt-Rt)/it*2*Z,ft%7!=0?U()<g(xt)*ot&&(x+=Mt):x+=U()*O;let St=nt;for(var n=0;n<dt.length;++n){let t=dt[n].x,e=dt[n].y,i=g((pt-t)*(pt-t)+(yt-e)*(yt-e)),a=f(dt[n].angle),l=c(dt[n].angle),h=(pt-t)*a+(yt-e)*l+t,d=-(pt-t)*l+(yt-e)*a+e,u=Math.atan2(d-e,h-t)+s+i/dt[n].s*1*dt[n].frac4,v=dt[n].n_sides;if(i/=f(o/v)/f(u%(s/v)-o/v),i<dt[n].s){let t=i/dt[n].s;St+=t,x=dt[n].frac3*(1-t*t)+dt[n].frac2,1==dt[n].t&&(x*=3),S=!0,dt[n].frac2>.5&&(x+=gt[r]),St+=950}}l+=C,h+=F;let At=M.n3(st*B*3*l,st*B*2*h,.3+St);At>0&&(x+=it),U()>At+1.72&&(k=1),At=M.n3(st*B*l,-.9-St,st*B*h),At<.5&&(x-=it),At=M.n3(.2*st*B*l,-4.9-St,.2*st*B*h),At<0&&(x+=.5),U()>At+1.72&&(k=2);let kt=R.g(x,S,k);E.fillStyle="rgb("+u(255*kt[0])+","+u(255*kt[1])+","+u(255*kt[2])+")",A?E.fillRect(e,r,1,1):E.fillRect(5*e,r,5,1)}}wt+=20,q.drawImage(C,0,0,k.width,k.height)}}if(window.requestAnimationFrame(yt),A){e.clearRect(0,0,1e3,200),e.strokeStyle="none";let zt=1e3/(R.s()+2);for(n=0;n<R.s();++n){let jt=n/R.s(),Bt=R.g(jt,!1,0);e.fillStyle="rgb("+u(255*Bt[0])+","+u(255*Bt[1])+","+u(255*Bt[2])+")",e.fillRect(n*zt,0,zt,50),Bt=R.g(jt,!0,0),e.fillStyle="rgb("+u(255*Bt[0])+","+u(255*Bt[1])+","+u(255*Bt[2])+")",e.fillRect(n*zt,50,zt,50)}let Dt=R.g(0,!1,1);e.fillStyle="rgb("+u(255*Dt[0])+","+u(255*Dt[1])+","+u(255*Dt[2])+")",e.fillRect(1e3-2*zt,50,zt,50),Dt=R.g(0,!1,2),e.fillStyle="rgb("+u(255*Dt[0])+","+u(255*Dt[1])+","+u(255*Dt[2])+")",e.fillRect(1e3-1*zt,50,zt,50)}}var a,l,h})();
*Navette* explores a juxtaposition of the virtual and reality by fusing a digital generative process and a physical loom. This collection offers a voyage between the worlds, a shuttle weaving between the two. Using a combination of digital techniques adapted for the physical world, *Navette* plays with the notions of series and unique pieces, but also of the inherent randomness of the digital realm—featuring the infamous “glitch.” Generative art thus becomes a way of taking a shuttle to the edge of a new universe…