Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require('console.log');
- 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"];
- if(key == "b") scale = ["b","c#", "d#", "e", "f#", "g#", "a#"];
- //Minor
- if(key == "a#m") scale = ["a", "a#", "b#","c#", "d#", "e#", "f#"];
- if(key == "d#m") scale = ["d#", "e#", "f#", "g#", "a#", "b","d"];
- if(key == "g#m") scale = ["g", "g#", "a#", "b","c#", "d#", "e"];
- if(key == "c#m") scale = ["c#", "d#", "e", "f#", "g#", "a", "c"];
- if(key == "f#m") scale = ["f#", "g#", "a", "b","c#", "d", "f"];
- if(key == "bm") scale = ["b","c#", "d", "e", "f#", "g", "a#"];
- if(key == "em") scale = ["e", "f#", "g", "a", "b","c", "d#"];
- if(key == "am") scale = ["a", "b","c", "d", "e", "f", "g#"];
- if(key == "dm") scale = ["d", "e", "f", "g", "a", "bb","c#"];
- if(key == "gm") scale = ["g", "a", "bb","c", "d", "eb", "f#"];
- if(key == "cm") scale = ["c", "d", "eb", "f", "g", "ab", "b"];
- if(key == "fm") scale = ["f", "g", "ab", "bb","c", "db", "e"];
- if(key == "bbm") scale = ["bb","c", "db", "eb", "f", "gb", "a"];
- if(key == "ebm") scale = ["eb", "f", "gb", "ab", "bb","cb", "d"];
- if(key == "abm") scale = ["ab", "bb","cb", "db", "eb", "fb", "g"];
- I = [scale[0], scale[2], scale[4]];
- II = [scale[1], scale[3], scale[5]];
- III = [scale[2], scale[4], scale[6]];
- IV = [scale[3], scale[5], scale[0]];
- V = [scale[4], scale[6], scale[1]];
- VI = [scale[5], scale[0], scale[2]];
- VII = [scale[6], scale[1], scale[3]];
- }
- function init(){
- updateScales();
- for(let i=0; i<numbars; i++){
- let valid = false;
- while(!valid){
- let p = 1+Math.floor(Math.random()*7);
- if(allowedchords.includes(p)){
- if(i > 0 && progression[i-1] == p){
- valid = false;
- }
- else{
- valid = true;
- }
- if(valid){
- if(p == 1){
- progression.push(1);
- }
- else if(p == 2){
- progression.push(2);
- }
- else if(p == 3){
- progression.push(3);
- }
- else if(p == 4){
- progression.push(4);
- }
- else if(p == 5){
- progression.push(5);
- }
- else if(p == 6){
- progression.push(6);
- }
- else if(p == 7){
- progression.push(7);
- }
- }
- }
- }
- }
- keychanges = [[key, 0]]
- let nk = 4;
- for(let i=0; i<nk-1; i++){
- 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)];
- keychanges.push([k, (i+1)*numbars/nk]);
- }
- generate();
- }
- function intToChord(i){
- if(i == 1) return I;
- if(i == 2) return II;
- if(i == 3) return III;
- if(i == 4) return IV;
- if(i == 5) return V;
- if(i == 6) return VI;
- if(i == 7) return VII;
- }
- function generate(){
- let fs = require('fs');
- let Midi = require('jsmidgen');
- let file = new Midi.File();
- let tracks = [];
- /*
- let track = new Midi.Track();
- let track2 = new Midi.Track();
- */
- tracks.push(new Midi.Track());
- tracks.push(new Midi.Track());
- //tracks.push(new Midi.Track());
- for(let i=0; i<tracks.length; i++){
- file.addTrack(tracks[i]);
- }
- tracks[0].instrument(0, 0);
- tracks[1].instrument(1, 0);
- //tracks[1].instrument(1, 1);
- for(let t=0; t<tracks.length; t++){
- let currenttime = 0;
- if(t < tracks.length-1){
- let lastlength = 0;
- let lastn = -1;
- let lastbar = -1;
- while(currenttime < maxlength-1){
- let bar = Math.floor(currenttime/barlength);
- console.log(bar);
- let slowdown = false;
- for (let k=0; k<keychanges.length; k++){
- if(keychanges[k][1] == bar){
- key = keychanges[k][0];
- updateScales();
- console.log("KEY CHANGE");
- }
- else if(keychanges[k][1] == bar+1){
- slowdown = true;
- }
- }
- slowdown = false;
- let n = Math.floor(Math.random()*3);
- if(Math.random() > 0.3){
- n = (lastn+Math.pow(-1,Math.floor(Math.random()*2)));
- n = n%3;
- n = Math.abs(n);
- }
- let rawnote = intToChord(progression[bar])[n];
- let note = rawnote+(Math.random()<0.5?"4":"4");
- let length;
- let allowpassing = false;
- let passed = false;
- if(slowdown){
- length = barlength/2;
- }
- else if(lastlength == 0){
- let r = Math.floor(Math.random()*1);
- if(r == 0) length = 128;
- else if(r == 1) length = 128;
- else if(r == 2) length = 64;
- lastlength = length;
- }
- else{
- length = lastlength; //Avoid notes crossing bars
- lastlength = 0;
- }
- if(currenttime%barlength + length > barlength){
- length = barlength;
- }
- if(length <= barlength/4){
- allowpassing = true;
- }
- allowpassing = true;
- if(allowpassing && Math.random() < 0.25){
- let ni = scalePositionOf(rawnote);
- //console.log(ni);
- if(ni != null){
- if(ni < 7) note = scale[ni+1]+"4";
- else note = scale[ni-1]+"4";
- passed = true;
- }
- }
- /*
- if(currenttime%barlength + length > barlength){
- length = barlength-currenttime%barlength;
- }
- */
- console.log(key + " - " + note + " - " + n + " - " + passed);
- if(Math.random() < 0.1){
- tracks[t].addNoteOff(t, "", length);
- }
- else{
- tracks[t].addNoteOn(t, note, 0, 90-30*t);
- tracks[t].addNoteOff(t, note, length, 90-30*t);
- }
- currenttime += length;
- }
- }
- else{
- while(currenttime < maxlength){
- let bar = Math.floor(currenttime/barlength);
- for (let k=0; k<keychanges.length; k++){
- if(keychanges[k][1] == bar){
- key = keychanges[k][0];
- updateScales();
- }
- }
- if(blockchords){
- let s = 1+4+Math.floor(Math.random()*(7-4));
- //s = 6;
- if(s === 1) tracks[t].addChord(t,[intToChord(progression[bar])[2]+(Math.random()<0.5?"3":"4")],barlength, 80);
- if(s === 2) tracks[t].addChord(t,[intToChord(progression[bar])[1]+(Math.random()<0.5?"3":"4")],barlength, 80);
- 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);
- if(s === 4) tracks[t].addChord(t,[intToChord(progression[bar])[0]+(Math.random()<0.5?"3":"4")],barlength, 80);
- 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);
- 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);
- 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);
- }
- else{
- tracks[t].addNoteOn(t, intToChord(progression[bar])[0]+"4", 0);
- tracks[t].addNoteOff(t, intToChord(progression[bar])[0]+"4", barlength/4);
- tracks[t].addNoteOn(t, intToChord(progression[bar])[1]+"4", 0);
- tracks[t].addNoteOff(t, intToChord(progression[bar])[1]+"4", barlength/4);
- tracks[t].addNoteOn(t, intToChord(progression[bar])[2]+"4", 0);
- tracks[t].addNoteOff(t, intToChord(progression[bar])[2]+"4", barlength/4);
- }
- currenttime += barlength;
- }
- }
- }
- console.log(keychanges);
- //console.log(progression);
- fs.writeFileSync('output.mid', file.toBytes(), 'binary');
- }
- function scalePositionOf(note){
- //console.log(note);
- //console.log(scale);
- for(let i=0; i<scale.length; i++){
- if(scale[i] == note) return i;
- }
- return null;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement