import javax.sound.midi.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

// Type keys to get different percussion effects.
// See java.awt.event.KeyEvent for VK_ keycodes for each key.  Codes
// between 35 and 81, inclusive, generate sounds.  Experiment!
// Move the mouse up and down to control volume: down is louder

public class DrumsApplet extends Applet {
    MidiChannel channel;  // The channel we play on: 10 is for percussion
    int velocity = 64;    // Default volume is 50%

    public void init() {
	try {
	    Synthesizer synthesizer = MidiSystem.getSynthesizer();
	    synthesizer.open();
	    // Channel 10 is a special percussion channel
	    channel = synthesizer.getChannels()[9];
	    
	    addKeyListener(new KeyAdapter() {
		    public void keyPressed(KeyEvent e) {
			int key = e.getKeyCode();
			if (key >= 35 && key <= 81) {
			    channel.noteOn(key, velocity);
			}
		    }
		    public void keyReleased(KeyEvent e) {
			int key = e.getKeyCode();
			if (key >= 35 && key <= 81)	channel.noteOff(key);
		    }
		});
	    
	    addMouseMotionListener(new MouseMotionAdapter() {
		    public void mouseMoved(MouseEvent e) {
			velocity = e.getY();
		    }
		});
	}
	catch(MidiUnavailableException e) {
	    e.printStackTrace();
	}
    }

    public void paint(Graphics graphics) {
	Graphics2D g = (Graphics2D) graphics;
	g.setPaint(new GradientPaint(0, 0, Color.white,
				     0, getHeight(), Color.red));
	g.fillRect(0, 0, getWidth(), getHeight());
    }
}


