import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Track;
import javax.sound.midi.Transmitter;

/*
 * MIDI:
 * Sequenz erzeugen 
 * und diese mit Standardsynthi abspielen.
 * 
 * Created on 02.01.2007 / Sö
 */

public class MIDISequence {

	private static final int noten[] = {
		// do, mi, so:
		60,64,67
	};
	public static void main(String[] args) {
		System.out.println("Running...");
		try {
			// Erzeuge eine Sequenz mit Track:
			Sequence seq = new Sequence(Sequence.PPQ,2);
			Track track = seq.createTrack();

			// Sequenz erzeugen:
			// aktuelle Zeit:
			long tick = 0;
			// MIDI Message:
			ShortMessage msg; 
			// Instrument wählen:
			msg = new ShortMessage();
	        msg.setMessage(ShortMessage.PROGRAM_CHANGE, 0, 49, 0);
	        track.add(new MidiEvent(msg,tick));
	        // Töne hinzufügen:
			for (int i=0; i<noten.length;i++){
				msg = new ShortMessage();
				// Setze Eigenschaften, ON,, Tonhöhe, Lautstärke:
			    msg.setMessage(ShortMessage.NOTE_ON,0,noten[i],93);
			    // füge Note dem Track zu:
			    track.add(new MidiEvent(msg,tick));
			    // Zeit erhöhen:
			    tick +=6;
			}
			// letzte Note verklingen lassen:
		    msg = new ShortMessage();
		    msg.setMessage(ShortMessage.NOTE_OFF,0,noten[0],93);
		    track.add(new MidiEvent(msg,tick));
	        // Dauer der Sequenz in ms bestimmen:
		    long dauer = seq.getMicrosecondLength()/1000;
		  	
		    // Spiele die Sequenz:
			// Sequencer erzeugen und öffnen:
		    Sequencer sequencer = MidiSystem.getSequencer();
	        sequencer.open();
	        // und Sequenz einfügen:
	        sequencer.setSequence(seq);
	        // und Geschwindigkeit bestimmen:
	        sequencer.setTempoInBPM(145);
	        // Transmitter des Sequencers holen:
	        Transmitter trans = sequencer.getTransmitter();
	        // Synthesizer erzeugen und öffnen:
	        Synthesizer synth = MidiSystem.getSynthesizer();
	        synth.open();
	        // Receiver des Synthesizers holen:
	        Receiver rcvr = synth.getReceiver();
	        // und mit dem Transmitter des Sequencers verbinden:
	        trans.setReceiver(rcvr);

	        // Sequencer starten:
	        sequencer.start();
	        System.out.println("Dauer in ms: "+dauer);
	        // Warten:
	        Thread.sleep(dauer);
	        //Sequencer anhalten und Geräte schließen:
	        sequencer.stop();
	        sequencer.close();
	        synth.close();
	        
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Stop.");
	}
}
