memoscan
← all memos

Memo 0xeca4a3a7…08f965 on Ethereum

[0,()=>{console.log("Artist 3. 0xdeafbeef -- platform 0");/* 0xDEAFBEEF 2024 Click to play animation/music. */ var seed; var ac; var SAMPLE_RATE = 44100; var FRAME_RATE = 24; var M_PI = Math.PI; var exp = Math.exp; var cos = Math.cos; var sin = Math.sin; var pow = Math.pow; var ceil = Math.ceil; var floor = Math.floor; const WW = 300; const HH = 300; var G = {w:WW,h:HH,busy:0,st:0, buf_started:0, fr: 0}; G.st = ms(); const arr = new Uint8ClampedArray(G.w*G.h*4); function crush(num,data,n) { normalize(data,n); for (var i=0;i<n;i++) { var v = floor((data[i]*0.5 + 0.5)*num); v -= num/2; data[i] = v/num; } } function make_bufn(n) { return new Float32Array(n); } function fill(v,d,n) { for (var i=0;i<n;i++)d[i] = v; } function noise(d,n) { for (var i=0;i<n;i++) { d[i] = drand(-1.0,1.0); } } function b_init(b) { b.n = 0; b.t = make_bufn(1024*4); b.y = make_bufn(1024*4); } function b_search(b,t) { let start=0, end=b.n; var i; while (start<=end){ i=floor((start + end)/2); if (t < b.t[i] && (i > 0 ? b.t[i-1] <= t : 1)) { return i; } else if (t < b.t[i]) { end = i - 1; } else { start = i + 1; } } return i; } function b_add(b,t,y) { var i = b_search(b,t); for (var j=b.n;j>i;j--) { b.t[j] = b.t[j-1]; b.y[j] = b.y[j-1]; } b.t[i] = t; b.y[i] = y; b.n++; } function b_render(b, data) { var t = 0; var k=0; while (t < b.t[b.n-1]) { data[k++] = b_interpl(b,t); t+=1.0/SAMPLE_RATE; } } function lincirc(b,t) { while (t >= G.audio_dur) { t -= G.audio_dur; } while (t < 0) { t += G.audio_dur; } var a = 0; var numdiv = 10; for (var i=0;i<numdiv;i++) { a += b_interpl(b,t); t -= 1.0/(24.0 * numdiv); if (t < 0) t += G.audio_dur; } a /= numdiv; return a; } function b_interpl(b,t) { var i = b_search(b,t) - 1; if (i >= 0 && i < b.n-1) { var a = (t - b.t[i])/ (b.t[i+1]-b.t[i]); return (1-a)*b.y[i] + a*b.y[i+1]; }else if (i >= b.n-1){ return b.y[b.n-1]; } return 0; } function isnum(a) { return (typeof a == 'number'); }; function dmod(x,y) { return x - floor(x/y) * y; } sinlu = Math.sin; function softclip(gain,offset,data,n) { for (var i=0;i<n;i++) { var x = data[i] * gain + offset; if (x < -1.0) { data[i] = -(2.0/3.0); } else if (x > 1.0) { data[i] = 2.0/3.0; } else { data[i] = x - (x*x*x)/3.0; } data[i] /= gain; data[i] *= 3.0/2.0; } } function ffdelay(dur, feedback, fl, fh, src,dst,n) { feedback = Math.exp(feedback/20 * Math.log(10)); var d = (dur * SAMPLE_RATE) + 10; var buf = make_bufn(ceil(d)); var p = 0; for (var i=0;i<n;i++) { //apply any iir filters to buf[p] here // if (fl > .001) buf[p] = iir_apply(&filt_hp, buf[p]); // if (fh > .001) buf[p] = iir_apply(&filt_lp, buf[p]); buf[p] = src[i] + feedback*buf[p]; dst[i] += buf[p]; if (++p >= d) p = 0; } } lp = (fc,data,n) => { var pole = 1 - 4*fc/SAMPLE_RATE; var GAIN = 2.0/(1-pole); var x = [0,0]; var y = [0,0]; for (var i=0;i<n;i++) { x[0] = x[1]; x[1] = data[i]/GAIN; y[0] = y[1]; y[1] = (x[0] + x[1]) + (pole * y[0]); data[i] = y[1]; } }; hp = (fc,data,n) => { var pole = 1 - 4*fc/SAMPLE_RATE; var GAIN = 2.0/(1+pole); var x = [0,0]; var y = [0,0]; for (var i=0;i<n;i++) { x[0] = x[1]; x[1] = data[i]/GAIN; y[0] = y[1]; y[1] = (x[0] - x[1]) + (pole * y[0]); data[i] = y[1]; } }; res2a = (fc, bw, data,n) => { var C = -1.0 * exp(-2.0*M_PI*bw/SAMPLE_RATE); var B = 2.0 * exp(-1.0*M_PI*bw/SAMPLE_RATE) * cos(2*M_PI*fc/SAMPLE_RATE); var A = 1.0 - B - C; var x = [0,0,0]; var y = [0,0,0]; for (var i=0;i<n;i++) { x[0] = x[1]; x[1] = x[2]; x[2] = data[i]; y[0] = y[1]; y[1] = y[2]; y[2] = A * x[2] + B * y[1] + C *y[0]; data[i] = y[2]; } } function maxsample(data,n) { var m = 0; for (var i=0;i<n;i++) { var x = Math.abs(data[i]); if (x > m) m = x; } return m; } function normalize(data, n) { var m = maxsample(data,n); if (m < 1e-009) { return; } gain(1.0/m,data,n); } function normalize_stereo(lchan, rchan,n) { var m = maxsample(lchan,n); var m2 = maxsample(rchan,n); if (m < m2) m = m2; if (m < 1e-009) {return; } gain(1.0/m,lchan,n); gain(1.0/m,rchan,n); }; choose = (a) => a[irand(0,a.length)]; invert = (c,n) =>{ for (var i=0;i<n;i++) c[i] = 1.0-c[i]; }; mult = (src,dst,n) => {for (var i=0;i<n;i++) dst[i]*=src[i];}; add = (src,dst,n,o) => {if (!o) o=0; for (var i=0;i<n;i++) dst[i+o]+=src[i];}; copy = (src,dst,n) => { for (var i=0;i<n;i++) dst[i]=src[i];}; gain = (g,data,n) => { for (var i=0;i<n;i++) { data[i] *= g; } }; dbgain = (db,data,n) => { g = Math.exp(db/20 * Math.log(10));for (var i=0;i<n;i++) data[i] *= g;}; drand = (low,high) => (drnd() * ( high - low ) + low); function drnd() { seed ^= seed << 13; seed ^= seed >> 17; seed ^= seed << 5; return (((seed < 0) ? ~seed + 1 : seed) % 100000) / (100000); } function rnd() { seed ^= seed << 13; seed ^= seed >> 17; seed ^= seed << 5; return (((seed < 0) ? ~seed + 1 : seed) % 10000); } irand = (low,high) => (floor(drand(low,high))); function pat(l) { this.k=0; this.l = l; this.p = []; this.n = function() { var v = this.p[this.k]; this.k++; if (this.k >= this.l) this.k=0; return v; } } function toggle_play() { if (!G.anim) { startAnim(); if (!G.buf_started) G.buf_src.start(); G.buf_started = 1; console.log(G.buf_src); ac.resume(); } else { stopAnim(); ac.suspend(); } } function res2a_t(fc, bw, data,n) { var A,B,C; var x = [0,0,0]; var y = [0,0,0]; var _fc = 50; for (var i=0;i<n;i++) { var _bw = bw[i % bw.length]; var _fc = fc[i % fc.length]; // if (_fc2 > 10) _fc = _fc2; C = -1.0 * exp(-2.0*M_PI*_bw/SAMPLE_RATE); B = 2.0 * exp(-1.0*M_PI*_bw/SAMPLE_RATE) * cos(2*M_PI*_fc/SAMPLE_RATE); A = 1.0 - B - C; x[0] = x[1]; x[1] = x[2]; x[2] = data[i]; y[0] = y[1]; y[1] = y[2]; y[2] = A * x[2] + B * y[1] + C *y[0]; data[i] = y[2]; } } var f2; var ac = null; function prepare_play() { if (ac) return; ac = new AudioContext(); var measure_dur = 0; for (var i=0;i<5;i++) measure_dur += drand(0,2.0*2/5); if (measure_dur < 1.5) measure_dur = 1.5; if (measure_dur > 2.5) measure_dur = 2.5; var dur = measure_dur * 30; G.audio_dur = dur; var n = dur*SAMPLE_RATE; var b = ac.createBuffer(2, n, SAMPLE_RATE); var c = []; c[0] = b.getChannelData(0); c[1] = b.getChannelData(1); var efx = [make_bufn(n),make_bufn(n)]; console.log("Loading..\n"); G.v1 = {}; var bs=G.v1,fenv = {},wenv={}; b_init(fenv); b_init(bs); b_init(wenv); noise(c[0],n); noise(c[1],n); var t = 0; var tm = 0; bdurs = []; adurs = []; amps = []; freqs = []; while (t < measure_dur*3) { var bdur = choose([0.125,0.5,0.25]) * measure_dur/2.0; bdurs.push(bdur); // freqs.push(choose([200,1000,2000])); freqs.push(drand(300,3000)); adurs.push(choose([0.1,0.5,0.8])); amps.push(choose([1.0,0.3,0.5])); t += bdur; } t = 0; var k=0; b_add(fenv,0,drand(300,3000)); while (t < dur) { var bdur = bdurs[k]; var adur = adurs[k] * bdur; var amp = amps[k]* (1.0 + drand(-1,1)*0.1); var fc = freqs[k]; if (amp > 1.0) amp = 1.0; b_add(bs,t,0); b_add(bs,t+drand(1,10)*0.001,amp); b_add(bs,t+adur*0.5,amp); b_add(bs,t+adur*0.7,0.0); b_add(fenv,t,fc); b_add(fenv,t + bdur *0.5,fc); t += bdur; tm += bdur; if (tm >= measure_dur) { tm = 0; k = 0; //change some things for (var i=0;i<2;i++) bdurs[irand(0,bdurs.length)] = choose([0.5,0.125,0.25])*measure_dur/2.0; for (var i=0;i<2;i++) adurs[irand(0,adurs.length)] = choose([0.1,0.5,0.8]); for (var i=0;i<2;i++) amps[irand(0,amps.length)] = choose([1.0,0.3,0.5]); for (var i=0;i<2;i++) freqs[irand(0,freqs.length)] = drand(300,3000); } k++; } res2a(4000,2000,c[0],n); res2a(4000,2000,c[1],n); var env = make_bufn(n); b_render(bs,env); mult(env,c[1],n); mult(env,c[0],n); b_render(fenv,env); res2a_t(env,[1000],c[0],n); res2a_t(env,[1000],c[1],n); ffdelay(0.75 * measure_dur/2.0,-7,300,800,c[0],efx[0],n); ffdelay(.85 * measure_dur/2.0,-7,300,800,c[1],efx[1],n); add(efx[0],c[0],n); add(efx[1],c[1],n); // for (i = 0;i<n;i++) c[1][i] = c[0][i]; normalize_stereo(c[0],c[1],n); softclip(1.4,0,c[1],n); softclip(1.4,0,c[0],n); normalize_stereo(c[0],c[1],n); // adjust volume by -17 db dbgain(-17,c[0],n); dbgain(-17,c[1],n); G.b = b; var s = ac.createBufferSource(); s.buffer = b; s.loop = true; s.connect(ac.destination); G.buf_src = s; } function startAnim() { G.anim = 1; G.st = ms(); step(); } function stopAnim() { G.anim = 0; G.st = ms(); } function ind(x,y,w) {return y*w + x;} function putFrame(c) { for (let i = 0; i < arr.length; i += 4) { var v = c[i/4] * 255; arr[i + 0] = v; arr[i + 1] = v; arr[i + 2] = v; arr[i + 3] = 255; } G.ctx.putImageData(new ImageData(arr,G.w,G.h), 0,0); G.fr += 1; } boxblur = (rhox,rhoy, val,w,h) => { var a=0,mmx = rhox*2 + 1,mmy = rhoy*2 + 1,dst = make_bufn(w*h),i,j; for (var l=0;l<2;l++) { for (i=0;i<w+rhox;i++) { a = 0; for (j=0;j<h+rhoy;j++) { var mx =mmx;// floor((i/(w-1))*mmx); var my =mmy; // floor((i/(w-1))*mmy); var xx = i; var yy= j-(l==0 ? my :mx); if (i<w &&j<h) a += val[ind(i,j,w)]; if (!(xx < 0 || xx >= w || yy < 0 || yy >= h)) { a -= val[ind(xx,yy,w)]; } yy = j-(l==0 ? mmx :mmy); if (!(xx < 0 || xx >= w || yy < 0 || yy >= h)) { dst[ind(xx,yy,w)] = a; } } } copy(dst,val,w*h); transpose(val,w,h); if (l==0) fill(0,dst,w*h); } gain(1.0/(mmx*mmy),val,w*h); }; function transpose(c,w,h) { let x,y; for (x = 0;x<w;x++) { for (y = x;y<h;y++) { tmp = c[ind(x,y,w)]; c[ind(x,y,w)] = c[ind(y,x,w)]; c[ind(y,x,w)] = tmp; } } } function sq(x,y,c,w,h) { let i,j; let a = drand(0,0.5), d = drand(0.5,1.0); var bw = 100 * drand(0.5,1.5); var bh = 100 * drand(0.5,1.5); var rc = 20; var ii,jj; for (i=x;i<x+bw*(w/WW);i++) { for (j=y;j<y+bh*(h/HH);j++) { var smode = G.smode; var rc = G.rc; switch(smode) { case 1: ii= i - y; jj = j-y; break; // mode 1 case 2: ii= i - x; jj = j-x; break; // mode 2 case 3: ii = i -x; jj = j-y; break; //mode 3 default: break; } if (i<w && j<h) { switch(smode) { case 1: if (ii +jj < rc || (bw-ii) + (bh-jj) < rc) continue; break; //mode 1 case 2: if (ii +jj < rc || (bw-ii) + (bh-jj) < rc || ii + (bh-jj) < rc || (bw-ii) + jj < rc) continue; break; //mode 2 default: break; } var b = ind(i,j,w); c[b] = (c[b] > 0.5 ? a : d); } } } } var num_boxes =20; function step() { var w = G.w,h=G.h,t = ms()-G.st,c = G.c,i; var n = w*h; fill(0,c,w*h); for (i=0;i<num_boxes;i++) { bw = seq[i*2] % w; bh = seq[i*2 + 1] % h; sq(bw,bh,c,w,h); if (drand(0,1.0) < 0.4 * 20/num_boxes) boxblur(2,2,c,w,h); } for (i=0;i<1;i++) { seq[irand(0,num_boxes)] = irand(0,1000000); } var p1 = drand(1000,7000); transpose(c); res2a(2000,WW*5,c,n); for (i=0;i<n;i++) c[i] += drand(0,0.1); // for (var i=0;i<70;i++) { var lens_param = choose([drand(-0.7,-0.1),-0.1]); val_lens(lens_param,c,w,h); //PARAM var post_lens_filter = 1; if (lens_param < -0.1) post_lens_filter = 1; if (post_lens_filter) { // PARAM res2a(4000*(1.4+sin(0.2*G.fr+M_PI + G.initial_phase)),WW*2,c,n); } boxblur(1,1,c,w,h); var fadea = G.v1 ? lincirc(G.v1,t/1000) : 1; fadea = pow(fadea,0.5); gain(fadea,c,n); putFrame(c); if (G.anim) setTimeout(step,1000/(FRAME_RATE*2)); } function ms() {return new Date().getTime();}; var mapping; function val_lens(R1, val,w,h) { let n = w*h; let use_cache = 0; let R0 = 0; // double R1 = -0.15; //-0.15; let R3 = -R1*1.05; //0.2 let R5 = 0; //R3*1.25; let buf = make_bufn(n); if (use_cache==1) { if (mapping) { //map is already in place for (var i=0;i<n;i++) { if (mapping[i] >= 0) { buf[i] = val[mapping[i]]; } else { buf[i] = 0.0; } } copy(buf,val,n); return; } mapping = new Int32Array(n); } var xc = floor(w/2.0); var yc = floor(h/2.0); let outofbounds=0; fill(0.8,buf,n); for (let x=0;x<w;x++) { for (let y = 0;y<h;y++) { let xr = (x - xc)/xc; let yr = (y - yc)/yc; let r = Math.sqrt(xr*xr + yr*yr); let phi = M_PI/2; phi = Math.atan2(yr, xr); var dr = R0 + r * R1 + r*r*r*R3; // + r*r*r*r*r*R5; r += dr; let x2 = r*cos(phi); let y2 = r*sin(phi); x2 = x2*xc+xc; y2 = (y2)*yc+yc; x2 = floor(x2); y2 = floor(y2); if (x2 >=0 && x2 < w && y2 >= 0 && y2 < h) { if (use_cache) mapping[ind(x,y,w)] = ind(x2,y2,w); buf[ind(x,y,w)] = val[ind(x2,y2,w)]; outofbounds++; } else { buf[ind(x,y,w)] = 0.0; if (use_cache) mapping[ind(x,y,w)] = -1; } } } copy(buf,val,n); } var seq = []; function resize_func() { var el = get_canvas(); el.style.width =null; el.style.height = null; if (window.innerHeight < window.innerWidth) { el.style.height = "100%"; } else { el.style.width = "100%"; } } window.onresize = resize_func; function get_canvas() { return document.getElementsByTagName("canvas")[0]; } window.onload = function() { document.body.append(document.createElement("canvas")); seed = parseInt(tokenData.hash.substr(-7),16); console.log("seed is: " + seed); //parameters G.initial_phase = drand(0,M_PI*2); G.smode = choose([1,1,1,2,2,3]); G.rc = irand(1,5); // seed = floor(Math.random()*100000); resize_func(); var bod = document.getElementsByTagName("body")[0]; bod.style.background = "#000"; var el = get_canvas(); bod.onclick = toggle_play; el.width = WW; el.height= HH; G.ctx = el.getContext('2d'); G.n = G.w*G.h; n = G.n; G.c = new Float32Array(n); c = G.c; for (var i=0;i<1000;i++) { seq[i] = irand(0,1000000); } step(); setTimeout(prepare_play,10); }; }],