xxxxxxxxxx
213
let numero_cerchi = 9;
let x = [numero_cerchi];
let y = [numero_cerchi];
let target_x = [numero_cerchi];
let target_y = [numero_cerchi];
let trigger = [numero_cerchi] , trigger_pre = [numero_cerchi];
let lunghezza_a = [numero_cerchi];
let lunghezza_b = [numero_cerchi];
let lunghezza_c = [numero_cerchi];
let semiperimetro = [numero_cerchi];
let area = [numero_cerchi];
let riempi_triangoli = [numero_cerchi];
let riempi_triangoli_pre = [numero_cerchi];
//let numero_osc = numero_cerchi - 2;
let osc = [numero_cerchi];
let modulante = [numero_cerchi];
let frequenza = [numero_cerchi];
let ampiezza = [numero_cerchi];
let freq_min = 100;
let freq_max = 400;
//area max 80000
//area triangolo con formula erone -> amp sintesi
// semi_perimetro = (a + b + c) * 0.5
// area = sqrt(p * (p - a) * (p - b) * (p - c))
//trigger audio ogni volta che raggiunge il target_x, durata inviluppo data da tempo per raggiungere target_x successivo
//trigger Modulazione ogni volta che raggiunge il target_y, durata inviluppo data da tempo per raggiungere target_y successivo
//mettere in relazione le aree adiacenti
//il colore del triangolo da il timbro
function setup() {
createCanvas(600, 500);
raggio = width * 0.01;
frameRate(30);
for(let i = 0; i < numero_cerchi; i++) {
x[i] = 0;
y[i] = 0;
target_x[i] = floor(random(width));
target_y[i] = floor(random(height));
area[i] = 0;
trigger[i] = 0;
trigger_pre[i] = 0;
// riempi_triangoli[i] = ((i + 1) / numero_cerchi) * 255;
riempi_triangoli[i] = random(230);
while (abs(riempi_triangoli[i] - riempi_triangoli_pre [i]) < 100) {
riempi_triangoli[i] = random(230);
}
riempi_triangoli_pre[i] = riempi_triangoli[i];
}
for (let i = 0; i < numero_cerchi; i++) {
//if riempi triangoli è più bianco allora da sine a saw
frequenza[i] = random(100, 400);
osc[i] = new p5.Oscillator('sine');
osc[i].start();
modulante[i] = new p5.Oscillator('sine');
modulante[i].start();
modulante[i].disconnect(); //disconnetto modulante da output
}
} //fine setup()
function draw() {
background(50);
stroke(255);
for (let i = 0; i < numero_cerchi; i++) {
if (x[i] < target_x[i]) {
x[i]++;
}
if (x[i] > target_x[i]) {
x[i]--;
}
if (x[i] == target_x[i]) {
target_x[i] = floor(random(width));
frequenza[i] = map(x[i], 0, width, freq_min, freq_max);
}
if (y[i] < target_y[i]) {
y[i]++;
}
if (y[i] > target_y[i]) {
y[i]--;
}
if (y[i] == target_y[i]) {
target_y[i] = floor(random(height));
frequenza[i] = map(y[i], 0, height, freq_min, freq_max);
}
} //fine for generazione grafica
//-------------calcolo triangoli----------------//
for (let i = 0; i < numero_cerchi; i++) {
fill(riempi_triangoli[i]);
if (i < (numero_cerchi - 2)) {
triangle(x[i], y[i], x[i +1], y[i + 1], x[i + 2], y[i + 2]);
lunghezza_a[i] = calcola_lunghezza(x[i], x[i + 1], y[i], y[i + 1]);
lunghezza_b[i] = calcola_lunghezza(x[i + 1], x[i + 2], y[i + 1], y[i + 2]);
lunghezza_c[i] = calcola_lunghezza(x[i + 2], x[i], y[i + 2], y[i]);
semiperimetro[i] = somma_lunghezze(lunghezza_a[i], lunghezza_b[i], lunghezza_c[i]);
area[i] = calcola_eulero(semiperimetro[i], lunghezza_a[i], lunghezza_b[i], lunghezza_c[i]);
}
else if (i < (numero_cerchi - 1)) {
triangle(x[i], y[i], x[i + 1], y[i + 1], x[numero_cerchi - 1], y[numero_cerchi - 1]);
lunghezza_a[i] = calcola_lunghezza(x[i], x[i + 1], y[i], y[i + 1]);
lunghezza_b[i] = calcola_lunghezza(x[i + 1], x[numero_cerchi - 1], y[i + 1], y[numero_cerchi - 1]);
lunghezza_c[i] = calcola_lunghezza(x[numero_cerchi - 1], x[i], y[numero_cerchi - 1], y[i]);
semiperimetro[i] = somma_lunghezze(lunghezza_a[i], lunghezza_b[i], lunghezza_c[i]);
area[i] = calcola_eulero(semiperimetro[i], lunghezza_a[i], lunghezza_b[i], lunghezza_c[i]);
}
}//fine calcolo triangoli
//-------------sintesi sonora----------------//
for (let i = 0; i < numero_cerchi; i++) {
if (i < numero_cerchi - 1) {
ampiezza[i] = map(area[i], 0, 80000, 0.00, (1 / (numero_cerchi - 1)));
//frequenza[i] = map(x[i], 0, width, freq_min, freq_max);
modulante[i].freq(frequenza[i + 1]);
modulante[i].amp(area[i + 1] * 0.2 * (y[i + 1] / height) + 0.00001);
osc[i].freq(frequenza[i]);
osc[i].freq(modulante[i]);
osc[i].amp(ampiezza[i] + 0.00001);
}
else {
ampiezza[i] = map(area[i], 0, 80000, 0.00, (1 / (numero_cerchi - 1)));
frequenza[i] = map(x[i], 0, width, 50, 1000);
modulante[i].freq(frequenza[0]);
modulante[i].amp(area[0] * 0.1 * (y[0] / height) + 0.00001);
osc[i].freq(frequenza[i]);
osc[i].freq(modulante[i]);
osc[i].amp(ampiezza[i] + 0.00001);
}
} // fine sintesi sonora
/* ampiezza[numero_cerchi - 3] = map(area[numero_cerchi - 3], 0, 80000, 0.00, (1 / (numero_cerchi - 1)));
frequenza[numero_cerchi - 3] = map((y[numero_cerchi - 3] * x[numero_cerchi - 3]), 0, (height * width), 100, 400);
modulante[numero_cerchi - 3].freq(frequenza(0));
modulante[numero_cerchi - 3].amp(ampiezza(0));
osc[numero_cerchi - 3].freq(frequenza[numero_cerchi - 3] * modulante[i]);
osc[numero_cerchi - 3].amp(ampiezza[numero_cerchi - 3] + 0.00001); */
//-------------utility----------------//
for (let i = 0; i < numero_cerchi; i++) {
trigger_pre[i] = trigger[i];
}
// print(int(area[0]), int(area[1]), int(area[2]), int(area[3]));
} //fine draw()
function calcola_lunghezza(x1, x2, y1, y2) {
return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
function somma_lunghezze(L1, L2, L3) {
return ((L1 + L2 + L3) * 0.5);
}
function calcola_eulero(p, a, b, c) {
return sqrt(p * (p - a) * (p - b) * (p - c));
}