xxxxxxxxxx
93
/*
----- Sound Mini Series by Patt Vira -----
Name: EP5_p5.FFT - Final Visualization
Video Tutorial: https://youtu.be/8O5aCwdopLo
Connect with Patt: @pattvira
https://www.pattvira.com/
----------------------------------------
*/
let size = 15; let num = 10;
let grid = []; let min = 150;
let song; let fft;
let spectrum = [];
let distFromCenter = [];
function preload() {
song = loadSound("Veiil.mp3");
}
function setup() {
createCanvas(400, 400, WEBGL);
song.play();
fft = new p5.FFT();
for (let i=0; i<num; i++) {
grid[i] = [];
for (let j=0; j<num; j++) {
grid[i][j] = [];
for (let k=0; k<num; k++) {
grid[i][j][k] = floor(random(2));
let offset = size/2 - num/2*size;
let x = i*size + offset;
let y = j*size + offset;
let z = k*size + offset;
let distance = dist(x, y, z, 0, 0, 0);
distFromCenter.push({i, j, k, distance});
}
}
}
distFromCenter.sort(compareDistances);
}
function compareDistances(a, b) {
return a.distance - b.distance;
}
function draw() {
background(220);
orbitControl();
spectrum = fft.analyze();
let vol = fft.getEnergy(20, 140);
if (vol > 240) {
stroke(255, 255, 0, 20);
} else {
stroke(0, 20);
}
let totalCubes = num*num*num;
for (let i=0; i<totalCubes; i++) {
let pos = distFromCenter[i];
let c = map(spectrum[i], 0, 255, min, 255);
grid[pos.i][pos.j][pos.k] = c;
}
let offset = size/2 -num/2 * size
translate(offset, offset, offset);
noFill();
for (let i=0; i<num; i++) {
for (let j=0; j<num; j++) {
for (let k=0; k<num; k++) {
if (grid[i][j][k] > min) {
fill(grid[i][j][k], 0, 200);
} else {
noFill();
}
push();
translate(i*size, j*size, k*size);
box(size - size/4);
pop();
}
}
}
}