0x1014…01fe

All memos sent from and to 0x1014…01fe.

Thread is the long-form generative token collection that compliments Anna Lucia's project "Oefenstof". Embroidery is one of the oldest decorative crafts, practiced since the invention of the needle and thread. At some point, embroidery artists realized they needed a way to record and reference different designs. The solution was the creation of the sampler, a piece of cloth decorated with different motifs. Samplers often featured scattered motifs, bands of geometric and decorative borders, animals, floral motifs, and alphabets. Although found across diverse cultures and timelines, similarities can be found across different samplers, often executed in the binary form of a cross-stitch. This duality, stitch or no stitch, resonates with the binary logic of computation. Anna Lucia has examined the patterns and representations found in embroidery samplers, the act of recording embroidery work, and the transformation of traditional patterns through algorithmic processes. Exploring the overlap between traditional embroidery motifs and computer algorithms. This resulted in Anna Lucia building her own library of embroidery samplers using custom code and an embroidery machine, that were recorded with her project "Oefenstof". In her experimentation, Anna Lucia applied well-known algorithms such as cellular automata and XOR patterns. Yet, their typical digital aesthetics were obscured by the constraints of the embroidery machine and the unpredictable dialogue between the artist and the computer. Thread makes the underlying patterns visible again.
let nx,ny,sd,bc,pl,mc,ac=["#CE@E0DDD1"],pal=[[1,3,4,8],[8,13,14t=[],tnp=0;function setup(){framCanvas(windowWidth,Height,WEBGL),pixelDensity(displ)<.9&&n.push(56 @0;t<i;t++){if(h`?(ny=s,nx=2*s):( o=pl[t%pl.length],ra(!J i)=>i.upd?t+1:"< ,h.nbo=h.bo n%d@Q bo=Array.fr!F!U c,Ay:1,Ax:1": nx-1-n][s].vl=1$c);A# t*((1-e*e)*
Thread is the long-form generative token collection that compliments Anna Lucia's project "Oefenstof". Embroidery is one of the oldest decorative crafts, practiced since the invention of the needle and thread. At some point, embroidery artists realized they needed a way to record and reference different designs. The solution was the creation of the sampler, a piece of cloth decorated with different motifs. Samplers often featured scattered motifs, bands of geometric and decorative borders, animals, floral motifs, and alphabets. Although found across diverse cultures and timelines, similarities can be found across different samplers, often executed in the binary form of a cross-stitch. This duality, stitch or no stitch, resonates with the binary logic of computation. Anna Lucia has examined the patterns and representations found in embroidery samplers, the act of recording embroidery work, and the transformation of traditional patterns through algorithmic processes. Exploring the overlap between traditional embroidery motifs and computer algorithms. This resulted in Anna Lucia building her own library of embroidery samplers using custom code and an embroidery machine, that were recorded with her project "Oefenstof". In her experimentation, Anna Lucia applied well-known algorithms such as cellular automata and XOR patterns. Yet, their typical digital aesthetics were obscured by the constraints of the embroidery machine and the unpredictable dialogue between the artist and the computer. Thread makes the underlying patterns visible again. This collection is released in collaboration with Galerie Met in Berlin.
let pals=[["#EED6B5","#EBDAD2","#E36D32","#BDAB57","#9F9F74","#fbbb00",],["#D6CEC7","#E6D3C5","#C7C1CF","#A797BD","#FF9820",],["#BDAB57","#9F9F74","#696F4D","#EED6B5","#F0C4B0","#EBDAD2",],["#EED6B5","#EBDAD2","#FF9820","#fbbb00","#BDAB57",],],pals2=[["#A797BD",],["#E36D32",],["#C7C1CF","#A797BD",],["#CEDADD",],],clrs,sha,vert=` attribute vec3 aPosition; attribute vec2 aTexCoord; varying vec2 vTexCoord; void main() { vTexCoord = aTexCoord; vec4 positionVec4 = vec4(aPosition, 1.0); positionVec4.xy = positionVec4.xy * 2.0 - 1.0; gl_Position = positionVec4; }`,frag=` #ifdef GL_ES precision highp float; #endif varying vec2 vTexCoord; uniform sampler2D tex0; uniform float ws; uniform vec2 u_resolution; uniform float w; uniform float m; uniform float z; uniform vec2 d; uniform float t; uniform vec2 fbm[6]; const int dir = 13; const int rng = 3; float map(float x, float imin, float imax, float omin, float omax) { return imin + (x-omin)*((imax-imin)/(omax-omin)); } vec4 blur(sampler2D txt, vec2 st, float s, float ph) { vec4 col = vec4(0.0); for (int j = 1; j < rng+1; j++) { float r = float(j)*(s/float(rng)); for (int i = 0; i<dir; i++) { float a = float(i)*(ph/float(dir)); vec2 p = st + (vec2(cos(a),sin(a)))*r; vec4 cs = texture2D(txt, p); cs = pow(cs,vec4(2.2)); col += cs; } } return col/(float(rng)*float(dir)); } vec2 wrp(vec2 st, float freq, float t) { vec2 result = 0.5*cos(st.xy*1.1*freq + vec2(fbm[0].x,fbm[0].y) + t) + 0.35*cos(st.yx*2.3*freq + vec2(fbm[1].x,fbm[1].y) + t) + 0.13*cos(st.xy*4.1*freq + vec2(fbm[2].x,fbm[2].y) + t) + 0.062*cos(st.yx*8.1*freq + vec2(fbm[3].x,fbm[3].y) + t); 0.031*cos(st.xy*16.1*freq + vec2(fbm[3].x,fbm[3].y) + t); return result; } void main() { vec2 uv = vTexCoord; uv.y = 1.0 - uv.y; vec2 wrp = wrp(uv, 3.0*sin(0.5*w), w); vec4 bg = vec4(0.0); for (int i = 0; i<9; i++) { float a = float(i)*(2.28/float(dir)); vec2 p = uv/z + d + (vec2(cos(a),sin(a)))*0.004; vec4 cs = texture2D(tex0, p); cs = pow(cs,vec4(2.2)); bg += cs; } bg = bg/float(dir); float avg = dot(bg.rgb, vec3(0.333)); avg = avg*2.0 - 1.0; vec2 st = uv + wrp*ws*sin(uv*3.1415) + 0.3*avg; st += (1.0/z)*0.48*cos(13.0*(st.xy+fbm[1]/2.0)*sin(t*0.00001 + fbm[3].y)) + (1.0/z)*0.24*cos(15.3*(st.yx+fbm[2]/2.0)*cos(t*0.000008 + fbm[3].x)); if (z == 4.0) { st.x = map(st.x, 0.7, 0.79, 0.0, 1.0); st.y = map(st.y, 0.2, 0.29, 0.0, 1.0); } else { st.x = map(st.x, 0.6, 0.75, 0.0, 1.0); st.y = map(st.y, 0.25, 0.4, 0.0, 1.0); } vec4 col = blur(tex0,st,0.005, 2.28); col = pow(col, vec4(1.0 / 2.3)); if (m == 1.0) { col = 1.1*col*col; } gl_FragColor = vec4(col); }`,seed=parseInt(tokenData.hash.slice(0,16),16),field=[],dims=[32,32],pg,art;function setup(){randomSeed(seed),noiseSeed(seed),setAttributes("perPixelLighting",!0),setAttributes("antialias",!0),windowHeight>=(ar=1.44)*windowWidth?(ww=windowWidth,wh=ar*windowWidth):(wh=windowHeight,ww=windowHeight/ar),createCanvas(ww,wh,WEBGL),pixelDensity(min(2,displayDensity())),colorMode(HSB,360,100,100,100),pB(),tB();let t=floor(random(pals.length));if(mlt=.25>random()?1:0,clrs=pals[t],.65>random()){let e=pals2[t];for(let $=0;$<e.length;$++)clrs.push(e[$]);3==t&&(mlt=0)}art=createGraphics(1024,1024),bg=.35>random()?color("#2E2E2E"):color(random(clrs)),art.background(bg),dC(field,50),fbm=[];for(let i=0;i<12;i++)fbm.push(random(TWO_PI));wrp=random([.2,.25,.3,.35]),zm=random([2.5,3,3.5,3,3.5,4]),ts=random(5,10),dpl=[random([.05,.55]),random([.05,.55])],shader(sha=createShader(vert,frag)),sha.setUniform("tex0",art),sha.setUniform("u_resolution",[width,height]),sha.setUniform("m",mlt),sha.setUniform("w",ts),sha.setUniform("ws",wrp),sha.setUniform("z",zm),sha.setUniform("d",dpl),sha.setUniform("fbm",fbm)}function draw(){clear(),background(0),sha.setUniform("t",millis()),rect(0,0,width,height)}function genC(t){let e=8;return("#fbbb00"==t||"#F0C4B0"==t)&&(e=4),rC=color(hue(t)+randomGaussian()*(e/2),saturation(t)+abs(randomGaussian())*e,brightness(t)+abs(randomGaussian())*e,100)}function dC(t,e){for(let $=0;$<e;$++){start=-.5+1*($/e)+random(-.15,.15),end=this.start+.08,steps=floor(random(5,10)),increm=abs(this.end-this.start)/this.steps,c=random(clrs),dx=art.width/31,dy=art.height/31;for(let i=start;i<end;i+=increm){let s=random(1e3),r=genC(random(clrs));for(let o=0;o<31;o++){s+=.03,yoff=100*start;for(let a=0;a<31;a++){let n=t[o][a]-i,l=t[o+1][a]-i,f=t[o+1][a+1]-i,_=t[o][a+1]-i,m=o*dx,u=a*dy,p=createVector(m+dx*n/(n-l),u),g=createVector(m+dx,u+dy*l/(l-f)),d=createVector(m+dx*(1-f/(f-_)),u+dy),v=createVector(m,u+dy*(1-_/(_-n)));switch(st=map(noise(s,yoff),0,1,-5,10)*dx*.1,art.strokeWeight(st),art.stroke(r),state=gS(n,l,f,_)){case 1:case 14:dL(d,v);break;case 2:case 13:dL(g,d);break;case 3:case 12:dL(g,v);break;case 4:case 11:dL(p,g);break;case 5:dL(p,v),dL(g,d);break;case 6:case 9:dL(p,d);break;case 7:case 8:dL(p,v);break;case 10:dL(p,g),dL(d,v)}yoff+=.03}}}}}function dL(t,e){art.line(t.x,t.y,e.x,e.y)}function gS(t,e,$,i){return(t>0?8:0)+(e>0?4:0)+($>0?2:0)+(i>0?1:0)}function pB(){(pg=createGraphics(dims[0],dims[1],WEBGL)).setAttributes("premultipliedAlph",!1),pg.pixelDensity(1),pg.setAttributes("antialias",!0),pg.rectMode(CENTER),pg.background(0),pg.noFill(),pg.stroke(255),pg.push(),pg.rotate(random(.17,.33)*PI);let t=pg.width*random(.25,.75),e=pg.width*random(.04,.07),$=pg.width*random(.05,.1);pg.ellipse(0,0,$,$),pg.rect(0,0,t,e),pg.pop()}function tB(){let t=[];for(let e=0;e<dims[0];e++)for(let $=0;$<dims[1];$++){let i=pg.get(e,$),s=0==i[0]?0:255,r=0==i[1]?0:255,o=0==i[2]?0:255;t.push(s),t.push(r),t.push(o),t.push(255)}let a=[];Fourier.transform(t,a);let n=[],l=0;for(let f=0;f<a.length;f++){let _=log(abs(a[f].magnitude()));_>l&&(l=_),n.push(_)}dx=width/dims[0],dy=height/dims[1];let m=random([.025,.05,.08]),u=random([.025,.05,.08]);noiseDetail(8,.3),nsc=.25;let p=random(1e3);for(let g=0;g<dims[0];g++){field[g]=[],p+=m;let d=0;for(let v=0;v<dims[1];v++){let h=map(noise(p,d),0,1,-1,1),b=map(n[dims[1]*g+v],0,l,-1,1);field[g][v]=b<-1e4?h:b+nsc*h,d+=u}}field[0][0]=(field[1][0]+field[0][1])/2}var Fourier=function(){function t(t){return new e(cos(t),sin(t))}function e(t,e){this.real=t,this.imag=e}return e.prototype.magnitude2=function(){return this.real*this.real+this.imag*this.imag},e.prototype.magnitude=function(){return sqrt(this.magnitude2())},e.prototype.plus=function(t){return new e(this.real+t.real,this.imag+t.imag)},e.prototype.minus=function(t){return new e(this.real-t.real,this.imag-t.imag)},e.prototype.times=function(t){if("object"!=typeof t)return new e(t*this.real,t*this.imag);var $=this.real*t.real-this.imag*t.imag,i=this.real*t.imag+this.imag*t.real;return new e($,i)},{Complex:e,transform:function $(i,s){(function $(i,s,r,o,a,n){if(1===a)i[s]=new e(r[o],0);else{$(i,s,r,o,a/2,2*n),$(i,s+a/2,r,o+n,a/2,2*n);for(var l=0;l<a/2;l++){var f=t(-2*PI*l/a),_=i[s+l];i[s+l]=_.plus(f.times(i[s+l+a/2])),i[s+l+a/2]=_.minus(f.times(i[s+l+a/2]))}}})(s,0,i,0,i.length,1)}}}();
Horizontal and vertical threads weave together guided by a punching card generated at the moment of transaction. Often randomness distorts the orderly woven pattern. Thread colours are picked from a single colour palette. 10% of the sales from this drop will be donated to charity: water to bring clean and safe water to people in need.
let sd=parseInt(tokenData.hash.slice(0,16),16),p=[];for(let t=0;t<64;t+=2)p.push(tokenData.hash.slice(t+2,t+4));let rns=p.map(t=>parseInt(t,16)%10);var df=1e3,w=window.innerWidth,h=window.innerHeight,dim=Math.min(w,h),b=.325*dim;let cls,dx,dy,trd,pdl,trdng,pdls,tu,nt,tw,np,fp,brk,e,bc,cs,ts=[[[1,1,0,0],[0,1,1,0],[0,0,1,1],[1,0,0,1]],[[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]],[[1,1,0,0],[1,0,1,0],[0,1,0,1],[0,0,1,1]],[[0,1,0,1],[0,0,1,1],[1,0,1,0],[1,0,0,1]],[[1,0,0,1],[0,1,1,0],[0,1,1,0],[1,0,0,1]]],pd=[[0,1,2,3,0,0,1,1,2,2,3,3,3,0,0,0,1,1,2,2,3,3],[0,1,2,3],[3,2,1,0],[0,1,2,3,2,1,0,3,2,1,0,1,2,3],[0,1,2,1,2,3,2,3],[0,1,1,2,3,3],[3,2,2,1,0,0]],x=[],y=[],pts=[],d=[],r=[],ps=[],kl=[],av=[],ah=[];function setup(){createCanvas(dim,dim),strokeCap(SQUARE),noFill()}function draw(){background(245),cs=color(110),rns[4]>6&&(bc=color(60),background(bc),cs=color(bc)),c=[["#3C245B","#8461C9","#D0B3F4","#FFEA92","#FFEB36","#F4BA00"],["#00337C","#4055A1","#8294D8","#FFD199","#FF9D00","#EF6100"],["#047294","#38D7FC","#A4ECFF","#FF5736","#BA0F0F","#7C0000"],["#598200","#DCEF25","#C8E281","#FFCFEF","#FF80D2","#F400B5"],["#006027","#009E44","#D4FFE6","#ECACFC","#C671DB","#9B06BF"]];let t=new Random(sd);if(tu=ts[floor(map(rns[0],0,10,0,ts.length))],pdls=pd[floor(map(rns[1],0,10,0,pd.length))],trdng=pd[floor(map(rns[2],0,10,0,pd.length))],nt=8*rns[3]+32,tw=rns[7]<5?1.95:1.75,rns[7],fp=.07,0==rns[5]?(np=0,tw=2.85):np=rns[3]<4?14+.5*rns[5]:14+2*rns[5],brk=rns[10]>6?map(rns[10],7,9,.15,.45):0,clr(),dx=(dim-2*b)/(cls=2*nt+2),16==np&&rns[7]>4)for(let t=0;t<4;t++)for(let e=0;e<4;e++)fp=.3,r[t+4*e]=dim/6,ps[t+4*e]=createVector(dim/5+t*(dim/5),dim/5+e*(dim/5));else if(5==rns[5]&&rns[7]>4)for(let t=0;t<5;t++)for(let e=0;e<5;e++)fp=.3,r[t+5*e]=dim/7,ps[t+5*e]=createVector(dim/3.5+t*(dim/6),dim/3.5+e*(dim/6));else for(let e=0;e<np;e++)ps[e]=createVector(t.rn(.05*dim,dim-.05*dim),t.rn(.05*dim,dim-.05*dim)),r[e]=t.rn(dim/2,dim/8);for(let t=0;t<cls;t++){pts[t]=[],d[t]=[];for(let e=0;e<cls;e++){let s=createVector(t*dx+b,e*dx+b);pts[t][e]=s;for(let o=0;o<ps.length;o++)if(d[t][e]=s.dist(ps[o]),d[t][e]<r[o]){if(rns[7]<5){let l=createVector(pts[t][e].x-ps[o].x,pts[t][e].y-ps[o].y);l.normalize(),l.mult(r[o]),l.add(ps[o]);let n=createVector(l.x-pts[t][e].x,l.y-pts[t][e].y);n.mult(fp),s.add(n)}else{let r=createVector((pts[t][e].x-ps[o].x)*fp,(pts[t][e].y-ps[o].y)*fp);s.sub(r)}pts[t][e]=s}}}for(let t=0;t<cls;t++)x[t]=pts[cls-1][t].x,x[t+cls-1]=pts[1][t].x,y[t]=pts[t][cls-1].y,y[t+cls-1]=pts[t][1].y;let e=width-.05*dim-(max(x)-min(x)),s=width-.05*dim-(max(y)-min(y)),o=.025*dim-min(x),l=.025*dim-min(y),n=t.rn(0,1)>.99?2:1;for(let r=0;r<cls;r+=n)for(let x=0;x<cls;x+=n)pts[r][x].x=pts[r][x].x+e/cls*r+o,pts[r][x].y=pts[r][x].y+s/cls*x+l,av[r+x*cls]=t.rn(.01,1),ah[r+x*cls]=t.rn(.01,1);stroke(cs),strokeWeight(dx*tw);let p=rns[7]<5?0:dx*tw,a=.2*dx*tw;for(let t=6;t<cls-4;t+=2)for(let e=2;e<cls-1;e+=2){p=rns[7]<5?0:dx*tw;let r=e<cls-2?pts[t][e+2]:pts[t][e+1],s=e<cls-2?p:0;av[t+e*cls]>brk&&(beginShape(),vertex(pts[t][e-1].x+a,pts[t][e-1].y+a),vertex(pts[t][e].x+a,pts[t][e].y-p+a),vertex(pts[t][e].x+a,pts[t][e].y+a),vertex(pts[t][e].x+a,pts[t][e].y+p+a),vertex(pts[t][e+1].x+a,pts[t][e+1].y+a),vertex(r.x+a,r.y-s+a),vertex(r.x+a,r.y+a),endShape())}for(let t=6;t<cls-4;t+=2)for(let e=2;e<cls-1;e+=2){p=rns[7]<5?0:dx*tw;let r=e<cls-2?pts[e+2][t]:pts[e+1][t],s=e<cls-2?p:0;ah[e+t*cls]>brk&&(beginShape(),vertex(pts[e-1][t].x+a,pts[e-1][t].y+a),vertex(pts[e][t].x-p+a,pts[e][t].y+a),vertex(pts[e][t].x+a,pts[e][t].y+a),vertex(pts[e][t].x+p+a,pts[e][t].y+a),vertex(pts[e+1][t].x+a,pts[e+1][t].y+a),vertex(r.x-s+a,r.y+a),vertex(r.x+a,r.y+a),endShape())}drawingContext.shadowBlur=0,drawingContext.shadowColor=cs;for(let t=2;t<cls-1;t+=2)for(let e=2;e<cls-1;e+=2){p=rns[7]<5?0:dx*tw;let r=pts[e-1][t],s=pts[e][t],o=pts[e+1][t],l=e<cls-2?pts[e+2][t]:o,n=e<cls-2?p:0,x=pts[e][t-1],d=pts[e][t],c=pts[e][t+1],i=t<cls-2?pts[e][t+2]:c,f=t<cls-2?p:0,y=.4*dx*tw,h=.4*dx*tw,w=.4*dx*tw,v=.4*dx*tw;if(x.x-d.x>.1*dx&&rns[7]>4&&(h=0,y=0),r.y-s.y>.1*dx&&rns[7]>4&&(v=0,w=0),x.x-d.x>dx&&rns[7]<5&&(y=0),r.y-s.y>dx&&rns[7]<5&&(v=0),pdl=pdls[(t/2+pdls.length-1)%pdls.length],trd=trdng[(e/2+trdng.length-1)%trdng.length],push(),1==tu[pdl][trd]){if(e>4&&e<cls-4&&av[e+t*cls]>brk&&(drawingContext.shadowOffsetY=h,drawingContext.shadowOffsetX=y,stroke(kl[0][e/2]),beginShape(),vertex(x.x,x.y),vertex(d.x,d.y-p),vertex(d.x,d.y),vertex(d.x,d.y+p),vertex(c.x,c.y),vertex(i.x,i.y-f),vertex(i.x,i.y),endShape()),t>4&&t<cls-4&&ah[e+t*cls]>brk){if(rns[7]<5){drawingContext.shadowOffsetY=0,drawingContext.shadowOffsetX=0,stroke(cs);let t=p5.Vector.lerp(r,s,.1),e=p5.Vector.lerp(o,s,.1);beginShape(),vertex(t.x+a,t.y+a),vertex(s.x+a,s.y+a),vertex(e.x+a,e.y+a),endShape()}else{drawingContext.shadowOffsetY=0,drawingContext.shadowOffsetX=0;let t=.75*dx*tw;stroke(cs),line(s.x-t,s.y+a,s.x+t,s.y+a)}drawingContext.shadowOffsetY=v,drawingContext.shadowOffsetX=w,stroke(kl[1][t/2]),beginShape(),vertex(r.x,r.y),vertex(s.x-p,s.y),vertex(s.x,s.y),vertex(s.x+p,s.y),vertex(o.x,o.y),vertex(l.x-n,l.y),vertex(l.x,l.y),endShape()}}else if(t>4&&t<cls-4&&ah[e+t*cls]>brk&&(drawingContext.shadowOffsetY=v,drawingContext.shadowOffsetX=w,stroke(kl[1][t/2]),beginShape(),vertex(r.x,r.y),vertex(s.x-p,s.y),vertex(s.x,s.y),vertex(s.x+p,s.y),vertex(o.x,o.y),vertex(l.x-n,l.y),vertex(l.x,l.y),endShape()),e>4&&e<cls-4&&av[e+t*cls]>brk){if(rns[7]<5){drawingContext.shadowOffsetY=0,drawingContext.shadowOffsetX=0,stroke(cs);let t=p5.Vector.lerp(x,d,.1),e=p5.Vector.lerp(c,d,.1);beginShape(),vertex(t.x+a,t.y+a),vertex(d.x+a,d.y+a),vertex(e.x+a,e.y+a),endShape()}else{drawingContext.shadowOffsetY=0,drawingContext.shadowOffsetX=0;let t=.75*dx*tw;stroke(cs),line(d.x+a,d.y-t,d.x+a,d.y+t)}drawingContext.shadowOffsetY=h,drawingContext.shadowOffsetX=y,stroke(kl[0][e/2]),beginShape(),vertex(x.x,x.y),vertex(d.x,d.y-p),vertex(d.x,d.y),vertex(d.x,d.y+p),vertex(c.x,c.y),vertex(i.x,i.y-f),vertex(i.x,i.y),endShape()}pop()}noLoop()}function clr(){let t=new Random(sd),e=t.rn(0,1),r=floor(t.rn(0,5)),s=floor(t.rn(0,6));for(let o=0;o<2;o++){let l,n,x,d=o>0?rns[9]:rns[8];kl[o]=[],e<.5?(l=color(c[r][floor(t.rn(0,6))]),n=color(c[r][floor(t.rn(0,6))]),x=color(c[r][floor(t.rn(0,6))])):(l=color(c[floor(t.rn(0,5))][s]),n=color(c[floor(t.rn(0,5))][s]),x=color(c[floor(t.rn(0,5))][s]));for(let p=0;p<nt/8;p++)for(let a=1;a<9;a++)0==d&&(kl[o][a+8*p]=e<.5?color(c[r][floor(t.rn(0,6))]):color(c[floor(t.rn(0,5))][s])),1==d&&(kl[o][a+8*p]=e<.5?c[r][(p+6)%6]:c[(p+5)%5][s]),2==d&&(kl[o][a+8*p]=l),3==d&&(kl[o][a+8*p]=e<.5?color(c[r][floor(t.rn(0,6))]):color(c[floor(t.rn(0,5))][s])),4==d&&(kl[o][a+8*p]=color(c[floor(t.rn(0,5))][floor(t.rn(0,6))])),5==d&&(kl[o][a+8*p]=lerpColor(l,n,(a+8*p)/nt)),6==d&&(kl[o][a+8*p]=(a+8*p+3)%4>1?l:n),7==d&&(kl[o][a+8*p]=l,bc=l,background(bc),cs=color(.7*red(l),.7*green(l),.7*blue(l))),8==d&&(t.rn(.01,1)>.8&&(x=c[floor(t.rn(0,5))][floor(t.rn(0,6))]),kl[o][a+8*p]=x),9==d&&(e<.5?(kl[o][a+8*p]=color(c[r][floor(t.rn(0,6))]),bc=color(c[r][floor(t.rn(0,6))])):(kl[o][a+8*p]=color(c[floor(t.rn(0,5))][s]),bc=color(c[floor(t.rn(0,5))][s])),background(bc),cs=color(.7*red(bc),.7*green(bc),.7*blue(bc)))}}class Random{constructor(t){this.sd=t}rd(){return this.sd^=this.sd<<13,this.sd^=this.sd>>17,this.sd^=this.sd<<5,(this.sd<0?1+~this.sd:this.sd)%1e3/1e3}rn(t,e){return t+(e-t)*this.rd()}}
Horizontal and vertical threads weave together guided by a punching card generated at the moment of transaction. Often randomness distorts the orderly woven pattern. Thread colours are picked from a single colour palette. Ten per cent of sales proceeds will be donated to Charity: Water.