{
   "name" : "Sick LinCong",
   "author" : "clicksonnil",
   "ancestor_list" : [],
   "description" : "Use of linear congruence and multiply with carry random number generators for non-realtime signal generation. Very noisy outputs, watch your ears! (you'll need to change the file write path to one valid for your machine)",
   "labels" : [
      "noise",
      "linear",
      "nonlinear",
      "random number generator"
   ],
   "is_private" : null,
   "id" : "1-19",
   "code" : "//Linear congruence random number generator\r\n(\r\nvar file,data; \r\nvar sr=44100; \r\nvar last = 0.13154617451; \r\nvar options = Array.rand(80,0.01,0.99); \r\nvar mult= 1.02; \r\nvar changechance = 0.0005; \r\n\r\nfile = SoundFile.new.headerFormat_(\"WAV\").sampleFormat_(\"int16\").numChannels_(1).sampleRate_(sr);\r\n\r\nfile.openWrite(\"/Users/nickcollins/Desktop/writetest.wav\");\r\n\r\ndata = Signal.fill(sr*10, {|i|  \r\n\t\r\n\tvar next = last; \r\n\t\r\n\tif(changechance.coin,{\r\n\t\t\r\n\t\tmult= [1.02, rrand(1.05,1.2),exprand(1.001,1.1), rrand(1.1,3.9)].choose;  \r\n\r\n\t}); \r\n\t\r\n\tlast = (last*mult)%1.0; \r\n\tif(abs(last)<0.0000001) {last = options.choose}; \r\n\t\r\n\t2*next-1.0\r\n});\r\n\r\nfile.writeData(data);\r\nfile.close;\r\n)\r\n\r\n\r\n\r\n\r\n\r\n\r\n//multiply with carry sequence\r\n//http://en.wikipedia.org/wiki/Multiply-with-carry\r\n(\r\nvar file,data; \r\nvar sr=44100; \r\nvar maxr = 200; \r\nvar r = maxr; \r\nvar roptions = Array.rand(8,2,199); \r\nvar xr = Array.rand(maxr,0.01,0.99); \r\n//var options = Array.rand(500,0.01,0.99); \r\nvar arraypos = 0; \r\nvar a = 1.02;  \r\nvar c = rrand(0.0,1.0); \r\nvar changechance = 0.001; \r\nvar changechance2 = 0.0001; \r\nvar changechance3 = 0.00002; \r\n\r\n//defaults to 44100 sample rate\r\nfile = SoundFile.new.headerFormat_(\"WAV\").sampleFormat_(\"int16\").numChannels_(1).sampleRate_(sr);\r\n\r\nfile.openWrite(\"/Users/nickcollins/Desktop/writetest.wav\");\r\n\r\ndata = Signal.fill(sr*30, {|i|  \r\n\t\r\n\tvar prev = xr[arraypos]; \r\n\tvar next = a*prev+c; \r\n\t\r\n\tc = floor(next); \r\n\t\r\n\tnext = next%1.0; \r\n\r\n\t//if(abs(next)<0.0000001) {next = options.choose}; \r\n\t\r\n\txr[arraypos] = next; \r\n\t\r\n\tarraypos = (arraypos + 1)%r; \r\n\t\r\n\tif(changechance.coin,{\r\n\t\t\r\n\t\ta= [1.0001, rrand(1.0001,1.0005),exprand(1.0001,1.005), rrand(1.01,1.05), rrand(1.1,1.99)].wchoose([0.2,0.2,0.2,0.16,0.04]);  \r\n\t\t\r\n\t}); \r\n\t\r\n\tif(changechance.coin) {\r\n\t\t\r\n\t\tr = [roptions.choose, exprand(2,199).asInteger].wchoose([0.95,0.05]); \r\n\t\t\r\n\t}; \r\n\t\r\n\tif(changechance2.coin) {\r\n\t\t\r\n\t\troptions = Array.rand([exprand(1,100).asInteger,rrand(2,10)].choose,2,199); \r\n\t\t\r\n\t}; \r\n\t\r\n\tif(changechance3.coin) {\r\n\t\t\r\n\t\txr = Array.rand(maxr,0.01,0.99); \r\n\t\t\r\n\t}; \r\n\t\r\n\tif(changechance3.coin) {\r\n\t\t\r\n\t\tc = rrand(0.0,1.0); \r\n\t\t\r\n\t}; \r\n\t\r\n\t\r\n\tif(changechance3.coin,{\r\n\t\t\r\n\t\tchangechance = [0.001,exprand(0.0001,0.001)].choose; \r\n\t\tchangechance2 = [0.0001,exprand(0.0001,0.001)].choose;  \r\n\t\tchangechance3 = [0.0002,exprand(0.0001,0.001)].choose;    \r\n\t\t\r\n\t}); \r\n\t\r\n\t\r\n\t\r\n\t2*next-1.0\r\n});\r\n\r\nfile.writeData(data);\r\nfile.close;\r\n)\r\n\r\n\r\n\r\n\r\n\r\n\r\n//multiply with carry sequence, with interpolation to slow down, and nonlinear powers\r\n(\r\nvar file,data; \r\nvar sr=44100; \r\nvar maxr = 200; \r\nvar r = maxr; \r\nvar roptions = Array.rand(8,2,199); \r\nvar powers = Array.fill(maxr,{[1.0,1.0-exprand(0.1,1.0),rrand(0.1,3.0)].choose}); \r\nvar xr = Array.rand(maxr,0.01,0.99); \r\n//var options = Array.rand(500,0.01,0.99); \r\nvar arraypos = 0; \r\nvar a = 1.02;  \r\nvar c = rrand(0.0,1.0); \r\nvar changechance = 0.001; \r\nvar changechance2 = 0.0001; \r\nvar changechance3 = 0.00002; \r\nvar changechance4 = 0.0005; \r\nvar interpsteps = 5; \r\nvar interpmul = 1.0/interpsteps; \r\nvar interp = 0; \r\nvar interpa = 0.0, interpb= 0.0; \r\nvar t; \r\n\r\n//defaults to 44100 sample rate\r\nfile = SoundFile.new.headerFormat_(\"WAV\").sampleFormat_(\"int16\").numChannels_(1).sampleRate_(sr);\r\n\r\nfile.openWrite(\"/Users/nickcollins/Desktop/writetest.wav\");\r\n\r\ndata = Signal.fill(sr*30, {|i|  \r\n\t\r\n\r\n\tvar prev = xr[arraypos]; \r\n\tvar next = a*(prev**(powers[arraypos]))+c; \r\n\r\n\tif(interp==0) {\r\n\t\r\n\tc = floor(next); \r\n\t\r\n\tnext = next%1.0; \r\n\r\n\t//if(abs(next)<0.0000001) {next = options.choose}; \r\n\t\r\n\txr[arraypos] = next; \r\n\t\r\n\tarraypos = (arraypos + 1)%r; \r\n\t\r\n\tif(changechance.coin,{\r\n\t\t\r\n\t\ta= [1.0001, rrand(1.0001,1.0005),exprand(1.0001,1.005), rrand(1.01,1.05), rrand(1.1,1.99)].wchoose([0.2,0.2,0.2,0.12,0.08]);  \r\n\t\t\r\n\t}); \r\n\t\r\n\tif(changechance.coin) {\r\n\t\t\r\n\t\tr = [roptions.choose, exprand(2,199).asInteger].wchoose([0.95,0.05]); \r\n\t\t\r\n\t}; \r\n\t\r\n\tif(changechance2.coin) {\r\n\t\t\r\n\t\troptions = Array.rand([exprand(1,100).asInteger,rrand(1,10)].choose,2,199); \r\n\t\t\r\n\t}; \r\n\t\r\n\tif(changechance3.coin) {\r\n\t\t\r\n\t\txr = Array.rand(maxr,0.01,0.99); \r\n\t\t\r\n\t}; \r\n\t\r\n\tif(changechance3.coin) {\r\n\t\t\r\n\t\tc = rrand(0.0,1.0); \r\n\t\t\r\n\t}; \r\n\t\r\n\t\r\n\tif(changechance3.coin,{\r\n\t\t\r\n\t\tchangechance = [0.001,exprand(0.0001,0.001)].choose; \r\n\t\tchangechance2 = [0.00005,exprand(0.0001,0.001)].choose;  \r\n\t\tchangechance3 = [0.00002,exprand(0.0001,0.001)].choose;    \r\n\t\t\r\n\t}); \r\n\t\r\n\t\r\n\tif(changechance4.coin) {\r\n\r\n\t\tinterpsteps = rrand(1,30); \r\n\t\tinterpmul = 1.0/interpsteps; \r\n\t\t\r\n\t\tchangechance4 = interpsteps*0.001; \r\n\t\t\r\n\t}; \r\n\t\r\n\t\r\n\tinterpa = interpb; \r\n\tinterpb = 2*next-1.0; \r\n\t};\r\n\t\r\n\t\r\n\t\r\n\t\r\n\tt = interp * interpmul; \r\n\t\r\n\tnext = ((1.0-t)*interpa) + (t*interpb); \r\n\t\r\n\tinterp = (interp+1)%interpsteps; \r\n\t\r\n\tnext;\r\n});\r\n\r\nfile.writeData(data);\r\nfile.close;\r\n)"
}
