Advertisement
Guest User

Untitled

a guest
Dec 9th, 2017
801
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.57 KB | None | 0 0
  1. require('console.log');
  2.  
  3. let keys = ["cb","c","c#","db","d","eb","e","f","f#","gb","g","a","ab","bb","b",
  4. "a#m","d#m","g#m","c#m","f#m","bm","em","am","dm","gm","cm","fm","bbm","ebm","abm"];
  5.  
  6. let keys_major = ["cb","c","c#","db","d","eb","e","f","f#","gb","g","a","ab","bb","b"];
  7. let keys_minor = ["a#m","d#m","g#m","c#m","f#m","bm","em","am","dm","gm","cm","fm","bbm","ebm","abm"];
  8.  
  9. let barlength = 1024;
  10. let numbars = 80;
  11. let progression = [];
  12. let maxlength = barlength*numbars;
  13.  
  14. let onlyminor = true;
  15. let onlymajor = false;
  16. 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)];
  17. let keychanges = [];
  18. let blockchords = true;
  19.  
  20. let I = [];
  21. let II = [];
  22. let III = [];
  23. let IV = [];
  24. let V = [];
  25. let VI = [];
  26. let VII = [];
  27.  
  28. let scale = [];
  29.  
  30. let allowedchords = [1,4,5];
  31.  
  32.  
  33. init();
  34.  
  35. function updateScales(){
  36. console.log("Updating scales - " + key);
  37. //Major
  38. if(key == "cb") scale = ["cb", "db", "eb", "fb", "gb", "ab", "bb"];
  39. if(key == "c") scale = ["c", "d", "e", "f", "g", "a", "b"];
  40. if(key == "c#") scale = ["c#", "d#", "e#", "f#", "g#", "a#", "b#"];
  41. if(key == "db") scale = ["db", "eb", "f", "gb", "ab", "bb", "c"];
  42. if(key == "d") scale = ["d", "e", "f#", "g", "a", "b", "c#"];
  43. if(key == "e") scale = ["e", "f#", "g#", "a", "b", "c#", "d#"];
  44. if(key == "eb") scale = ["eb", "f", "g", "ab", "bb", "c", "d"];
  45. if(key == "f") scale = ["f", "g", "a", "bb", "c", "d", "e"];
  46. if(key == "f#") scale = ["f#", "g#", "a#", "b","c#", "d#", "e#"];
  47. if(key == "gb") scale = ["gb", "ab", "bb","cb", "db", "eb", "f"];
  48. if(key == "g") scale = ["g", "a", "b","c", "d", "e", "f#"];
  49. if(key == "a") scale = ["a", "b","c#", "d", "e", "f#", "g#"];
  50. if(key == "ab") scale = ["ab", "bb","c", "db", "eb", "f", "g"];
  51. if(key == "bb") scale = ["bb","c", "d", "eb", "f", "g", "a"];
  52. if(key == "b") scale = ["b","c#", "d#", "e", "f#", "g#", "a#"];
  53.  
  54. //Minor
  55. if(key == "a#m") scale = ["a", "a#", "b#","c#", "d#", "e#", "f#"];
  56. if(key == "d#m") scale = ["d#", "e#", "f#", "g#", "a#", "b","d"];
  57. if(key == "g#m") scale = ["g", "g#", "a#", "b","c#", "d#", "e"];
  58. if(key == "c#m") scale = ["c#", "d#", "e", "f#", "g#", "a", "c"];
  59. if(key == "f#m") scale = ["f#", "g#", "a", "b","c#", "d", "f"];
  60. if(key == "bm") scale = ["b","c#", "d", "e", "f#", "g", "a#"];
  61. if(key == "em") scale = ["e", "f#", "g", "a", "b","c", "d#"];
  62. if(key == "am") scale = ["a", "b","c", "d", "e", "f", "g#"];
  63. if(key == "dm") scale = ["d", "e", "f", "g", "a", "bb","c#"];
  64. if(key == "gm") scale = ["g", "a", "bb","c", "d", "eb", "f#"];
  65. if(key == "cm") scale = ["c", "d", "eb", "f", "g", "ab", "b"];
  66. if(key == "fm") scale = ["f", "g", "ab", "bb","c", "db", "e"];
  67. if(key == "bbm") scale = ["bb","c", "db", "eb", "f", "gb", "a"];
  68. if(key == "ebm") scale = ["eb", "f", "gb", "ab", "bb","cb", "d"];
  69. if(key == "abm") scale = ["ab", "bb","cb", "db", "eb", "fb", "g"];
  70.  
  71. I = [scale[0], scale[2], scale[4]];
  72. II = [scale[1], scale[3], scale[5]];
  73. III = [scale[2], scale[4], scale[6]];
  74. IV = [scale[3], scale[5], scale[0]];
  75. V = [scale[4], scale[6], scale[1]];
  76. VI = [scale[5], scale[0], scale[2]];
  77. VII = [scale[6], scale[1], scale[3]];
  78. }
  79.  
  80. function init(){
  81. updateScales();
  82. for(let i=0; i<numbars; i++){
  83. let valid = false;
  84. while(!valid){
  85. let p = 1+Math.floor(Math.random()*7);
  86. if(allowedchords.includes(p)){
  87. if(i > 0 && progression[i-1] == p){
  88. valid = false;
  89. }
  90. else{
  91. valid = true;
  92. }
  93. if(valid){
  94. if(p == 1){
  95. progression.push(1);
  96. }
  97. else if(p == 2){
  98. progression.push(2);
  99. }
  100. else if(p == 3){
  101. progression.push(3);
  102. }
  103. else if(p == 4){
  104. progression.push(4);
  105. }
  106. else if(p == 5){
  107. progression.push(5);
  108. }
  109. else if(p == 6){
  110. progression.push(6);
  111. }
  112. else if(p == 7){
  113. progression.push(7);
  114. }
  115. }
  116. }
  117. }
  118. }
  119.  
  120. keychanges = [[key, 0]]
  121. let nk = 4;
  122. for(let i=0; i<nk-1; i++){
  123. let k = 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)];
  124. keychanges.push([k, (i+1)*numbars/nk]);
  125. }
  126.  
  127. generate();
  128.  
  129. }
  130.  
  131. function intToChord(i){
  132. if(i == 1) return I;
  133. if(i == 2) return II;
  134. if(i == 3) return III;
  135. if(i == 4) return IV;
  136. if(i == 5) return V;
  137. if(i == 6) return VI;
  138. if(i == 7) return VII;
  139. }
  140.  
  141. function generate(){
  142. let fs = require('fs');
  143. let Midi = require('jsmidgen');
  144.  
  145. let file = new Midi.File();
  146.  
  147.  
  148. let tracks = [];
  149. /*
  150. let track = new Midi.Track();
  151. let track2 = new Midi.Track();
  152. */
  153.  
  154. tracks.push(new Midi.Track());
  155. tracks.push(new Midi.Track());
  156. //tracks.push(new Midi.Track());
  157.  
  158. for(let i=0; i<tracks.length; i++){
  159. file.addTrack(tracks[i]);
  160. }
  161.  
  162. tracks[0].instrument(0, 0);
  163. tracks[1].instrument(1, 0);
  164. //tracks[1].instrument(1, 1);
  165.  
  166. for(let t=0; t<tracks.length; t++){
  167. let currenttime = 0;
  168.  
  169. if(t < tracks.length-1){
  170. let lastlength = 0;
  171. let lastn = -1;
  172. let lastbar = -1;
  173. while(currenttime < maxlength-1){
  174. let bar = Math.floor(currenttime/barlength);
  175. console.log(bar);
  176. let slowdown = false;
  177. for (let k=0; k<keychanges.length; k++){
  178. if(keychanges[k][1] == bar){
  179. key = keychanges[k][0];
  180. updateScales();
  181. console.log("KEY CHANGE");
  182. }
  183. else if(keychanges[k][1] == bar+1){
  184. slowdown = true;
  185. }
  186. }
  187. slowdown = false;
  188. let n = Math.floor(Math.random()*3);
  189. if(Math.random() > 0.3){
  190. n = (lastn+Math.pow(-1,Math.floor(Math.random()*2)));
  191. n = n%3;
  192. n = Math.abs(n);
  193. }
  194. let rawnote = intToChord(progression[bar])[n];
  195. let note = rawnote+(Math.random()<0.5?"4":"4");
  196. let length;
  197. let allowpassing = false;
  198. let passed = false;
  199. if(slowdown){
  200. length = barlength/2;
  201. }
  202. else if(lastlength == 0){
  203. let r = Math.floor(Math.random()*1);
  204. if(r == 0) length = 128;
  205. else if(r == 1) length = 128;
  206. else if(r == 2) length = 64;
  207.  
  208. lastlength = length;
  209. }
  210. else{
  211. length = lastlength; //Avoid notes crossing bars
  212. lastlength = 0;
  213. }
  214.  
  215. if(currenttime%barlength + length > barlength){
  216. length = barlength;
  217. }
  218.  
  219. if(length <= barlength/4){
  220. allowpassing = true;
  221. }
  222.  
  223. allowpassing = true;
  224.  
  225. if(allowpassing && Math.random() < 0.25){
  226. let ni = scalePositionOf(rawnote);
  227. //console.log(ni);
  228. if(ni != null){
  229. if(ni < 7) note = scale[ni+1]+"4";
  230. else note = scale[ni-1]+"4";
  231. passed = true;
  232. }
  233. }
  234. /*
  235. if(currenttime%barlength + length > barlength){
  236. length = barlength-currenttime%barlength;
  237. }
  238. */
  239.  
  240. console.log(key + " - " + note + " - " + n + " - " + passed);
  241. if(Math.random() < 0.1){
  242. tracks[t].addNoteOff(t, "", length);
  243. }
  244. else{
  245. tracks[t].addNoteOn(t, note, 0, 90-30*t);
  246. tracks[t].addNoteOff(t, note, length, 90-30*t);
  247. }
  248. currenttime += length;
  249. }
  250. }
  251. else{
  252. while(currenttime < maxlength){
  253. let bar = Math.floor(currenttime/barlength);
  254. for (let k=0; k<keychanges.length; k++){
  255. if(keychanges[k][1] == bar){
  256. key = keychanges[k][0];
  257. updateScales();
  258. }
  259. }
  260. if(blockchords){
  261. let s = 1+4+Math.floor(Math.random()*(7-4));
  262. //s = 6;
  263. if(s === 1) tracks[t].addChord(t,[intToChord(progression[bar])[2]+(Math.random()<0.5?"3":"4")],barlength, 80);
  264. if(s === 2) tracks[t].addChord(t,[intToChord(progression[bar])[1]+(Math.random()<0.5?"3":"4")],barlength, 80);
  265. if(s === 3) tracks[t].addChord(t,[intToChord(progression[bar])[1]+(Math.random()<0.5?"3":"4"),intToChord(progression[bar])[2]+(Math.random()<0.5?"3":"4")],barlength, 80);
  266. if(s === 4) tracks[t].addChord(t,[intToChord(progression[bar])[0]+(Math.random()<0.5?"3":"4")],barlength, 80);
  267. if(s === 5) tracks[t].addChord(t,[intToChord(progression[bar])[0]+(Math.random()<0.5?"3":"4"),intToChord(progression[bar])[2]+(Math.random()<0.5?"3":"4")],barlength, 80);
  268. if(s === 6) tracks[t].addChord(t,[intToChord(progression[bar])[0]+(Math.random()<0.5?"3":"4"),intToChord(progression[bar])[1]+(Math.random()<0.5?"3":"4")],barlength, 80);
  269. if(s === 7) tracks[t].addChord(t,[intToChord(progression[bar])[0]+(Math.random()<0.5?"3":"4"),intToChord(progression[bar])[1]+(Math.random()<0.5?"3":"4"),intToChord(progression[bar])[2]+(Math.random()<0.5?"3":"4")],barlength, 80);
  270. }
  271. else{
  272. tracks[t].addNoteOn(t, intToChord(progression[bar])[0]+"4", 0);
  273. tracks[t].addNoteOff(t, intToChord(progression[bar])[0]+"4", barlength/4);
  274. tracks[t].addNoteOn(t, intToChord(progression[bar])[1]+"4", 0);
  275. tracks[t].addNoteOff(t, intToChord(progression[bar])[1]+"4", barlength/4);
  276. tracks[t].addNoteOn(t, intToChord(progression[bar])[2]+"4", 0);
  277. tracks[t].addNoteOff(t, intToChord(progression[bar])[2]+"4", barlength/4);
  278. }
  279.  
  280. currenttime += barlength;
  281. }
  282. }
  283. }
  284.  
  285. console.log(keychanges);
  286. //console.log(progression);
  287. fs.writeFileSync('output.mid', file.toBytes(), 'binary');
  288. }
  289.  
  290.  
  291. function scalePositionOf(note){
  292. //console.log(note);
  293. //console.log(scale);
  294. for(let i=0; i<scale.length; i++){
  295. if(scale[i] == note) return i;
  296. }
  297. return null;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement