{
   "labels" : [
      "rhythm",
      "metronome",
      "brownian",
      "relabi"
   ],
   "code" : "//A metronome that mutates beat locations using something like Brownian Motion\r\n\r\n(\r\nSynthDef.new(\\block, {\r\n\targ freq=1000;\r\n\tvar sig, env;\r\n\tsig = Impulse.ar(0)*10;\r\n\tsig = SVF.ar(sig, freq, 0.9);\r\n\tenv = EnvGen.ar(Env.perc(0.01, 1), 1, doneAction: 2);\r\n\tsig = sig*env;\r\n\tsig = sig!2;\r\n\tOut.ar(0, sig);\r\n}).add;\r\n)\r\n\r\n(\r\nSynthDef.new(\\clip, {\r\n\targ freq=1000, res = 0.1;\r\n\tvar sig, env;\r\n\tsig = ClipNoise.ar()*0.1;\r\n\tsig = SVF.ar(sig, freq, res);\r\n\tenv = EnvGen.ar(Env.perc(0.01, 0.05), 1, doneAction: 2);\r\n\tsig = sig*env;\r\n\tsig = sig!2;\r\n\tOut.ar(0, sig);\r\n}).add;\r\n)\r\n\r\n\r\nx = Synth.new(\\block, [\\freq, 1000]);\r\nx = Synth.new(\\block, [\\freq, 800]);\r\n\r\n\r\n//mutating 4/4 metronome\r\n(\r\n~mutro = {\r\n\tvar  i = 0, deltas, randos, out, maxStep;\r\n\tdeltas = List[0.7, 0.7, 0.7, 0.7]; //starting deltas for each beat\r\n\trandos = List[0, 0, 0, 0]; //random values for each beat, first bar plays straight as randos are all 0\r\n\tmaxStep = deltas[0]/10;\r\n\tloop{\r\n\t\tout = ((deltas[i] - randos[(i-1)%(deltas.size)] + randos[i]).abs); //if the first beat is pushed back by 0.2s, the second beat is moved forward 0.2s to keep it in roughly the same position before rando is added\r\n\t\tout.yield;\r\n\t\ti = (i+1)%(deltas.size);\r\n\t\tif(i%(deltas.size) == 0, //adds random value to each term of random array on beat one of each bar after bar 1\r\n\t\t\t{randos = randos.collect({arg item, i; item+(rrand(-1* maxStep, maxStep))})}\r\n\t\t\t//{\"test\".postln}\r\n\t\t);\r\n\t};\r\n};\r\n\r\n\r\n\r\nPbind(\r\n\t\\instrument, \\block,\r\n\t\\freq, Pseq([1000, 800, 800, 800], inf),\r\n\t\\dur, Prout(~mutro);\r\n).play;\r\n\r\n)\r\n\r\n\r\n//mutating triplets\r\n(\r\n~mutroblock = {\r\n\tvar  i = 0, deltas, randos, out, maxStep;\r\n\tdeltas = List[0.8, 0.8, 0.8, 0.8]; //starting deltas for each beat\r\n\trandos = List[0, 0, 0, 0]; //random values for each beat, first bar plays straight as randos are all 0\r\n\tmaxStep = deltas[0]/40;\r\n\tloop{\r\n\t\tout = ((deltas[i] - randos[(i-1)%(deltas.size)] + randos[i]).abs); //if the first beat is pushed back by 0.2s, the second beat is moved forward 0.2s to keep it in roughly the same position before rando is added\r\n\t\tout.yield;\r\n\t\ti = (i+1)%(deltas.size);\r\n\t\tif(i%(deltas.size) == 0, //adds random value to each term of random array on beat one of each bar after bar 1\r\n\t\t\t{randos = randos.collect({arg item, i; item+(rrand(-1* maxStep, maxStep))})}\r\n\t\t\t//{\"test\".postln}\r\n\t\t);\r\n\t};\r\n};\r\n\r\n~mutroclip = {\r\n\tvar  i = 0, deltas, randos, out, maxStep;\r\n\tdeltas = List[0.8*(1/3), 0.8*(1/3), 0.8*(1/3)];\r\n\trandos = List[0, 0, 0];\r\n\tmaxStep = deltas[0]/40;\r\n\tloop{\r\n\t\tout = ((deltas[i] - randos[(i-1)%(deltas.size)] + randos[i]).abs);\r\n\t\tout.yield;\r\n\t\ti = (i+1)%(deltas.size);\r\n\t\tif(i%(deltas.size) == 0,\r\n\t\t\t{randos = randos.collect({arg item, i; item+(rrand(-1* maxStep, maxStep))})}\r\n\t\t);\r\n\t};\r\n};\r\n\r\n\r\n\r\nPbind(\r\n\t\\instrument, \\block,\r\n\t\\freq, Pseq([1000, 800, 800, 800], inf),\r\n\t\\dur, Prout(~mutroblock);\r\n).play;\r\n\r\nPbind(\r\n\t\\instrument, \\clip,\r\n\t\\freq, Pseq([10000, 9000, 8000], inf),\r\n\t\\res, Pseq([0.1, 0.2, 0.3, 0.1], inf),\r\n\t\\dur, Prout(~mutroclip);\r\n).play;\r\n\r\n\r\n)",
   "is_private" : null,
   "id" : "1-5fQ",
   "author" : "eli.rosenkim",
   "name" : "mutronome (brownian motion of beats)",
   "description" : "beat absolute locations rather than deltas meander randomly each cycle",
   "ancestor_list" : []
}
