xxxxxxxxxx
369
music_vae = new mm.MusicVAE('https://storage.googleapis.com/magentadata/js/checkpoints/music_vae/drums_2bar_lokl_small');
music_vae.initialize();
vae_steps = 200;
vae_temperature = 2;
//pose
/* ===
ml5 Example
PoseNet example using p5.js
Available parts are:
0 nose
1 leftEye
2 rightEye
3 leftEar
4 rightEar
5 leftShoulder
6 rightShoulder
7 leftElbow
8 rightElbow
9 leftWrist
10 rightWrist
11 leftHip
12 rightHip
13 leftKnee
14 rightKnee
15 leftAnkle
16 rightAnkle
=== */
let video;
let poseNet;
let poses = [];
let noseX, noseY;
noseX = 0;
noseY = 0;
let drum;
let drumSpeed = 100;
let drumSpeedStep = 10;
var feedbackDelay = new Tone.PingPongDelay({
"delayTime": "8t",
"feedback": 0.25,
"wet": 0.25
}).toMaster();
//kick!
var kick = new Tone.MembraneSynth({
"envelope" : {
"sustain" : 0,
"attack" : 0.02,
"decay" : 0.8
},
"octaves" : 10
}).toMaster();
//snare
var feedbackDelay = new Tone.PingPongDelay({
"delayTime" : "8t",
"feedback" : 0.25,
"wet" : 0.25
}).toMaster();
var snare = new Tone.NoiseSynth({
"volume" : -5,
"envelope" : {
"attack" : 0.001,
"decay" : 0.2,
"sustain" : 0
},
"filterEnvelope" : {
"attack" : 0.001,
"decay" : 0.1,
"sustain" : 0
}
}).connect(feedbackDelay);
//bass!
var autoWah = new Tone.AutoWah(120, 10, -20).toMaster();
var bass = new Tone.MonoSynth({
"volume" : -10,
"envelope" : {
"attack" : 0.1,
"decay" : 0.3,
"release" : 2,
},
"filterEnvelope" : {
"attack" : 0.001,
"decay" : 0.01,
"sustain" : 0.5,
"baseFrequency" : 200,
"octaves" : 2.6
}
}).connect(autoWah);
var chord;
var feedbackDelay = new Tone.PingPongDelay({
"delayTime" : "32n",
"feedback" : 0.9,
"wet" : 0.1,
}).toMaster();
var synth = new Tone.PolySynth(6, Tone.Synth, {
"oscillator" : {
"partials" : [0, 2, 3, 4],
}
}).connect(feedbackDelay);
//lead
var leadDelay = new Tone.PingPongDelay("4n", 0.2).toMaster();
var tremolo = new Tone.Tremolo(2, 0.75).connect(leadDelay);
var lead = new Tone.MonoSynth({
detune : 0 ,
oscillator : {
type : 'square'
} ,
filter : {
Q : 6 ,
type : 'lowpass' ,
rolloff : -24
} ,
envelope : {
attack : 0.1 ,
decay : 0.1 ,
sustain : 0.5 ,
release : 1
} ,
filterEnvelope : {
attack : 0.6 ,
decay : 0.2 ,
sustain : 0.5 ,
release : 2 ,
baseFrequency : 200 ,
octaves : 7 ,
exponent : 2
}
}).connect(tremolo);
function setup() {
createCanvas(400, 400);
vaePlayer = new mm.Player(); //vae
//pose
video = createCapture(VIDEO);
video.size(width, height);
// Create a new poseNet method with a single detection
poseNet = ml5.poseNet(video, modelReady);
// This sets up an event that fills the global variable "poses"
// with an array every time new poses are detected
poseNet.on('pose', gotPoses);
// Hide the video element, and just show the canvas
video.hide();
}
function modelReady() {
select('#status').html('Model Loaded');
}
function draw() {
background(220);
//image(video,0,0);
//if(vaePlayer.stop()){
if (!(vaePlayer.isPlaying())) {
//playVAE();
music_vae
.sample(1, vae_temperature)
.then((samples) => {
vaePlayer.start(drum, drumSpeed)
});
}
/*
noFill();
rect(0, 0, width, height/4);
rect(0, height/2, width, height/4);
rect(width/4, 0, width/4, height);
rect(width/2, 0, width/4, height);
*/
//imageMode(CENTER);
/*
if (poses.length > 0) {
let pose = poses[0].pose;
let nose = pose['nose'];
noseX = nose.x;
noseY = nose.y;
fill(255,0,0);
ellipse(nose.x, nose.y, 50)
//image(noseImage, nose.x, nose.y, 60, 60);
//let rightEye = pose['rightEye'];
//image(rightEyeImage, rightEye.x, rightEye.y, 60, 60);
//let leftEye = pose['leftEye'];
//image(leftEyeImage, leftEye.x, leftEye.y, 60, 60);
}*/
fill(255,0,0);
ellipse(noseX, noseY, 50);
}
function gotPoses(poses){
//if(poses.length>0){
//console.log(poses);
//noseX = poses[0].pose.keypoints[0].position.x
//noseY = poses[0].pose.keypoints[0].position.y
let nX = poses[0].pose.keypoints[0].position.x;
let nY = poses[0].pose.keypoints[0].position.y;
noseX = lerp(noseX, nX, 0.5);
noseY = lerp(noseY, nY, 0.5);
//}
}
function mousePressed() {
/*
if (mouseButton === CENTER) {
snare.triggerAttackRelease();
}
if (mouseButton === LEFT) {
kick.triggerAttackRelease('A#1', '8n');
}*/
//var xPos = map(mouseX, 0, width, 0, 4);
//var yPos = map(mouseY, 0, height, 0, 4);
var xPos = map(noseX, 0, width, 0, 4);
var yPos = map(noseY, 0, height, 0, 4);
if (xPos < 1) {
//DRUMS
if (yPos < 1) {
snare.triggerAttackRelease();
} else if (yPos > 1 && yPos < 2) {
kick.triggerAttackRelease('C3', '8n');
} else if (yPos > 2 && yPos < 3) {
kick.triggerAttackRelease('G2', '8n');
} else {
kick.triggerAttackRelease('C1', '8n');
}
} else if (xPos > 1 && xPos < 2) {
//BASS
if (yPos < 1) {
bass.triggerAttackRelease('E2', '8n');
} else if (yPos > 1 && yPos < 2) {
bass.triggerAttackRelease('C2', '8n');
} else if (yPos > 2 && yPos < 3) {
bass.triggerAttackRelease('G1', '8n');
} else {
bass.triggerAttackRelease('C1', '8n');
}
} else if (xPos > 2 && xPos < 3) {
//CHORDS
if (yPos < 1) {
chord = ['C4', 'E4', 'G4'];
} else if (yPos > 1 && yPos < 2) {
chord = ['G3', 'C4', 'E4'];
} else if (yPos > 2 && yPos < 3) {
chord = ['E3', 'G3', 'C4'];
} else {
chord = ['C3', 'E3', 'G3'];
}
synth.triggerAttackRelease(chord, '8n');
} else {
//LEAD
if (yPos < 1) {
lead.triggerAttackRelease('A4', '4n');
} else if (yPos > 1 && yPos < 2) {
lead.triggerAttackRelease('G4', '4n');
} else if (yPos > 2 && yPos < 3) {
lead.triggerAttackRelease('E4', '4n');
} else {
lead.triggerAttackRelease('C4', '4n');
}
}
}
/*
// A function to draw ellipses over the detected keypoints
function drawKeypoints() {
// Loop through all the poses detected
for (let i = 0; i < poses.length; i++) {
// For each pose detected, loop through all the keypoints
let pose = poses[i].pose;
for (let j = 0; j < pose.keypoints.length; j++) {
// A keypoint is an object describing a body part (like rightArm or leftShoulder)
let keypoint = pose.keypoints[j];
// Only draw an ellipse is the pose probability is bigger than 0.2
if (keypoint.score > 0.2) {
fill(255, 0, 0);
noStroke();
ellipse(keypoint.position.x, keypoint.position.y, 10, 10);
}
}
}
}
// A function to draw the skeletons
function drawSkeleton() {
// Loop through all the skeletons detected
for (let i = 0; i < poses.length; i++) {
let skeleton = poses[i].skeleton;
// For every skeleton, loop through all body connections
for (let j = 0; j < skeleton.length; j++) {
let partA = skeleton[j][0];
let partB = skeleton[j][1];
stroke(255, 0, 0);
line(partA.position.x, partA.position.y, partB.position.x, partB.position.y);
}
}
}*/
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 download() {
if (!drum) {
alert('You must generate a trio before you can download it!');
} else {
saveAs(new File([mm.sequenceProtoToMidi(drum)], 'drum.mid'));
}
}