{
   "ancestor_list" : [],
   "description" : "Seems simple but actually solves a big problem. I've written out an example based on the Christ lag. Total newbie here. There's probably a much more convenient way to do this; I'd love some advice.",
   "author" : "bramtayl",
   "name" : "Chord progressions in just intonation",
   "id" : "1-5aB",
   "is_private" : null,
   "code" : "~unity = 1/1;\r\n~minor_3rd = 6/5;\r\n~major_3rd = 5/4;\r\n~major_5th = 3/2;\r\n~major_6th = 12/7;\r\n~minor_7th = 7/4;\r\n~minor = [~unity, ~minor_3rd, ~major_5th];\r\n~minor_6 = ~minor ++ ~major_6th;\r\n~major = [~unity, ~major_3rd, ~major_5th];\r\n~major_7 = ~major ++ ~minor_7th;\r\n\r\n~note = {\r\n    arg half_steps_above_A;\r\n    440 * (2 ** (half_steps_above_A / 12))\r\n};\r\n\r\n~noise = {\r\n    arg bass, chord; var full_chord, amplitude, side;\r\n    while({bass < 150}, {bass = bass * 2});\r\n    while({bass > 300}, {bass = bass / 2});\r\n    full_chord = {arg octave;\r\n        chord * octave\r\n    }.flop.value(2 ** Array.series(3)).flat;\r\n    amplitude = 4 / 5 / full_chord.size;\r\n    side = Mix.new(\r\n        {arg ratio; var frequency;\r\n            frequency = bass * ratio;\r\n            SinOsc.ar(frequency, 0, amplitude) * AmpCompA.kr(frequency)\r\n        }.flop.value(full_chord)\r\n    );\r\n    [side, side];\r\n};\r\n\r\n~sound = 0;\r\n~play = {\r\n    arg clock, time, bass, chord;\r\n    clock.sched(time, {~sound.free; ~sound = {~noise.value(bass, chord)}.play});\r\n};\r\n~kill = {\r\n    arg clock, time;\r\n    clock.sched(time, {~sound.free});\r\n};\r\n\r\n~bass = ~note.value(7);\r\n~time = 0;\r\n~clock = TempoClock.new(60/60);\r\n                                          ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  2   ; // christ\r\n~bass = ~bass /  ~minor_7th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // je-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  2   ; // sus lay\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // in\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // death's\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // strong\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // bands\r\n                                          ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // for\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // our\r\n~bass = ~bass *  ~major_5th * ~minor_3rd; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // of-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time + (1/2); // fe-\r\n~bass = ~bass               * ~major_3rd; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time + (1/2); // en-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // ces-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor_6); ~time = ~time +  1   ; // gi-\r\n~bass = ~bass /  ~major_5th * ~major_6th; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // i-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  4   ; // ven. therefore\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // let\r\n                                          ~play.value(~clock, ~time, ~bass, ~minor_6); ~time = ~time +  1   ; // us\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // keep\r\n~bass = ~bass *  ~major_5th * ~minor_3rd; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // the\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  2   ; // feast and\r\n~bass = ~bass               / ~minor_3rd; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // sing\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // to\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // god\r\n~bass = ~bass * (~major_5th**2)         ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // right\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // thank-\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // ful-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // ly\r\n~bass = ~bass *  ~major_5th * ~minor_3rd; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // loud\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // songs\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  2   ; // of hal\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // leh\r\n~bass = ~bass /  ~major_5th / ~minor_3rd; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // lu\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // u-\r\n~bass = ~bass /  ~major_5th / ~major_3rd; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  2   ; // jah\r\n~bass = ~bass *  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // hal-\r\n~bass = ~bass               * ~major_3rd; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // al-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~minor  ); ~time = ~time +  1   ; // le\r\n~bass = ~bass               / ~major_3rd; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  1   ; // eh-\r\n~bass = ~bass               / ~minor_3rd; ~play.value(~clock, ~time, ~bass, ~minor_6); ~time = ~time +  1   ; // lu-\r\n~bass = ~bass /  ~major_5th * ~major_6th; ~play.value(~clock, ~time, ~bass, ~major_7); ~time = ~time +  1   ; // u-\r\n~bass = ~bass /  ~major_5th             ; ~play.value(~clock, ~time, ~bass, ~major  ); ~time = ~time +  2   ; // jah\r\n                                          ~kill.value(~clock, ~time                 )",
   "labels" : [
      "chords",
      "just intonation",
      "chord progressions",
      "harmony",
      "music theory",
      "tuning"
   ]
}
