{
   "description" : "A simple melody algorithmically generated with a Markov Chain.",
   "ancestor_list" : [],
   "name" : "Markov Chain Experiment II",
   "author" : "Jacob Joaquin",
   "id" : "1-O",
   "is_private" : null,
   "code" : "/* Markov Chain Experiment II\r\n   Jacob Joaquin\r\n\r\n   Get a visual representation of the Markov Chain here:\r\n   http://codehop.com/supercollider-markov-chain/\r\n*/\r\n\r\n(\r\n// Synthesizer\r\nSynthDef(\\my_synth, {|dur = 1.0, amp = 1.0, freq = 440|\r\n\tvar env = EnvGen.ar(Env.new([1, 0.1, 0], [0.06, dur - 0.06]), doneAction: 2);\r\n\tOut.ar([0, 1], SinOsc.ar([freq * 0.995, freq * 1.005], 0, env * amp))\r\n}).add;\t\t\r\n\r\n// Create task\r\nt = Task({\r\n\t// Set attributes of each node\r\n\t// [freq, dur, [[next_state, weighted_random],…]]\r\n\tvar node_list = [\r\n\t\t[60, 1, [[1, 2]]],\r\n\t\t[62, 0.5, [[0, 1], [2, 1]]],\r\n\t\t[63, 1, [[0, 1], [3, 1]]],\r\n\t\t[65, 0.5, [[0, 1], [3, 4], [4, 1]]],\r\n\t\t[67, 1, [[5, 1]]],\r\n\t\t[70, 1.5, [[4, 1], [6, 2]]],\r\n\t\t[69, 1, [[4, 1], [7, 2]]],\r\n\t\t[72, 0.5, [[4, 1], [7, 4], [0, 2]]]\r\n\t];\r\n\r\n\tvar node_index = 0;\r\n\tvar bps = 133.0 / 60.0;  // Beats per second\r\n\t\r\n\tinf.do({\r\n\t\tvar weight = 0;\r\n\t\tvar random;\r\n\t\tvar accumulator;\r\n\t\tvar node = node_list[node_index];\t\t\r\n\t\tvar freq = node[0].midicps;\r\n\t\tvar dur = node[1] / bps;\r\n\t\tvar paths = node[2];\r\n\t\t\r\n\t\t// Get total statistical weight of connected nodes\r\n\t\t(0 .. paths.size - 1).do {|i| weight = weight + paths[i][1]};\r\n\t\t\r\n\t\t// Generate random value for choosing next node\r\n\t\trandom = weight.rand;\r\n\r\n\t\t// Choose next node based on statistical weights\r\n\t\taccumulator = paths[0][1];\r\n\t\t\t\t\r\n\t\tnode_index = block {|break|\r\n\t\t\tpaths.size.do {|i|\r\n\t\t\t\tif ((random < accumulator), {\r\n\t\t\t\t\tbreak.value(paths[i][0])\r\n\t\t\t\t}, {\r\n\t\t\t\t\taccumulator = accumulator + paths[i + 1][1]\t\t\t\t\t\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\t// Play\r\n\t\tSynth(\\my_synth, [\\dur, dur, \\amp, -3.dbamp, \\freq, freq]);\t\t\t\t\t\r\n\t\tdur.wait;\r\n\t})\r\n});\r\n\r\nt.start;\r\n)",
   "labels" : [
      "markov chain"
   ]
}
