0x4b86…127f

All memos sent from and to 0x4b86…127f.

// CC BY-NC-SA 4.0 let R; let objs = []; let minSideLength; let palettes = [ ["#E12A2A", "#F0871D", "#2E3F93", "#E1ECF4", "#882585", "#de5d5d", "#289D4D"], [ "#fcff4b", "#ffad05", "#fdfffa", "#5995ed", "#4ecdc4", "#F30100", "#70d6ff", "#ff70a6", ], ["#de183c", "#ffd35c", "#fd4a8e", "#08a9e5", "#7209b7", "#f0f0f0", "#f5822a"], [ "#e4572e", "#17bebb", "#ffc914", "#76b041", "#05569b", "#5594d0", "#fffef4", "#b00000", ], ]; let colors = []; let bgCol; let spd = 1; let offset = 0; let objCount; let rects = []; let paletteOption; let spdOption; let offsetOption; let gridOption; let backgroundOption; function setup() { createCanvas(windowWidth, windowHeight); rectMode(CENTER); R = new Random(); colors = R.random_choice(palettes); if (R.random_dec() < 0.3) { spd = R.random_dec() < 0.5 ? 0.5 : 2; } if (R.random_dec() < 0.5) { gridOption = true; } else { gridOption = false; } if (R.random_dec() < 0.4) { offsetOption = true; } else { offsetOption = false; } if (R.random_dec() < 0.7) { bgCol = "#121212"; backgroundOption = "Black"; } else { bgCol = "#0b0f30"; backgroundOption = "Navy"; } INIT(); if (palettes[0] == colors) { paletteOption = "Forest"; } else if (palettes[1] == colors) { paletteOption = "Seaside"; } else if (palettes[2] == colors) { paletteOption = "Bubblegum"; } else if (palettes[3] == colors) { paletteOption = "Firecracker"; } if (spd == 1) { spdOption = "Middle"; } else if (spd < 1) { spdOption = "Low"; } else { spdOption = "High"; } console.log("ColorPalette", paletteOption); console.log("Speed", spdOption); console.log("Offset", offsetOption); console.log("Grid", gridOption); console.log("Background", backgroundOption); } function draw() { background(0); fill(bgCol); noStroke(); rect(width / 2, height / 2, minSideLength); for (let i of objs) { i.run(); } drawGrid(gridOption); } function drawGrid(bl) { if (bl) { noFill(); stroke(255); strokeWeight(minSideLength * 0.001); for (let i of rects) { let x = i[0]; let y = i[1]; let w = i[2]; square(x + w / 2, y + w / 2, w); } } } function divideSquare() { R = new Random(); let gridCount = int(R.random_num(20, 33)); let gridW = minSideLength / gridCount; let gridH = minSideLength / gridCount; let emp = gridCount * gridCount; let grids = []; for (let j = 0; j < gridCount; j++) { let arr = []; for (let i = 0; i < gridCount; i++) { arr[i] = false; } grids[j] = arr; } while (emp > 0) { let w = int(R.random_num(1, 5)); let h = w; let x = int(R.random_num(0, gridCount - w + 1)); let y = int(R.random_num(0, gridCount - h + 1)); let lap = true; for (let j = 0; j < h; j++) { for (let i = 0; i < w; i++) { if (grids[x + i][y + j]) { lap = false; break; } } } if (lap) { for (let j = 0; j < h; j++) { for (let i = 0; i < w; i++) { grids[x + i][y + j] = true; } } let xx = x * gridW + (width - minSideLength) / 2; let yy = y * gridH + (height - minSideLength) / 2; let ww = w * gridW; let hh = h * gridH; rects.push([xx, yy, ww - offset, hh - offset]); emp -= w * h; } } for (let i = 0; i < rects.length; i++) { objCount++; objs.push(new Objct(rects[i][0], rects[i][1], rects[i][2])); } } function easeInOutExpo(x) { return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2 : (2 - Math.pow(2, -20 * x + 10)) / 2; } function INIT() { objs = []; rects = []; minSideLength = min(width, height) * 0.95; objCount = 0; if (offsetOption) { offset = minSideLength * 0.008; } divideSquare(); } function windowResized() { resizeCanvas(windowWidth, windowHeight); INIT(); } class Objct { constructor(x, y, w) { let rnd = int(R.random_num(0, 8) + 1); if (rnd == 1) this.mtn = new Motion01(x + w / 2, y + w / 2, w); else if (rnd == 2) this.mtn = new Motion02(x + w / 2, y + w / 2, w); else if (rnd == 3) this.mtn = new Motion03(x + w / 2, y + w / 2, w); else if (rnd == 4) this.mtn = new Motion04(x + w / 2, y + w / 2, w); else if (rnd == 5) this.mtn = new Motion05(x + w / 2, y + w / 2, w); else if (rnd == 6) this.mtn = new Motion06(x + w / 2, y + w / 2, w); else if (rnd == 7) this.mtn = new Motion07(x + w / 2, y + w / 2, w); else if (rnd == 8) this.mtn = new Motion08(x + w / 2, y + w / 2, w); } run() { this.mtn.show(); this.mtn.move(); } } class Motion01 { constructor(x, y, w) { this.x = x; this.y = y; this.w = w; this.n = int(R.random_num(3, 8)); this.sw = w / this.n; this.t = -int(R.random_num(0, 10)); this.t1 = int(R.random_num(50, 120)); this.tStep = R.random_num(0.5, 1) * spd; this.soc = int(R.random_num(0, 2)); this.ang = int(R.random_num(0, 4)) * (TAU / 4); this.col1 = this.col2 = 0; while (this.col1 == this.col2) { this.col1 = R.random_choice(colors); this.col2 = R.random_choice(colors); } } show() { push(); translate(this.x, this.y); rotate(this.ang); noFill(); strokeWeight(0); strokeCap(SQUARE); rect(0, 0, this.w); drawingContext.setLineDash([this.w / this.n, this.w / this.n]); strokeWeight(this.sw); stroke(this.col2); for (let i = 0; i < this.n; i++) { let yy = map( i, 0, this.n - 1, -this.w / 2 + this.sw / 2, this.w / 2 - this.sw / 2 ); let zr = this.soc * ((i % 2) * this.sw); drawingContext.lineDashOffset = zr + this.t * 0.5; line(-this.w / 2, yy, this.w / 2, yy); } pop(); } move() { this.t += this.tStep; } } class Motion02 extends Motion01 { constructor(x, y, w) { super(x, y, w); this.cx = 0; this.cd = w * 0.5; } show() { push(); translate(this.x, this.y); rotate(this.ang); noFill(); stroke(0); strokeWeight(0); rect(0, 0, this.w); drawingContext.clip(); noStroke(); fill(this.col2); circle(this.cx, 0, this.cd); circle(this.cx - this.w, 0, this.cd); pop(); } move() { this.t += this.tStep; if (0 < this.t && this.t < this.t1) { let nrm = norm(this.t, 0, this.t1 - 1); this.cx = lerp(0, this.w, easeInOutExpo(nrm)); } if (this.t > this.t1) { this.t = 0; this.cx = 0; } } } class Motion03 extends Motion01 { constructor(x, y, w) { super(x, y, w); this.t2 = this.t1 + 50; this.d = this.w * 0.3; this.sd = this.d; this.sd0 = this.d; this.sd1 = this.d * 4.5; this.sw = this.d; } show() { push(); translate(this.x, this.y); rotate(this.ang); noFill(); stroke(0); strokeWeight(0); rect(0, 0, this.w); drawingContext.clip(); noStroke(); fill(this.col2); circle(0, 0, this.d); if (this.t < this.t1) { noFill(); stroke(this.col2); strokeWeight(this.sw); circle(0, 0, this.sd - this.sw); } pop(); } move() { if (0 < this.t && this.t < this.t1) { let nrm = norm(this.t, 0, this.t1); this.sd = lerp(this.sd0, this.sd1, easeInOutExpo(nrm)); this.sw = lerp(this.d, 0, nrm); } if (this.t > this.t2) { this.t = 0; this.sd = this.sd0; } this.t += this.tStep; } } class Motion04 extends Motion01 { constructor(x, y, w) { super(x, y, w); this.d = this.w * 0.3; this.rad = this.w * 0.3; this.circles = []; this.cNum = 6; for (let i = 0; i < this.cNum; i++) { this.circles.push({ a: 0, d: map(i, 0, this.cNum - 1, this.d, this.d * 0.2), }); } this.t1 = int(R.random_num(120, 200)); this.cols = []; for (let i = 0; i < colors.length; i++) { this.cols.push(colors[i]); } shuffle(this.cols, true); } show() { push(); translate(this.x, this.y); rotate(this.ang); noStroke(); fill(this.col1); for (let c of this.circles) { circle(this.rad * cos(c.a), this.rad * sin(c.a), c.d); } pop(); } move() { if (0 < this.t && this.t < this.t1) { let nrm = norm(this.t, 0, this.t1); for (let i = 0; i < this.cNum; i++) { let c = this.circles[i]; c.a = lerp( 0, TAU, pow(easeInOutExpo(nrm), map(i, 0, this.cNum - 1, 0.7, 5)) ); } } if (this.t > this.t1) { this.t = 0; for (let i = 0; i < this.cNum; i++) { let c = this.circles[i]; c.a = 0; } } this.t += this.tStep; } } class Motion05 extends Motion01 { constructor(x, y, w) { super(x, y, w); this.cells = []; this.size = this.w / this.n; this.tmp = R.random_num(0.02, 0.05); let cols = []; for (let i = 0; i < colors.length; i++) { cols.push(colors[i]); } for (let i = 0; i < this.n; i++) { for (let j = 0; j < this.n; j++) { let x = i * this.size + this.x - this.w / 2; let y = j * this.size + this.y - this.w / 2; this.cells.push({ x: x, y: y, c: R.random_choice(cols), t: int(R.random_num(0, 1000)), }); } } this.rnd = int(R.random_num(0, 2)); } show() { noStroke(); for (let i of this.cells) { fill(i.c); if (this.rnd == 0) circle( i.x + this.size / 2, i.y + this.size / 2, this.size * sin(this.t * this.tmp + i.t) * 0.75 ); else square( i.x + this.size / 2, i.y + this.size / 2, this.size * sin(this.t * this.tmp + i.t) * 0.75 ); } } } class Motion06 extends Motion01 { constructor(x, y, w) { super(x, y, w); this.wt = int(R.random_num(1, 5)); this.cols = []; for (let i = 0; i < colors.length; i++) { this.cols.push(colors[i]); } shuffle(this.cols, true); } show() { let amp = this.w / this.n; push(); translate(this.x, this.y); rotate(this.ang); strokeWeight(0); stroke(0); noFill(); rect(0, 0, this.w); drawingContext.clip(); noFill(); strokeWeight(this.w * 0.02); for (let j = -1; j < this.n + 1; j++) { let yy = map(j, 0, this.n, -this.w / 2, this.w / 2); stroke(this.cols[floor((j + 1) % this.cols.length)]); beginShape(); for (let i = -1; i <= this.w + 1; i++) { let xx = i - this.w / 2; let n = norm(i, 0, this.w); vertex(xx, yy + amp * sin(n * this.wt * PI + this.t * 0.1)); } endShape(); } pop(); } } class Motion07 extends Motion01 { constructor(x, y, w) { super(x, y, w); this.ex = 0; this.ey = 0; this.ew = this.w * 0.2; this.rnd = 1000; this.init(); } init() { this.t1 = int(R.random_num(40, 100)); this.prnd = this.rnd; while (this.rnd == this.prnd) { this.rnd = int(R.random_num(0, 6)); } this.ex0 = this.ex; this.ey0 = this.ey; if (this.rnd == 0) { this.ex1 = 0; this.ey1 = 0; } else if (this.rnd == 1) { this.ex1 = this.ew * 0.3; this.ey1 = 0; } else if (this.rnd == 2) { this.ex1 = -this.ew * 0.3; this.ey1 = 0; } else if (this.rnd == 3) { this.ex1 = 0; this.ey1 = this.ew * 0.3; } else if (this.rnd == 4) { this.ex1 = 0; this.ey1 = -this.ew * 0.3; } else if (this.rnd == 5) { this.ex1 = this.ex0; this.ey1 = this.ey0; } } show() { push(); translate(this.x, this.y); rotate(this.ang); noStroke(); fill(this.col1); circle(this.w * 0.28, 0, this.w * 0.35); circle(-this.w * 0.28, 0, this.w * 0.35); fill(this.col2); circle(this.w * 0.28 + this.ex, this.ey, this.ew); circle(-this.w * 0.28 + this.ex, this.ey, this.ew); if (this.rnd == 5) { fill(bgCol); rect(0, -this.w * 0.3 + this.tn, this.w, -0 + this.tn * 2); } pop(); } move() { this.t += this.tStep; if (0 < this.t && this.t < this.t1) { let nrm = norm(this.t, 0, this.t1 - 1); this.ex = lerp(this.ex0, this.ex1, easeInOutExpo(nrm)); this.ey = lerp(this.ey0, this.ey1, easeInOutExpo(nrm)); if (this.rnd == 5) this.tn = lerp(0, this.w * 0.3, sin(easeInOutExpo(nrm) * PI)); } if (this.t > this.t1) { this.t = 0; this.init(); } } } class Motion08 extends Motion01 { constructor(x, y, w) { super(x, y, w); this.rad = this.w * 0.35; this.pom = R.random_dec() < 0.5 ? -1 : 1; } show() { push(); translate(this.x, this.y); rotate(this.ang); fill(this.col1); for (let i = 0; i < 12; i++) { let a = map(i, 0, 12, 0, TAU); circle(this.rad * cos(a), this.rad * sin(a), this.w * 0.05); } let a = this.t * 0.02 * this.pom; stroke(this.col2); strokeWeight(this.w * 0.04); line(0, 0, this.rad * cos(a), this.rad * sin(a)); line( 0, 0, this.w * 0.2 * cos(a / TAU / 2), this.w * 0.2 * sin(a / TAU / 2) ); pop(); } } 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; }; }; // seed prngA with first half of tokenData.hash this.prngA = new sfc32(tokenData.hash.substr(2, 32)); // seed prngB with second half of tokenData.hash this.prngB = new sfc32(tokenData.hash.substr(34, 32)); for (let i = 0; i < 1e6; i += 2) { this.prngA(); this.prngB(); } } // random number between 0 (inclusive) and 1 (exclusive) random_dec() { this.useA = !this.useA; return this.useA ? this.prngA() : this.prngB(); } // random number between a (inclusive) and b (exclusive) random_num(a, b) { return a + (b - a) * this.random_dec(); } // random integer between a (inclusive) and b (inclusive) // requires a < b for proper probability distribution random_int(a, b) { return Math.floor(this.random_num(a, b + 1)); } // random boolean with p as percent liklihood of true random_bool(p) { return this.random_dec() < p; } // random value in an array of items random_choice(list) { return list[this.random_int(0, list.length - 1)]; } }
Square Symphony is an art series inspired by "origins". This grid structure inside of a grid goes back to my earliest memories of being an artist. Each piece may seem simple, but within the eight motions, exploring “joy” and “comfort”. Returning to my "origin" as an artist for a moment and looking back at what I have built up over the years was somewhat like being a little kid again building up the blocks.