Data van het regressiemodel met 4 clusters, output: de frequenties van de noten

 Data van het regressiemodel met 4 clusters
output de frequenties van de noten
 

De 4 clusters

De 4 clusters

 

Clusters van 'C' , freq = 261 Hz en 'B', freq = 493 Hz

Clusters van 'C' , freq = 261 Hz en 'B', freq = 493 Hz
de toon tussen deze clusters = 358 Hz
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
De data.raw array met cel "0"
 
De data.raw array (regel 40) met cel "0" waarin
xs (regel 42) en ys (regel 43) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

classificatie resultaat van 2 objecten

classificatie resultaat van 2 objecten
value in in cel 0 van het array
 

'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

Het regressie model (regel 25) heeft een output. In de collection fase (regel 91) worden, met de toetsen, de muzieknoten aan het model gegeven.
Na de training (regel 65) krijgen in de prediction fase (regel 84) de objecten de frequentie die ongeveer overeenkomt met de frequentie van de clusters

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

Het opgeslagen model heeft frequenties als output. Tijdens het laden van dit model worden deze frequenties weer als noten getoond (regel 51 t/m 57)

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

 
Bronnen
Youtube tutorial van Daniel Shiffman "ml5: Neural Network Regression" 

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();
}