xxxxxxxxxx
349
music_vae = new mm.MusicVAE('https://storage.googleapis.com/magentadata/js/checkpoints/music_vae/drums_2bar_lokl_small');
music_vae.initialize();
/*
music_rnn = new mm.MusicRNN('https://storage.googleapis.com/magentadata/js/checkpoints/music_rnn/basic_rnn');
music_rnn.initialize();
*/
rnn_steps = 20;
rnn_temperature = 2;
vae_steps = 200;
vae_temperature = 2;
let drum;
let drumSpeed = 75;
let drumSpeedStep = 10;
//noise
let mrNoise;
let mrsNoise;
let playButton;
let stopButton;
let chooseNoise, setVolume;
let toggleOnOff;
let fft;
function setup() {
createCanvas(400, 400);
player = new mm.Player();
player.start(ORIGINAL_TWINKLE_TWINKLE);
player.stop();
vaePlayer = new mm.Player(); //vae
//rnnPlayer = new mm.Player();
//play();//rnn
//playVAE();//vae
//playInterpolation();//vae
//noise
mrNoise = new p5.Noise();
mrNoise.amp(0);
//mrNoise.start();
fft = new p5.FFT();
toggleOnOff = createButton('play');
toggleOnOff.position(10, 10);
toggleOnOff.mousePressed(function() {
if (mrNoise.started) {
mrNoise.stop();
toggleOnOff.html('play');
} else {
mrNoise.start();
toggleOnOff.html('stop');
}
});
chooseNoise = createSelect();
chooseNoise.position(60, 10);
chooseNoise.option('white');
chooseNoise.option('pink');
chooseNoise.option('brown');
chooseNoise.changed(function() {
mrNoise.setType(chooseNoise.value());
});
setVolume = createSlider(-60, 0, -60, 1);
setVolume.position(130, 0);
setVolume.input(function() {
if (setVolume.value > -56) {
//amptitude = 10^(decibels/20);
//pow(base, exponent);
mrNoise.amp(pow(10, setVolume.value() / 20));
} else {
mrNoise.amp(map(setVolume.value(), -60, -56, 0, 0.0016), 0.1);
}
});
//playButton = createButton('play').position(10, 10).mousePressed(()=>{mrNoise.start();});
//stopButton = createButton('stop').position(10, 30).mousePressed(()=>{mrNoise.stop();});
}
function draw() {
background(220);
//if(vaePlayer.stop()){
if (!(vaePlayer.isPlaying())) {
//playVAE();
music_vae
.sample(1, vae_temperature)
.then((samples) => {
vaePlayer.start(drum, drumSpeed)
});
}
//noise
//let spectrum = fft.analyze();
}
function touchStarted() {
if (getAudioContext().state !== 'running') {
getAudioContect().resume();
}
}
ORIGINAL_TWINKLE_TWINKLE = {
notes: [{
pitch: 60,
startTime: 0.0,
endTime: 0.5
},
{
pitch: 60,
startTime: 0.5,
endTime: 1.0
},
{
pitch: 67,
startTime: 1.0,
endTime: 1.5
},
{
pitch: 67,
startTime: 1.5,
endTime: 2.0
},
{
pitch: 69,
startTime: 2.0,
endTime: 2.5
},
{
pitch: 69,
startTime: 2.5,
endTime: 3.0
},
{
pitch: 67,
startTime: 3.0,
endTime: 4.0
},
{
pitch: 65,
startTime: 4.0,
endTime: 4.5
},
{
pitch: 65,
startTime: 4.5,
endTime: 5.0
},
{
pitch: 64,
startTime: 5.0,
endTime: 5.5
},
{
pitch: 64,
startTime: 5.5,
endTime: 6.0
},
{
pitch: 62,
startTime: 6.0,
endTime: 6.5
},
{
pitch: 62,
startTime: 6.5,
endTime: 7.0
},
{
pitch: 60,
startTime: 7.0,
endTime: 8.0
},
],
totalTime: 8
};
NEW_BEE = {
notes: [{
pitch: 67,
startTime: 0.0,
endTime: 0.5
},
{
pitch: 64,
startTime: 0.5,
endTime: 1.0
},
{
pitch: 64,
startTime: 1.0,
endTime: 2.0
},
{
pitch: 65,
startTime: 2.0,
endTime: 2.5
},
{
pitch: 62,
startTime: 2.5,
endTime: 3.0
},
{
pitch: 62,
startTime: 3.0,
endTime: 4.0
},
{
pitch: 60,
startTime: 4.0,
endTime: 4.5
},
{
pitch: 64,
startTime: 4.5,
endTime: 5.0
},
{
pitch: 67,
startTime: 5.0,
endTime: 5.5
},
{
pitch: 67,
startTime: 5.5,
endTime: 6.0
},
{
pitch: 60,
startTime: 6.0,
endTime: 8.0
},
],
totalTime: 8
};
DRUMS = {
notes: [
{ pitch: 36, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true },
{ pitch: 38, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true },
{ pitch: 42, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true },
{ pitch: 46, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true },
{ pitch: 42, quantizedStartStep: 2, quantizedEndStep: 3, isDrum: true },
{ pitch: 42, quantizedStartStep: 3, quantizedEndStep: 4, isDrum: true },
{ pitch: 42, quantizedStartStep: 4, quantizedEndStep: 5, isDrum: true },
{ pitch: 50, quantizedStartStep: 4, quantizedEndStep: 5, isDrum: true },
{ pitch: 36, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true },
{ pitch: 38, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true },
{ pitch: 42, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true },
{ pitch: 45, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true },
{ pitch: 36, quantizedStartStep: 8, quantizedEndStep: 9, isDrum: true },
{ pitch: 42, quantizedStartStep: 8, quantizedEndStep: 9, isDrum: true },
{ pitch: 46, quantizedStartStep: 8, quantizedEndStep: 9, isDrum: true },
{ pitch: 42, quantizedStartStep: 10, quantizedEndStep: 11, isDrum: true },
{ pitch: 48, quantizedStartStep: 10, quantizedEndStep: 11, isDrum: true },
{ pitch: 50, quantizedStartStep: 10, quantizedEndStep: 11, isDrum: true },
],
quantizationInfo: {stepsPerQuarter: 4},
tempos: [{time: 0, qpm: 120}],
totalQuantizedSteps: 11
};
function play() {
if (rnnPlayer.isPlaying()) {
rnnPlayer.stop();
return;
}
// The model expects a quantized sequence, and ours was unquantized:
const qns = mm.sequences.quantizeNoteSequence(NEW_BEE, 4);
music_rnn
.continueSequence(qns, rnn_steps, rnn_temperature)
.then((sample) => rnnPlayer.start(sample));
}
function keyPressed() {
//playVAE();
//drumSpeed = drumSpeed - drumSpeedStep;
//if(drumSpeed <= 30 || drumSpeed >= 400){
// drumSpeedStep = - drumSpeedStep;
//}
music_vae
.sample(1, vae_temperature)
.then((samples) => {
drum = samples[0];
//download();
})
}
function playVAE() {
if (vaePlayer.isPlaying()) {
vaePlayer.stop();
return;
}
music_vae
.sample(1, vae_temperature)
.then((samples) => {
drum = samples[0];
})
/*
music_vae
.sample(1, vae_temperature)
.then((samples) => {
vaePlayer.start(drum,drumSpeed)
});*/
}
function playInterpolation() {
if (vaePlayer.isPlaying()) {
vaePlayer.stop();
return;
}
// Music VAE requires quantized melodies, so quantize them first.
const star = mm.sequences.quantizeNoteSequence(ORIGINAL_TWINKLE_TWINKLE, 4);
const bee = mm.sequences.quantizeNoteSequence(NEW_BEE, 4);
music_vae
.interpolate([star, bee], 4)
.then((sample) => {
const concatenated = mm.sequences.concatenate(sample);
vaePlayer.start(concatenated);
});
}
function download() {
if (!drum) {
alert('You must generate a trio before you can download it!');
} else {
saveAs(new File([mm.sequenceProtoToMidi(drum)], 'drum.mid'));
}
}