JavaScript
let keys = ["cb","c","c#","db","d","eb","e","f","f#","gb","g","a","ab","bb","b",
"a#m","d#m","g#m","c#m","f#m","bm","em","am","dm","gm","cm","fm","bbm","ebm","abm"];
let keys_major = ["cb","c","c#","db","d","eb","e","f","f#","gb","g","a","ab","bb","b"];
let keys_minor = ["a#m","d#m","g#m","c#m","f#m","bm","em","am","dm","gm","cm","fm","bbm","ebm","abm"];
let barlength = 1024;
let numbars = 80;
let progression = [];
let maxlength = barlength*numbars;
let onlyminor = true;
let onlymajor = false;
let key = onlymajor?keys_major[Math.floor(Math.random()*keys_major.length)]:onlyminor?keys_minor[Math.floor(Math.random()*keys_minor.length)]:keys[Math.floor(Math.random()*keys.length)];
let keychanges = [];
let blockchords = true;
let I = [];
let II = [];
let III = [];
let IV = [];
let V = [];
let VI = [];
let VII = [];
let scale = [];
let allowedchords = [1,4,5];
init();
function updateScales(){
console.log("Updating scales - " + key);
//Major
if(key == "cb") scale = ["cb", "db", "eb", "fb", "gb", "ab", "bb"];
if(key == "c") scale = ["c", "d", "e", "f", "g", "a", "b"];
if(key == "c#") scale = ["c#", "d#", "e#", "f#", "g#", "a#", "b#"];
if(key == "db") scale = ["db", "eb", "f", "gb", "ab", "bb", "c"];
if(key == "d") scale = ["d", "e", "f#", "g", "a", "b", "c#"];
if(key == "e") scale = ["e", "f#", "g#", "a", "b", "c#", "d#"];
if(key == "eb") scale = ["eb", "f", "g", "ab", "bb", "c", "d"];
if(key == "f") scale = ["f", "g", "a", "bb", "c", "d", "e"];
if(key == "f#") scale = ["f#", "g#", "a#", "b","c#", "d#", "e#"];
if(key == "gb") scale = ["gb", "ab", "bb","cb", "db", "eb", "f"];
if(key == "g") scale = ["g", "a", "b","c", "d", "e", "f#"];
if(key == "a") scale = ["a", "b","c#", "d", "e", "f#", "g#"];
if(key == "ab") scale = ["ab", "bb","c", "db", "eb", "f", "g"];
if(key == "bb") scale = ["bb","c", "d", "eb", "f", "g", "a"];
...