Documentation:
Idea: To create motion graphics that respond to sound frequency and amplitude and have input from Arduino to change the appearance of the visuals.
Artistic concept: Using geometry , 3D boxes specifically.
What was done well:
I think the composition of the 3D shapes is aesthetically pleasing.
I successfully mapped potentiometer values to color change in the visuals.
What could I have done better:
Maybe included more input from the user side, like more sensors , but I was short on time.
Tidier code – as this was a learning process for me the code might be harder to follow.
What I learned:
How to use the minim and sound library, the project taught me a-lot about motion graphics and 3D design in processing.
//I used inspiration from this persons work
//https://github.com/KartikShrivastava/3d-Audio-Visualizer-P3D/commit/d811270ff38dff160a2bf211b38068cab54f1b50
//Song from :https://www.youtube.com/watch?v=MtbzPhj0biE
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;
import processing.serial.*;
Serial myPort;
int xColor=0;
int xColor1=0;
FFT fft;
AudioPlayer player;
Minim minim;
float rotateAll = 0;
int depth, flashTimer = 0;
boolean flash=false;
float x;
int spacing = 100;
int border = spacing*2;
int amplification = 50;
int y = spacing;
void setup() {
stroke(0, 239, 135);
strokeWeight(5);
printArray(Serial.list());
String portname=Serial.list()[4];
println(portname);
myPort = new Serial(this, portname, 9600);
size(900, 900, P3D);
background(0);
minim = new Minim(this);
player = minim.loadFile("jingle.mp3");
player.play();
fft = new FFT(player.bufferSize(), player.sampleRate());
}
void draw() {
background(0, 20, 20);
lights();
//colorchange();
drawback(); //background
fft.forward(player.mix);
pushMatrix();
translate(width/2, height/2, -120);
for (int i=0; i<24; i++) {
pushMatrix();
rotateY(180);
x=x+1*0.01;
translate(x, 200, 0);
if (fft.getBand(i)*1 > 300) {
if (i==4 && fft.getBand(i)*1 > 1000) {
flash = true;
}
} else {
//stroke(0, 239, 135);
float r=0 ;
float b=255 ;
r = map(xColor, 0, 600, 0, 100);
b = map(xColor, 0, 600, 100, 0);
//fill(0, 254, 179, 33);
fill(r, 300, b, r);
stroke(r, 0, b);
}
//box 1
box(50, (-fft.getBand(i)*5) - 80, 50);
rotateY(270);
popMatrix();
pushMatrix();
translate(width/2+x, height/2, 0);
//box 2
box(50, (-fft.getBand(i)*5) - 80, 50);
popMatrix();
pushMatrix();
translate(width/2, height/2+x, -200);
//box3
box(50, (-fft.getBand(i)*5) - 80, 50);
popMatrix();
pushMatrix();
translate(width/3, height/3+x, -200);
//box4
box(150, (-fft.getBand(i)*5) - 80, 50);
popMatrix();
pushMatrix();
translate(-100+x, 100, -400);
//box5
rotateX(180);
box(150, (-fft.getBand(i)*5) - 80, 50);
popMatrix();
rotateX(180);
box(150, (-fft.getBand(i)*5) - 80, 50);
}
popMatrix();
}
void drawback() {
strokeWeight(4);
rectMode(CENTER);
stroke(#ff6ec7);
player.play();
float amplitude = player.mix.level();
fill(random(0), amplitude*155);
int x = int(map(player.position(), 0, player.length(), 0, width/2));
float frequency = player.mix.get(int(x))*spacing*amplification;
rect(width/2, height/2, frequency, frequency);
stroke(#1b03a3);
ellipse(width/2, height/2, frequency*100, frequency*100);
filter( BLUR, 0.5 );
}
void serialEvent(Serial myPort) {
xColor=myPort.read();
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int sensor = analogRead(A0);
delay(1); //avoid getting noisy values.
sensor /= 4; //why is it incrementally devided by 4? maybe slow it down
//also 2^8 is 256 or 1024/4 sends one byte at a time to the serial,
Serial.write(sensor);
}






