{
   "ancestor_list" : [],
   "description" : "Generating minimal music by repeating a random chord over and over again, varying individual note volumes (and after a while also timings) to bring out different aspects of the chord. Every time you run it, it will generate a new piece. I use it with in combination with a virtual piano. The code is the result of experimentation and is not cleaned up; may still contain useless statements :)",
   "name" : "One chord requiem",
   "author" : "56228375",
   "id" : "1-5hc",
   "is_private" : null,
   "code" : "(\r\ns.waitForBoot({\r\n\tvar midiout;\r\n\tvar no_of_bins;\r\n\tvar bins = Set[];\r\n\tvar table;\r\n\tvar lut;\r\n\tvar period = 127;\r\n\tvar phase = 0;\r\n\tvar rangemin = 20;\r\n\tvar rangemax = 80;\r\n\tvar strum = 0.0025.neg;\r\n\tvar delay_between_chords = 0.25;\r\n\tvar direction = 1;\r\n\tvar stopit = false;\r\n\tvar idx = 0;\r\n\tvar ampmod = 1.0;\r\n\r\n\tCmdPeriod.doOnce{\r\n\t\t127.do({\r\n\t\t\t|note|\r\n\t\t\tmidiout.noteOff(1, note);\r\n\t\t});\r\n\t};\r\n\tif (MIDIClient.initialized.not) { MIDIClient.init; };\r\n\tmidiout = MIDIOut.new(0);\r\n\tno_of_bins = 24;\r\n\ttable = {\r\n\t\t| period, phase, rangemin, rangemax |\r\n\t\t127.collect({\r\n\t\t\t|time|\r\n\t\t\tsin(2pi*time/period + phase).linlin(-1, 1, rangemin, rangemax);\r\n\t\t});\r\n\t};\r\n\r\n\tbins = Set[];\r\n\twhile ({bins.size < no_of_bins}) {\r\n\t\tbins = bins.add(20.rrand(100));\r\n\t};\r\n\tbins = bins.asList.sort;\r\n\tidx = 0;\r\n\r\n\twhile({stopit.not}) {\r\n\t\tvar wrappedidx = idx.mod(127);\r\n\t\tidx.postln;\r\n\t\tif (idx.mod(127) == 0) {\r\n\t\t\tperiod = period / 2;\r\n\t\t\tlut = table.(period, phase, rangemin, rangemax);\r\n\t\t\tdirection = direction.neg;\r\n\t\t\t//lut.debug(\"new lut\");\r\n\t\t\tdirection.debug(\"new direction\");\r\n\t\t};\r\n\t\tif (idx.mod(127*2*2) == 0) {\r\n\t\t\tstrum = strum + 0.0025;\r\n\t\t\tdelay_between_chords = delay_between_chords * 0.9;\r\n\t\t\tstrum.debug(\"new strum\");\r\n\t\t\tbins = bins.scramble;\r\n\t\t\tbins.debug(\"new order\");\r\n\t\t};\r\n\t\tif ((idx > 0) && (idx.mod(890) == 0)) {\r\n\t\t\tstrum = 0.01;\r\n\t\t\tbins = bins.scramble;\r\n\t\t};\r\n\t\tif (idx > 890) {\r\n\t\t\tdirection = direction * [1,-1].choose; // one last chaotic period\r\n\t\t\tperiod = period * 2.6329.rrand(1.0/2.6329);\r\n\t\t\tampmod = ampmod * 0.97;\r\n\t\t\tstrum = strum * 1.2;\r\n\t\t\tdelay_between_chords = delay_between_chords * 0.9;\r\n\t\t};\r\n\t\tif (idx == 915) {\r\n\t\t\tstopit = true;\r\n\t\t\t\"preparing to stop....\".postln;\r\n\t\t};\r\n\t\tbins.do({\r\n\t\t\t|bin|\r\n\t\t\tvar finalidx = (wrappedidx + (bin*direction)).wrap(0, 126);\r\n\t\t\tmidiout.noteOn(1, bin, ampmod * lut[finalidx]);\r\n\t\t\tstrum.wait;\r\n\t\t});\r\n\t\tdelay_between_chords.wait;\r\n\t\tbins.do({\r\n\t\t\t|bin|\r\n\t\t\tmidiout.noteOff(1, bin);\r\n\t\t});\r\n\r\n\t\tidx = idx+1;\r\n\t};\r\n\tmidiout.control(1, 64, 127);\r\n\t127.do({\r\n\t\t|note|\r\n\t\tmidiout.noteOff(1, note);\r\n\t});\r\n\r\n\t10.wait;\r\n\tmidiout.control(1, 64, 0);\r\n\t\"The End.\".postln;\r\n});\r\n)",
   "labels" : [
      "midi",
      "minimal",
      "generative",
      "piano",
      "chord"
   ]
}
