0x18b75119…b783sent to0x381233d5…7acd·#19,616,054·view on Etherscan
[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);
};
}],