Skip to content

Instantly share code, notes, and snippets.

@grifdail
Last active August 29, 2015 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save grifdail/e7ec16259514d6aad7ca to your computer and use it in GitHub Desktop.
Save grifdail/e7ec16259514d6aad7ca to your computer and use it in GitHub Desktop.
MarkovChain music generation for wavepot
var transpose = 24;
var bpm = 240; // Beats per minute
var spb = 60/bpm; // Second per beat
function note(n, octave){
n += transpose;
return Math.pow(2, (n - 33 + (12 * (octave || 0))) / 12) * 440;
}
var melodies = [1];
var counter;
//C Major random
var MajorRandom = [
[1,0,1,0,1,1,0,1,0,1,0,1],
[0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,1,0,1,1,0,1,0,1,0,1],
[0,0,0,0,1,0,0,0,0,0,0,0],
[1,0,1,0,1,1,0,1,0,1,0,1],
[1,0,1,0,1,1,0,1,0,1,0,1],
[0,0,0,0,0,0,0,1,0,0,0,0],
[1,0,1,0,1,1,0,1,0,1,0,1],
[0,0,0,0,0,0,0,0,0,1,0,0],
[1,0,1,0,1,1,0,1,0,1,0,1],
[0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,1,0,1,1,0,1,0,1,0,1],
]
//C Major chromatic
var MajorChromatic = [
[1,0,1,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,1,0,1,0,0,0,0,0,0,0],
[0,0,0,0,1,0,0,0,0,0,0,0],
[0,0,1,0,1,1,0,0,0,0,0,0],
[0,0,0,0,1,1,0,1,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,1,0,1,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,1,0,1,0,1],
[0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,1,0,1],
]
function calcMarkovChain(chain,models,length) {
function calcNext(table) {
var current = 0;
var proba = [];
for (var i = 0; i < table.length; i++) {
current+=table[i];
proba[i] = current;
}
var r = Math.random();
for (i = 0; i < proba.length; i++) {
proba[i]*= 1/current;
if (r<proba[i]) {
return i;
}
}
return 0
}
chain.slice(0);
chain.push(0);
for (var i = 0; i < length; i++) {
var currentModel = models[chain[i] || 0];
chain.push(calcNext(currentModel))
}
return chain
}
function buildMelodie() {
var pattern = calcMarkovChain([] ,MajorChromatic,8);
melodies = [];
melodies.push.apply(melodies,pattern);
pattern[(Math.random()*8)|0] += 1;
pattern[(Math.random()*8)|0] += 1;
melodies.push.apply(melodies,pattern);
melodies.push.apply(melodies,melodies.map(function(x){return x+12}));
return melodies;
}
buildMelodie()
function sin(t,f,a) {
return a * Math.sin( 2 * Math.PI * t * f);
}
function sqr(t,f,a) {
return ((sin(t,f,a)>0) *2-1) *a;
}
function dsp(t) {
counter = Math.floor(t/spb); //How many beats have passed
var noteprogression = (t%spb)/spb
return sqr(t,note(melodies[counter%melodies.length]),0.1)*sin(t,note(melodies[counter%melodies.length])*2,1)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment