xxxxxxxxxx
92
// Visuals
let num = 10; let size = 20;
let grid = [];
let angle = 0; let min = 150;
let distfromCenter = [];
// Sound
let song; let fft; let spectrum;
function preload() {
song = loadSound("Veiil.mp3");
}
function setup() {
createCanvas(800, 500, WEBGL);
angleMode(DEGREES);
fft = new p5.FFT();
song.play();
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] = 255;
let offset = -size * num/2 + size/2;
let x = i*size + offset;
let y = j*size + offset;
let z = k*size + offset;
let distance = sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
distfromCenter.push({i, j, k, distance});
}
}
}
distfromCenter.sort((a, b) => a.distance - b.distance);
}
function draw() {
background(100);
orbitControl();
rotateX(-15);
rotateY(angle);
translate(-size*num/2 + size/2,
-size*num/2 + size/2,
-size*num/2 + size/2);
spectrum = fft.analyze();
let vol = fft.getEnergy(20, 140);
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;
}
if (vol > 240) {
stroke(255, 255, 0, 20);
} else {
stroke(0, 20);
}
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();
}
}
}
angle += 0.1;
}