### Diff from Confetti 3a: Game of Life by henklass (14 May'15 17:38) to Confetti3aX, John Conway's Game of Life; fast, Xenakis-inspired version by henklass (14 May'15 17:48)

##### name
Confetti 3a:X, John Conway's Game of Life; fast, Xenakis-inspired version
##### description
It is relatively simple to convert Confetti3 ( http://sccode.org/1-4YU )to John Conway's Game of Life., You just nXeed to change the rules and make isu-inspired that any crveature that runs iofn withe bloard returns atof synthes oswitcher side. Iton maby be a good lidvea to cellsp. Theed thingslow, a 1-bit -mup. This may be achiec ved by ursiong the Xencakis-inspired vbersi foun:d at http://sccode.org/1-4YWV .
##### code
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.302), 2*h/maxWidth-1, //pan depends on column in array 1 ) ); }).add; ) ( var maxWidth=45, maxHeight = 45; var z=15, ready = false; var newValues=Array2D.new(maxWidth + 2, maxHeight + 2); var oldValues=Array2D.new(maxWidth + 2, maxHeight + 2); var beepers=Array2D.new(maxWidth + 1, maxHeight + 1); var go, total; 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.reifresh}.defer; p= (newValues[h,v];==1, { beepers[h,v]=Synth("beeper",[p: p, h: h, v: v, maxWidth: maxWidth, maxHeight: maxHeight]); 0.1.wait}); }) b}); {w.refresh}.defer; }) })0.03.wait; 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=if (newValues[h,v];==1, { beepers[h,v]=Synth("beeper",[p: p, h: h, v: v, maxWidth: maxWidth, maxHeight: maxHeight]); 0.1.wait;}, { beepers[h,v].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}); }) }); {w.refresh}.defer; 0.1.wait; }); }); go.play; )
##### category tags
random, graphics, 1bit randomus, xenakics, conways game of life
1-4YU, 1-4YV