'C' = 261 Hz , 'D' = 293 Hz , 'E' = 329 Hz , 'F' = 349 Hz , 'G' = 391 Hz , 'A' = 440 Hz , 'B' = 493 Hz
regressiemodel met muzieknoten als output. terug naar de inleiding naar de schets in fullscreen
Maak bijv een cluster met 'C' en met 'B' noten een object in de prediction fase geplaatst tussen deze clusters zal een frequentie hebben tussen de [261 , 493] Hz
In de objecten, geplaatst tijdens de prediction fase, zie je de frequenties als getal (regel 126) en hoor je de bijbehorende tonen (regel 128)
In regressie modellen wordt de methode predict gebruikt (regel 109) In classifcation modellen word de methode classify gebruikt
ml5.js website "Neural Network Usage"
let model;
let targetNote = 'C';
let toestand = 'collection';
let notes = {
C: 261.6256, D: 293.6648, E: 329.6276, F: 349.2282,
G: 391.9956, A: 440.0000, B: 493.8833
}
function setup() {
createCanvas(850, 600);
background(230,251,255);
rect(0, 0, 848, 598);
env = new p5.Envelope();
env.setADSR(0.05, 0.1, 0.5, 1);
env.setRange(1.2, 0);
wave = new p5.Oscillator();
wave.setType('sine');
wave.amp(env);
let options = {
inputs: ['x' , 'y'],
outputs: ['frequency'],
task: 'regression',
debug: 'true'
};
model = ml5.neuralNetwork(options);
//data laden vanaf de computer
laden();
}
function laden() {
const loadBtn = select('#load');
loadBtn.changed(function () {
model.loadData(loadBtn.elt.files, function () {
console.log('Data Loaded!');
console.log(model.data);
//zo benader je de raw data van model.data
let data = model.data.data.raw;
for (let i = 0; i < data.length; i++) {
let inputs = data[i].xs;
let target = data[i].ys;
stroke(0);
strokeWeight(2);
fill(255,0,0,100);
ellipse(inputs.x, inputs.y, 24);
fill(255,0,0);
noStroke();
textAlign(CENTER,CENTER);
if (floor(target.frequency) == 261) {text('C', inputs.x, inputs.y);}
if (floor(target.frequency) == 293) {text('D', inputs.x, inputs.y);}
if (floor(target.frequency) == 329) {text('E', inputs.x, inputs.y);}
if (floor(target.frequency) == 349) {text('F', inputs.x, inputs.y);}
if (floor(target.frequency) == 391) {text('G', inputs.x, inputs.y);}
if (floor(target.frequency) == 440) {text('A', inputs.x, inputs.y);}
if (floor(target.frequency) == 493) {text('B', inputs.x, inputs.y);}
}
});
});
}
function keyPressed() {
if(key == ('t' || 'T')) {
toestand = 'training';
model.normalizeData();
const trainingOptions = {
epochs: 100,
batchSize: 12
}
model.train(trainingOptions, whileTraining, finishedTraining);
}
else if (key == ('s' || 'S')) {model.saveData('model_reg_data');}
else if (key == ('m' || 'M')) {model.save('getrainde_reg_model');}
else {targetNote = key.toUpperCase();}
}
function whileTraining(epoch, loss) {
console.log(epoch);
}
function finishedTraining() {
console.log('finished training.');
toestand = 'prediction'
}
function mousePressed() {
let inputs = {x: mouseX, y: mouseY}
if (mouseX < 0 || mouseX > 845) {return;}
if (mouseY < 0 || mouseY > 598) {return;}
if (toestand == 'collection') {
//Hier worden de noten van de lookupList, te beginnen met de 'C", aan het model gegeven
//in regel 75 krijgt het model de met een toets geselecteerde noot
let target = {frequency: notes[targetNote]}
model.addData(inputs,target);
stroke(0);
strokeWeight(2);
fill(255,0,0,100);
ellipse(mouseX, mouseY, 24);
fill(255,0,0);
noStroke();
textAlign(CENTER,CENTER);
text(targetNote, mouseX, mouseY);
wave.start();
wave.freq(notes[targetNote]);
env.play();
} else if (toestand == 'prediction') {
model.predict(inputs, gotResults);
}
}
function gotResults(error, results) {
if (error) {
console.error(error) ;
return;
}
console.log(results);
stroke(0);
strokeWeight(2);
fill(0, 0, 255,100);
ellipse(mouseX, mouseY, 24);
fill(255);
noStroke();
textAlign(CENTER,CENTER);
text(floor(results[0].value), mouseX, mouseY);
wave.start();
wave.freq(results[0].value);
env.play();
}