import ddf.minim.signals.*; import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; int[] circleX; float[] circleY; int[] circleXSpeed; float[] circleYSpeed; float[] circleAngle; int[] circleDistance; float[] currentPos; float[] prevPos; float[] fillColor; boolean[] circleActivated; int numberOfCircles = 30; int circleMouseIsOver; float distanceFromCenterOfCircle; int diameter = 40; AudioSample drum1; AudioSample drum2; AudioSample drum3; AudioSample drum4; AudioSample drum5; AudioSample drum6; AudioSample drum7; AudioSample drum8; AudioSample drum9; AudioSample drum10; AudioSample drum11; AudioSample drum12; AudioSample synth1; AudioSample synth2; AudioSample synth3; AudioSample synth4; AudioSample synth5; AudioSample synth6; AudioSample synth7; AudioSample synth8; AudioSample synth9; AudioSample synth10; AudioSample synth11; AudioSample synth12; AudioPlayer sound1; AudioPlayer sound2; AudioPlayer sound3; AudioPlayer sound4; AudioPlayer sound5; AudioPlayer sound7; AudioPlayer sound8; AudioPlayer sound9; void setup() { frameRate(30); size(600, 400); Minim.start(this); circleX = new int[numberOfCircles]; circleY = new float[numberOfCircles]; circleXSpeed = new int[numberOfCircles]; circleYSpeed = new float[numberOfCircles]; circleAngle = new float[numberOfCircles]; circleDistance = new int[numberOfCircles]; currentPos = new float[numberOfCircles]; prevPos = new float[numberOfCircles]; fillColor = new float[numberOfCircles]; circleActivated = new boolean[numberOfCircles]; drum1 = Minim.loadSample ("drum1.aif", 512); drum2 = Minim.loadSample ("drum2.aif", 512); drum3 = Minim.loadSample ("drum3.aif", 512); drum4 = Minim.loadSample ("drum4.aif", 512); drum5 = Minim.loadSample ("drum5.aif", 512); drum6 = Minim.loadSample ("drum6.aif", 512); drum7 = Minim.loadSample ("drum7.aif", 512); drum8 = Minim.loadSample ("drum8.aif", 512); drum9 = Minim.loadSample ("drum9.aif", 512); drum10 = Minim.loadSample ("drum10.aif", 512); drum11 = Minim.loadSample ("drum11.aif", 512); drum12 = Minim.loadSample ("drum12.aif", 512); synth1 = Minim.loadSample ("syntha.aif", 512); synth2 = Minim.loadSample ("synthb.aif", 512); synth3 = Minim.loadSample ("synthc.aif", 512); synth4 = Minim.loadSample ("synthd.aif", 512); synth5 = Minim.loadSample ("synthe.aif", 512); synth6 = Minim.loadSample ("synthf.aif", 512); synth7 = Minim.loadSample ("synthg.aif", 512); synth8 = Minim.loadSample ("syntha2.aif", 512); synth9 = Minim.loadSample ("synthb2.aif", 512); synth10 = Minim.loadSample ("synthc2.aif", 512); synth11 = Minim.loadSample ("synthd2.aif", 512); synth12 = Minim.loadSample ("synthe2.aif", 512); sound1 = Minim.loadFile ("sound1.aif", 512); sound2 = Minim.loadFile ("sound2.aif", 512); sound3 = Minim.loadFile ("sound3.aif", 512); sound4 = Minim.loadFile ("sound4.aif", 512); sound5 = Minim.loadFile ("sound5.aif", 512); sound7 = Minim.loadFile ("sound7.aif", 512); sound8 = Minim.loadFile ("sound8.aif", 512); sound9 = Minim.loadFile ("sound9.aif", 512); for(int i = 0; i < circleX.length; i++) { circleX[i] = int(random(width)); circleY[i] = int(random(height)); circleXSpeed[i] = 2-int(random(4)); circleYSpeed[i] = 1.5; circleDistance[i] = 0; currentPos[i] = 0; prevPos[i] = 0; circleMouseIsOver = 0; } smooth(); } void draw() { background(0); for(int i = 0; i < circleX.length; i++) { fillColor[i] = norm(circleX[i], 0, width); if(circleActivated[i]) { circleX[i] = circleX[i]+circleXSpeed[i]; circleAngle[i] += circleYSpeed[i]; circleY[i]= -abs(sin(circleAngle[i]) * circleDistance[i])+height-diameter/2; fillColor[i] = norm(circleX[i], 0, width); if( circleX[i] > width || circleX[i] < 0) { circleXSpeed[i] *= -1; } currentPos[i] = (sin(circleAngle[i]) * circleDistance[i]); if(prevPos[i] > 0 && currentPos[i] < 0 || prevPos[i] < 0 && currentPos[i] > 0) { if(i < 10) { playDrum(circleX[i]); } else if (i >= 10 && i < 20){ playSynth(circleX[i]); } else if (i >= 20 && i < 30){ playSound(circleX[i]); } for(int c = 0; c < 100; c++) { //glow when shape hits noFill(); colorMode(HSB, 255); stroke(fillColor[i]*100, 255, 255, 100-c); ellipse(circleX[i], height+6, c, c/2); } } prevPos[i] = (sin(circleAngle[i]) * circleDistance[i]); } else { if(i < 10){ circleX[i] = 200; circleY[i] = diameter/2; } if(i >= 10 && i < 20){ circleX[i] = 300; circleY[i] = diameter/2; } if(i >= 20 && i < 30){ circleX[i] = 400; circleY[i] = diameter/2; } } if(mousePressed) { circleX[circleMouseIsOver] = mouseX; circleY[circleMouseIsOver] = mouseY; circleYSpeed[circleMouseIsOver] = 0; } if (i == circleMouseIsOver) { colorMode(RGB, 255); strokeWeight(3); stroke(255); } else { noStroke(); } colorMode(HSB, 255); fill(fillColor[i]*100, 255, 255, 200); if(i < 10){ rect( circleX[i]-diameter/2.2, circleY[i]-diameter/2.4, diameter/1.1, diameter/1.1 ); } if(i >= 10 && i < 20){ ellipse( circleX[i], circleY[i], diameter, diameter ); } if(i >= 20 && i < 30){ triangle(circleX[i]-diameter/1.8, circleY[i]-diameter/2.8, circleX[i]+diameter/1.8, circleY[i]-diameter/2.8, circleX[i], circleY[i]+diameter/2); } } } void mouseMoved() { for(int i = 0; i < circleX.length; i++) { if (dist(mouseX, mouseY, circleX[i], circleY[i]) < diameter/2) { circleMouseIsOver = i; } } } void mouseReleased() { prevPos[circleMouseIsOver] = 0; for(int i = 0; i < circleX.length; i++) { if (i == circleMouseIsOver) { circleActivated[i] = true; circleAngle[i] = 1.5; circleXSpeed[circleMouseIsOver] = mouseX - pmouseX; circleDistance[i] = height-mouseY-diameter/2; circleY[i] = mouseY; //circleYSpeed[i] = 1.5*(2*height/circleDistance[i])/30; if (circleDistance[i] <= 16 || circleDistance[i] == 0) { circleYSpeed[i] = 0; circleXSpeed[i] = 0; circleDistance[i] = 0; } else if ((2*height/circleDistance[i]) <= 1) { circleYSpeed[i] = .05; } else if ((2*height/circleDistance[i]) == 2) { circleYSpeed[i] = .1; } else if ((2*height/circleDistance[i]) == 3) { circleYSpeed[i] = .15; } else if ((2*height/circleDistance[i]) == 4 || (2*height/circleDistance[i]) == 5) { circleYSpeed[i] = .2; } else if ((2*height/circleDistance[i]) >= 6 && (2*height/circleDistance[i]) <= 10) { circleYSpeed[i] = .3; } else if ((2*height/circleDistance[i]) >= 11 && circleDistance[i] > 16) { circleYSpeed[i] = .4; } } } } void playDrum(int x) { if(x < 50) { drum1.trigger(); } if(x >= 50 && x < 100) { drum2.trigger(); } if(x >= 100 && x < 150) { drum3.trigger(); } if(x >= 150 && x < 200) { drum4.trigger(); } if(x >= 200 && x < 250) { drum5.trigger(); } if(x >= 250 && x < 300) { drum6.trigger(); } if(x >= 300 && x < 350) { drum7.trigger(); } if(x >= 350 && x < 400) { drum8.trigger(); } if(x >= 400 && x < 450) { drum9.trigger(); } if(x >= 450 && x < 500) { drum10.trigger(); } if(x >= 500 && x < 550) { drum11.trigger(); } if(x >= 550 && x < 600) { drum12.trigger(); } } void playSynth(int x) { if(x < 50) { synth1.trigger(); } if(x >= 50 && x < 100) { synth2.trigger(); } if(x >= 100 && x < 150) { synth3.trigger(); } if(x >= 150 && x < 200) { synth4.trigger(); } if(x >= 200 && x < 250) { synth5.trigger(); } if(x >= 250 && x < 300) { synth6.trigger(); } if(x >= 300 && x < 350) { synth7.trigger(); } if(x >= 350 && x < 400) { synth8.trigger(); } if(x >= 400 && x < 450) { synth9.trigger(); } if(x >= 450 && x < 500) { synth10.trigger(); } if(x >= 500 && x < 550) { synth11.trigger(); } if(x >= 550 && x < 600) { synth12.trigger(); } } void playSound(int x) { if(x < 50) { sound1.rewind(); sound1.play(); } if(x >= 50 && x < 100) { sound2.rewind(); sound2.play(); } if(x >= 100 && x < 150) { sound3.rewind(); sound3.play(); } if(x >= 150 && x < 200) { sound4.rewind(); sound4.play(); } if(x >= 200 && x < 300) { sound5.rewind(); sound5.play(); } if(x >= 300 && x < 400) { sound7.rewind(); sound7.play(); } if(x >= 400 && x < 500) { sound8.rewind(); sound8.play(); } if(x >= 500 && x < 600) { sound9.rewind(); sound9.play(); } }