
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Receiver;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.ShortMessage;

public class Chopinist {
    private Synthesizer theSynthesizer;
    private Receiver theReceiver;
    private int noteIndex = 0;
    private int lastSounding = 0;
    
    public Chopinist() {
        try {
            theSynthesizer = MidiSystem.getSynthesizer();
            theReceiver = theSynthesizer.getReceiver();
            theSynthesizer.open();
        } catch (MidiUnavailableException mue) {
            mue.printStackTrace();
        }
    }
    
    public boolean playNext() { // true if a note got played
        ShortMessage message = new ShortMessage();
        if (noteIndex < aMajorSonata.length) {
            try {
                message.setMessage(ShortMessage.NOTE_ON, aMajorSonata[noteIndex], 127);
                theReceiver.send(message, -1L);
                noteIndex++;
                return true;
            } catch (InvalidMidiDataException imde) {
                imde.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    }
    
    public void silence() {
        ShortMessage message = new ShortMessage();
        while (lastSounding < noteIndex)
            try {
                message.setMessage(ShortMessage.NOTE_OFF, aMajorSonata[lastSounding], 0);
                theReceiver.send(message, -1L);
                lastSounding++;
            } catch (InvalidMidiDataException imde) {
                imde.printStackTrace();
            }
    }
    
    public void reset() {
        silence();
        noteIndex = 0;
        lastSounding = 0;
    }
    
    protected void finalize() {
        theSynthesizer.close();
    }
    
    private static int [] aMajorSonata =
    {64,73,74,71,71,71,78,75,76,81,81,81,73,70,71,74,74,74,68,68,69,73,73,73,
     64,73,74,71,71,71,78,75,76,85,85,85,73,73,74,78,78,78,68,71,69,81,81,81};
    
    /* Test Harness */
    public static void main(String [] args) {
        Chopinist me = new Chopinist();
        for (int i = 0; i < aMajorSonata.length; i++) {
            me.playNext();
            try {
                Thread.sleep(500);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
            me.silence();
        }
    }
}
