import ddf.minim.*; AudioPlayer player; Minim minim; boolean beatSwitches[] = {true, true, true, false, false, true, true, false}; float bpm = 180.0; int mspb = int(60000.0/bpm); int msoff = -125; int old_beat = 0; int new_beat = 0; int k = 32; int sh = 0; class Throbber { float throbState = 0; float throbRate = 0.85; void bang() { throbState = 1; } void update() { throbState *= throbRate; } void draw(int shift) { ellipse(k+shift,k,2*k*throbState*throbState,2*k*throbState); } } Throbber sys = new Throbber(); Throbber user = new Throbber(); void setup() { size(2*k, 2*k, P3D); frameRate(30); noStroke(); minim = new Minim(this); player = minim.loadFile("fralbs.mp3", 1024); player.loop(); player.play(); player.skip(int(mspb*64)); } void mousePressed() { bang(); } void keyPressed() { bang(); } void bang() { int now_millis = player.position()+msoff; int target_millis = int(((player.position()+msoff)/mspb)*mspb); if(now_millis - target_millis > mspb/2) { target_millis += mspb; } user.bang(); sh = 2*k*(now_millis - target_millis)/mspb; println(now_millis - target_millis); } void draw() { sys.update(); user.update(); new_beat = (player.position()+msoff)/mspb; if(new_beat != old_beat) { if (beatSwitches[new_beat%8]) { sys.bang(); } } old_beat = new_beat; background(0); fill(255,0,0); sys.draw(0); fill(255); user.draw(sh); } void stop() { // always close Minim audio classes when you are done with them player.close(); minim.stop(); super.stop(); }