{
   "code" : "// reading in mono\r\n~buf1 = Buffer.readChannel(s, \"file.wav\", 0, -1, [0]);\r\n~buf2 = Buffer.readChannel(s, \"anotherfile.wav\",0, -1, [0]);\r\n\r\n\r\n~buf1.loadToFloatArray(action: {|array| ~array1 = array})\r\n~buf2.loadToFloatArray(action: {|array| ~array2 = array})\r\n\r\n~array = ~array1 ++ ~array2;\r\n\r\n~mkv = Dictionary.new;\r\n\r\n// Number of frames to create the chain\r\n~slices=3\r\n\r\n// Generate markov chain\r\n(~array.size/~slices).do {|idx| \r\n\tvar i = (idx * ~slices).asInt; \r\n\tvar v = ~array[i..i+~slices-1];\r\n\t~mkv[v] = ~mkv[v] ++ [~array[i+~slices..i+~slices+~slices-1]];\r\n};\r\n\r\n\r\n// New buffer to store generated frames\r\n~gen.free; ~gen = Buffer.alloc(s, ~array.size, 1);\r\n\r\n// Pick a random start\r\n~last = ~mkv.keys.asArray.choose;\r\n\r\n(~array.size/10).do{|i|\r\n\t~last.do {|j,c|\r\n\t\t~gen.set((i*~slices+c).asInt, j);\r\n\t};\r\n\t~last=~mkv[~last].choose;\r\n};\r\n\r\n// listen to generated buffer\r\n~gen.play;",
   "id" : "1-5ca",
   "is_private" : null,
   "labels" : [
      "generative",
      "markov",
      "buffers"
   ],
   "description" : "",
   "ancestor_list" : [],
   "author" : "bgola",
   "name" : "markov buffer"
}
