xxxxxxxxxx
118
var sequence;
var index = [];
var indexed_sequence = [];
var markov = []; //this will be an array of arrays
var index_size;
var pitches = [];
var keys;
var toneLoop;
var currentPitch;
var score;
function preload() {
score = loadJSON("data/bach.json", loaded, error);
}
function setup() {
sequence = [];
//load first track into sequence
for(var i = 0; i < score.tracks[1].notes.length; i++){
var note = score.tracks[1].notes[i];
sequence.push(note.midi);
}
print(sequence);
keys = new Tone.PolySynth(3, Tone.Synth);
keys.toMaster();
index_size = 0;
//process sequence
// var new_item = true;
//step 1: analyze sequence
for(var i =0; i < sequence.length; i++){
new_item = true;
//check if item is new. if not, point to existing index
for(var j = 0; j < index_size; j++){
if(sequence[i] == index[j]){
new_item = false;
indexed_sequence[i] = j;
}
}
if(new_item){
index[index_size] = sequence[i];
indexed_sequence[i] = index_size;
index_size++;
}
}
print("raw sequence: "+ sequence);
print("index: " + index);
print("indexed sequence: " + indexed_sequence);
//step 2: create transition matrix
//create table
for(var i = 0; i < index_size; i++){
markov[i] = [];
}
for(var i = 0; i < indexed_sequence.length; i++){ //for each unique pitch
var current = indexed_sequence[i];
var next_pos = (i + 1) % indexed_sequence.length;
var next = indexed_sequence[next_pos];
markov[current].push(next);
}
//print transition table
for(var i = 0; i < markov.length; i++){
print(markov[i]);
}
//step 3: create melody
var melodyLength = 100;
var currentIndex = parseInt(random(0, markov.length)); //start anywhere
for(var i = 0; i < melodyLength; i++){
var transitionPos = parseInt(random(0, markov[currentIndex].length));
var nextIndex = markov[currentIndex][transitionPos];
currentIndex = nextIndex;
pitches.push(index[currentIndex]);
}
print("generated melody: " + pitches);
currentPitch = 0;
//play back melody
//triggered every eighth note.
toneLoop = new Tone.Loop(function(time){
var pitch = Tone.Frequency( pitches[currentPitch], "midi");
keys.triggerAttackRelease(pitch, "16n");
currentPitch = (currentPitch + 1) % pitches.length;
}, "8n").start(0);
Tone.Transport.start();
}
function draw() {
}
function loaded(d) {
score = d;
}
function error(err){
print(err);
}