xxxxxxxxxx
376
let canvas;
let mano_x = [];
let mano_y = [];
let index_dita = [4, 8, 12, 16, 20]; //pollice, indice, medio, anulare, mignolo
let distanza_punti_0, distanza_punti_0_pre;
let punto_centrale_0;
let distanza_punti_1, distanza_punti_1_pre;
let punto_centrale_1;
let figure_0 = 0;
let diametro_0 = [], x_figura_0 = [], y_figura_0 = [];
let indice_modifica_0;
let campione_0 = [5];
let freq_0 = [];
let vol_0 = [];
let figure_1 = 0;
let diametro_1 = [], x_figura_1 = [], y_figura_1 = [];
let indice_modifica_1;
let campione_1 = [5];
let freq_1 = [];
let vol_1 = [];
let audio_attivo = false;
let soglia_distanza = 400;
let sketch = function(p) {
p.setup = function() {
canvas = p.createCanvas(window.innerWidth, window.innerHeight);
canvas.id("canvas");
canvas.mouseClicked(p.attiva_audio);
p.getAudioContext().suspend();
p.colorMode(p.HSB);
for (let i = 0; i < 3; i++) {
mano_x[i] = [];
mano_y[i] = [];
for (let j = 0; j < 22; j++) {
mano_x[i][j] = 0;
mano_y[i][j] = 0;
}
}
for(let i = 0; i < 5; i++) {
campione_0[i] = p.loadSound('pling.mp3');
campione_1[i] = p.loadSound('marimba.mp3');
}
} //fine del setup
p.draw = function() {
p.clear();
if (audio_attivo == false) {
p.fill(255);
p.strokeWeight(1);
p.stroke(0);
p.rectMode(p.CENTER);
p.rect(p.width * 0.5, p.height * 0.5 - 12, p.width * 0.5, 40);
p.fill(0);
p.stroke(0);
p.strokeWeight(1);
p.textSize(24);
p.textFont('Helvetica Neue');
p.textAlign(p.CENTER);
p.text("CLICCA SULLO SCHERMO PER ATTIVARE L'AUDIO", p.width * 0.5, p.height * 0.5);
}
if(detections != undefined) {
if(detections.multiHandLandmarks != undefined) {
//p.drawHands();
//p.drawParts();
p.drawLines([0, 5, 9, 13, 17, 0]);//palmo
p.drawLines([0, 1, 2, 3 ,4]);//pollice
p.drawLines([5, 6, 7, 8]);//indice
p.drawLines([9, 10, 11, 12]);//medio
p.drawLines([13, 14, 15, 16]);//anulare
p.drawLines([17, 18, 19, 20]);//mignolo
p.drawLandmarks([0, 1], 0);//palmo
p.drawLandmarks([1, 5], 60);//pollice
p.drawLandmarks([5, 9], 120);//indice
p.drawLandmarks([9, 13], 180);//medio
p.drawLandmarks([13, 17], 240);//anulare
p.drawLandmarks([17, 21], 300);//mignolo
//------- memorizzo variabili dei punti delle mani---------//
for(let i = 0; i < detections.multiHandLandmarks.length; i++) {
for(let j = 0; j < 21; j++) {
mano_x[i][j] = detections.multiHandLandmarks[i][j].x * p.width;
mano_y[i][j] = detections.multiHandLandmarks[i][j].y * p.height;
}
}
//----------sintesi video-----------//
if (detections.multiHandLandmarks.length > 0) {
let punti_0 = [
{ x: mano_x[0][index_dita[0]], y: mano_y[0][index_dita[0]]},
{ x: mano_x[0][index_dita[1]], y: mano_y[0][index_dita[1]]},
{ x: mano_x[0][index_dita[2]], y: mano_y[0][index_dita[2]]},
{ x: mano_x[0][index_dita[3]], y: mano_y[0][index_dita[3]]},
{ x: mano_x[0][index_dita[4]], y: mano_y[0][index_dita[4]]}
];
distanza_punti_0 = p.calcola_distanza_tot(punti_0);
punto_centrale_0 = p.calcola_punto_centrale(punti_0);
if (distanza_punti_0 < soglia_distanza && distanza_punti_0_pre > soglia_distanza) {
figure_0++;
indice_modifica_0 = figure_0 - 1;
diametro_0[indice_modifica_0] = 50;
}
if (distanza_punti_0 < soglia_distanza) {
x_figura_0[indice_modifica_0] = punto_centrale_0.x;
y_figura_0[indice_modifica_0] = punto_centrale_0.y;
if (diametro_0[indice_modifica_0] < 250) {
diametro_0[indice_modifica_0] = diametro_0[indice_modifica_0] + 4;
}
}
if (distanza_punti_0 > soglia_distanza && distanza_punti_0_pre < soglia_distanza) {
freq_0[indice_modifica_0] = p.map(x_figura_0[indice_modifica_0], 0, p.width, 0.2, 3);
vol_0[indice_modifica_0] = p.map(diametro_0[indice_modifica_0], 50, 250, 0.2, 1.5);
campione_0[0].setVolume(vol_0[indice_modifica_0]);
campione_0[0].rate(freq_0[indice_modifica_0]); //se voglio la freq fissa
campione_0[0].play();
indice_modifica_0 = -1;
}
if (detections.multiHandLandmarks.length > 1) {
let punti_1 = [
{ x: mano_x[1][index_dita[0]], y: mano_y[1][index_dita[0]]},
{ x: mano_x[1][index_dita[1]], y: mano_y[1][index_dita[1]]},
{ x: mano_x[1][index_dita[2]], y: mano_y[1][index_dita[2]]},
{ x: mano_x[1][index_dita[3]], y: mano_y[1][index_dita[3]]},
{ x: mano_x[1][index_dita[4]], y: mano_y[1][index_dita[4]]}
];
distanza_punti_1 = p.calcola_distanza_tot(punti_1);
punto_centrale_1 = p.calcola_punto_centrale(punti_1);
if (distanza_punti_1 < soglia_distanza && distanza_punti_1_pre > soglia_distanza) {
figure_1++;
indice_modifica_1 = figure_1 - 1;
diametro_1[indice_modifica_1] = 50;
}
if (distanza_punti_1 < soglia_distanza) {
x_figura_1[indice_modifica_1] = punto_centrale_1.x;
y_figura_1[indice_modifica_1] = punto_centrale_1.y;
if (diametro_1[indice_modifica_1] < 250) {
diametro_1[indice_modifica_1] = diametro_1[indice_modifica_1] + 4;
}
}
if (distanza_punti_1 > soglia_distanza && distanza_punti_1_pre < soglia_distanza) {
freq_1[indice_modifica_1] = p.map(x_figura_1[indice_modifica_1], 0, p.width, 0.2, 3);
vol_1[indice_modifica_1] = p.map(diametro_1[indice_modifica_1], 50, 250, 0.2, 1.5);
campione_1[0].setVolume(vol_1[indice_modifica_1]);
campione_1[0].rate(freq_1[indice_modifica_1]); //se voglio la freq fissa
campione_1[0].play();
indice_modifica_1 = -1;
}
} //if presente due mani
} //if presente una mano
p.colorMode(p.RGB);
p.strokeWeight(1);
p.fill(255, 0, 255, 150);
p.stroke(255, 0, 255, 180);
for (let i = 0; i < figure_0; i++) {
if (i != indice_modifica_0) {
y_figura_0[i] = y_figura_0[i] + 5;
}
p.ellipse(x_figura_0[i], y_figura_0[i], diametro_0[i], diametro_0[i]);
if ((y_figura_0[i] - diametro_0[i]) > p.height ) {
/* x_figura.splice(i, 1);
y_figura.splice(i, 1);
diametro.splice(i, 1);
freq.splice(i, 1); */
//figure--;
}
}
p.fill(0, 255, 255, 150);
p.stroke(0, 255, 255, 180);
for (let i = 0; i < figure_1; i++) {
if (i != indice_modifica_1) {
y_figura_1[i] = y_figura_1[i] + 5;
}
p.ellipse(x_figura_1[i], y_figura_1[i], diametro_1[i], diametro_1[i]);
if ((y_figura_1[i] - diametro_1[i]) > p.height ) {
/* x_figura.splice(i, 1);
y_figura.splice(i, 1);
diametro.splice(i, 1);
freq.splice(i, 1); */
//figure--;
}
}
distanza_punti_0_pre = distanza_punti_0;
distanza_punti_1_pre = distanza_punti_1;
}//fine if mani presenti
} //fine if algoritmo funzionante
//p.print(trigger);
} //fine del draw
p.drawHands = function() { //stampo i numeri relativi ai punti delle dita
for (let i = 0; i < detections.multiHandLandmarks.length; i++) {
for (let j = 0; j < detections.multiHandLandmarks[i].length; j++) {
let x = detections.multiHandLandmarks[i][j].x * p.width;
let y = detections.multiHandLandmarks[i][j].y * p.height;
let z = detections.multiHandLandmarks[i][j].z;
p.strokeWeight(0);
p.textFont('Helvetica Neue');
p.text(j, x, y);
p.stroke(255);
p.strokeWeight(10);
p.point(x, y);
}
}
}
p.drawLandmarks = function(indexArray, hue) {
p.noFill();
p.strokeWeight(8);
p.colorMode(p.HSB);
for(let i = 0; i < detections.multiHandLandmarks.length; i++) {
for(let j = indexArray[0]; j < indexArray[1]; j++) {
let x = detections.multiHandLandmarks[i][j].x * p.width;
let y = detections.multiHandLandmarks[i][j].y * p.height;
// let z = detections.multiHandLandmarks[i][j].z;
p.stroke(hue, 40, 255);
p.ellipse(x, y, 1, 1);
}
}
}
p.drawLines = function(index) {
p.stroke(0, 0, 255);
p.strokeWeight(0.5);
p.colorMode(p.HSB);
for(let i=0; i<detections.multiHandLandmarks.length; i++){
for(let j=0; j<index.length-1; j++){
let x = detections.multiHandLandmarks[i][index[j]].x * p.width;
let y = detections.multiHandLandmarks[i][index[j]].y * p.height;
let _x = detections.multiHandLandmarks[i][index[j+1]].x * p.width;
let _y = detections.multiHandLandmarks[i][index[j+1]].y * p.height;
p.line(x, y, _x, _y);
}
}
}
p.attiva_audio = function () {
if (audio_attivo == false) {
audio_attivo = true;
if (p.getAudioContext().state !== 'running') {
p.userStartAudio();
}
}
else {
audio_attivo = false;
p.getAudioContext().suspend();
}
}
p.calcola_lunghezza = function(x1, x2, y1, y2) {
return p.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
p.calcola_distanza_tot = function (punti) {
let distanza_totale = 0;
let numero_punti = punti.length;
for (let i = 0; i < numero_punti; i++) {
for (let j = i + 1; j < numero_punti; j++) {
let d = p.dist(punti[i].x, punti[i].y, punti[j].x, punti[j].y);
distanza_totale += d;
}
}
return distanza_totale;
}
p.calcola_punto_centrale = function(punti) {
let xSum = 0;
let ySum = 0;
let numPoints = punti.length;
for (let punto of punti) {
xSum += punto.x;
ySum += punto.y;
}
let centerX = xSum / numPoints;
let centerY = ySum / numPoints;
return { x: centerX, y: centerY };
}
} //fine sketch
let myp5 = new p5(sketch);