Submit
Browse
Anonymous
Login
RSS
SuperCollider Code
Fork Code: Confetti 3a: Game of Life
name
code content
s.boot; ( var maxWidth=15, maxHeight = 15; var z=40, ready = false; var newValues=Array2D.new(maxWidth + 2, maxHeight + 2); var oldValues=Array2D.new(maxWidth + 2, maxHeight + 2); var go, total; /*There is a decreasing linear connection between log(freq) and location in array: h+(maxWidth*v). Highest location-value in array = maxWidth*maxHeight log(freq)=log(maxfreq)-((log(maxfreq)-log(minfreq))*(h+(maxWidth*v))/(maxWidth*maxHeight), so freq=exp(log(maxfreq)-((log(maxfreq)-log(minfreq))*(h+(maxWidth*v))/(maxWidth*maxHeight) Furthermore freq depends on value, which is either 0 or 1. freq=freq+(freq*value) or freq=(1+value)*freq Combining those 2: freq=(exp(log(maxfreq)-((log(maxfreq)-log(minfreq))*(h+(maxWidth*v))/(maxWidth*maxHeight))*(1+value) */ SynthDef(\beeper, { arg h, v, p, maxWidth, maxHeight; var maxfreq=5000, minfreq=50; Out.ar( 0, Pan2.ar( Pulse.ar(exp(log(maxfreq)-((log(maxfreq)-log(minfreq))*(h+(maxWidth*v))/(maxWidth*maxHeight)))*(1+p), 0.5, 0.3), 2*h/maxWidth-1, //pan depends on column in array 1 ) ); }).add; w=Window("Confetti3", Rect(400, 300, z*(maxWidth+2), z*(maxHeight+2))).front; w.view.background_(Color.white); w.front; w.drawFunc = { for (1, maxHeight, {arg v; for (1, maxWidth, {arg h; if (newValues[h,v]==0, {Pen.fillColor=Color.white}, {Pen.fillColor=Color.black} ); Pen.addRect(Rect(h*z, v*z, z, z)); Pen.fill; }); }); }; go=Routine({ //make random pattern for (1, maxWidth, {arg h; for (1, maxHeight, {arg v; newValues[h,v]=[0, 1].choose; {w.refresh}.defer; p=newValues[h,v]; b=Synth("beeper",[p: p, h: h, v: v, maxWidth: maxWidth, maxHeight: maxHeight]); 0.1.wait; b.free; }) }); while ({ready==false},{ //copy edges of board to edges of array for(1, maxWidth, {arg h; newValues[h,0]=newValues[h, maxHeight]; newValues[h, maxHeight+1]=newValues[h, 1]; }); for(1, maxHeight, {arg v; newValues[ 0, v]=newValues[maxWidth, v]; newValues[maxWidth+1, v]=newValues[1, v]; }); newValues[0,0]=newValues[maxWidth, maxHeight]; newValues[0, maxHeight+1]=newValues[maxWidth, 1]; newValues[maxWidth+1, 0]=newValues[1, maxHeight]; newValues[maxWidth+1, maxHeight+1]=newValues[1,1]; //copy newValues to oldValues (including edges) for (0, maxWidth+1, {arg h; for (0, maxHeight+1, {arg v; oldValues[h,v]=newValues[h,v]; }) }); //adapt for (1, maxWidth,{arg h; for (1, maxHeight, {arg v; total=oldValues[h-1,v-1] + oldValues[h,v-1] + oldValues[h+1,v-1] + oldValues[h-1,v]+ oldValues[h+1,v] + oldValues[h-1,v+1] + oldValues[h,v+1] + oldValues[h+1,v+1]; if( (total<=1 )|| (total > 3), {newValues[h,v]=0} ); if( total==3, {newValues[h,v]=1} ); {w.refresh}.defer; if (newValues[h,v]!=oldValues[h,v],{ p=newValues[h,v]; b=Synth("beeper",[p: p, h: h, v: v, maxWidth: maxWidth, maxHeight: maxHeight]); 0.1.wait; b.free; }); }) }); //check if ready ready=true; for (1, maxWidth,{arg h; for (1, maxHeight, {arg v; if (oldValues[h,v]!=newValues[h,v], {ready=false}); }) }); }); }); go.play; )
code description
It is relatively simple to convert Confetti3 ( http://sccode.org/1-4YU )to John Conway's Game of Life. You just need to change the rules and make sure that any creature that runs of the board returns at the other side. It may be a good idea to speed things a bit up. This may be achieved by using the Xenakis-inspired version: http://sccode.org/1-4YW .
use markdown for formating
category tags
comma separated, i.g. "wild, siren" (do not enter default SC class names, please)
ancestor(s)
comma separated identificators, i.g. "1-C,1-1,1-4M,1-x"
Private?
the code will be accessible by direct url and not visible in public activity
signup to submit public code without captcha
comment of change