{
   "code" : "q = ();\r\n\r\nq.registerSize = 16;\r\nq.rbuf = RingBuffer(q.registerSize);\r\n\r\n// parameters, can be changed while playing\r\nq.min = \"C2\".namemidi.asInteger;\r\nq.max = \"C6\".namemidi.asInteger;\r\nq.waitTime = 0.05; // in seconds\r\n\r\nq.chance = 0.1;\r\nq.change = 10; // step size\r\n\r\n\r\n(\r\n// initialise\r\nq.registerSize.do{\r\n\tq.rbuf.overwrite(rrand(q.min, q.max));\r\n};\r\n\r\n// do one step\r\nq.step = {|q, rbuf, chance, step, min, max|\r\n\tvar item;\r\n\titem = rbuf.pop;\r\n\t(chance.coin).if{\r\n\t\t// apply brown noise, bounce back from constraints.\r\n\t\t//\"+++++++ change! % >> \".postf(item);\r\n\t\titem = (item + step.xrand2).fold(min, max); \r\n\t\titem; //.postln;\r\n\t};\r\n\trbuf.add(item);\r\n\titem; // return (altered) item\r\n};\r\n\r\n(\r\nTdef(\\steppr, {\r\n\tvar midinote;\r\n\tloop{\r\n\t\tmidinote = q.step(q.rbuf, q.chance, q.change, q.min, q.max); \r\n\t\t\r\n\t\t// debug output\r\n\t\t// q.rbuf.asArray.postln;\r\n\t\t\r\n\t\t// play the current note, can be basically everything\r\n\t\t(\r\n\t\t\tmidinote: midinote, \r\n\t\t\tsustain:  0.05, \r\n\t\t\tdur:      0.2, \r\n\t\t\tamp:      0.2\r\n\t\t).play;\r\n\t\t\r\n\t\tq.waitTime.wait;\r\n\t}\r\n})\r\n);\r\n)\r\n\r\n\r\n// start\r\nTdef(\\steppr).play\r\n\r\n// stop\r\nTdef(\\steppr).stop",
   "is_private" : null,
   "id" : "1-4SE",
   "labels" : [
      "code fork",
      "sequencer",
      "algorithmic composing"
   ],
   "ancestor_list" : [
      "1-4SD"
   ],
   "description" : "wiard noise ring variation using a ringbuffer instead of bitshifting.\r\nReimplemented according to Julian Parker's m4l patch.",
   "name" : "wiard noise ring variation using a ringbuffer instead of bitshifting, language implementation (task-based)",
   "author" : "LFSaw"
}
