import promidi.*; MidiIO midiIO; int MIDI_OUT_DEVICE = 2; final float GRAVITY = 0.016; final boolean DEBUG = false; PFont font; java.util.ArrayList balls; Circle[] circles; boolean isReady = true; int latency; final int latencyMax = 10; void setup() { // midi midiIO = MidiIO.getInstance(this); midiIO.printDevices(); smooth(); font = loadFont("BitstreamVeraSans-Roman-10.vlw"); textFont(font, 10); size(256, 256); ellipseMode(CENTER); balls = new java.util.ArrayList(); circles = new Circle[9]; circles[0] = new Circle(215, 70, 40, 10, 0.005, 0); circles[1] = new Circle( 90, 50, 10, 6, 0.030, 0); circles[2] = new Circle( 60, 100, 25, 10, 0.004, 0); circles[3] = new Circle( 30, 180, 25, 10, 0.010, 0); circles[4] = new Circle(100, 195, 15, 8, 0.005, 0); circles[5] = new Circle(140, 195, 15, 8, 0.004, 0); circles[6] = new Circle(180, 190, 15, 8, -0.005, 0); circles[7] = new Circle(235, 160, 15, 8, -0.005, 0); circles[8] = new Circle(128, 88, 15, 8, -0.020, 0); background(255); } void draw() { if (latency > 0) { latency--; if (latency == 0) isReady = true; } if (keyPressed && isReady) { balls.add(new Ball(width/2, 0)); latency = latencyMax; isReady = false; } background(255); for (int i = 0; i < balls.size(); i++) { Ball ball = (Ball)balls.get(i); ball.move(circles); ball.display(); if (ball.y > height) balls.remove(ball); } for (int i = 0; i < circles.length; i++) { circles[i].display(); } drawRipples(); fill(0); text("Press a key to make a ball fall", 5, 240); fill(150); text("FPS: " + int(frameRate), 215, 240); fill(0); text("Change MIDI OUT :", 5, 252); noStroke(); fill(255, 100, 100); rect(98, 243, 158, 13); fill(0); text(midiIO.getOutputDeviceName(MIDI_OUT_DEVICE), 103, 253); } void mouseClicked() { if (mouseY < 243) return; if (mouseX < 98) return; switch (mouseButton) { case LEFT: if (MIDI_OUT_DEVICE < midiIO.numberOfOutputDevices()-1) { MIDI_OUT_DEVICE++; for (int i = 0; i < circles.length; i++) { circles[i].resetMidiOut(); } } break; case RIGHT: if (MIDI_OUT_DEVICE > 0) { MIDI_OUT_DEVICE--; for (int i = 0; i < circles.length; i++) { circles[i].resetMidiOut(); } } break; } }