// Grafik - Bibliotheken:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
// MIDI - Bibliothek:
import javax.sound.midi.*;

/*
 * Testapplikation schickt einen Ton zu externem Gerät:
 * Grafisches Fenster, welches von MIDITest instanziert wird
 * Verwendete Hardware: RomI/O USB MIDI Interface und 
 * Yamaha Portatone PSR-GX76
 * 
 * Created on 7.10.2006 / Sö
 */

public class MIDITestFrame extends JFrame {

	JTextArea t;

	MIDITestFrame() {

		// Grafische Oberfläche aufbauen:
		JPanel cp = (JPanel) this.getContentPane();
		cp.setLayout(new BorderLayout());
		JButton b = new JButton("Start");
		cp.add(b, BorderLayout.NORTH);
		t = new JTextArea();
		cp.add(t, BorderLayout.CENTER);

		// Aktion bei Tastenbetätigung:
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				// MIDI:
				// Hole vom Midisystem die Geräteinformationen:
				MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
				// Deklariere das Ausgabegerät:
				MidiDevice out;
				// Deklariere den Empfänger für das Ausgabegerät:
				Receiver outRcvr;
				try {
					// Ausgabegerät ist bei mir die Nummer 2:
					int i = 2;
					// Hole dieses Gerät:
					out = MidiSystem.getMidiDevice(infos[i]);
					// und zeige seine Infos an:
					String s = "MIDI Schnittstelle: \n";
					s = s + infos[i].getName() + "\n";
					t.setText(s);
					// öffne das Gerät, falls noch nicht offen:
					if (!out.isOpen())out.open();
					else s = s + "Port schon offen\n";
					t.setText(s);
					// hole den Empfänger des Gerätes:
					outRcvr = out.getReceiver();
					// Mache einen Ton (MIDI Message):
					ShortMessage myMsg = new ShortMessage();
					// Setze die Eigenschaften des Tones:
					// (Midi Kommando, Kanal, 
					// erstes Datenbyte (Tonhöhe), zweites Db.(Dynamik))
					myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
					// Kein Zeitstempel:
					long timeStamp = -1;
					// Schicke den Ton an den Empfänger des Ausgabegerätes:
					outRcvr.send(myMsg, timeStamp);
					// warte bis der Ton verklungen ist:
					Thread.sleep(2000);
					// Schliesse das Ausgabegerät:
					out.close();
					s = s + "Ende.";
					t.setText(s);
				// Fehler abfangen:
				} catch (MidiUnavailableException e1) {
					System.out.println("MIDI Geräte - Fehler!");
					e1.printStackTrace();
				} catch (InvalidMidiDataException e2) {
					System.out.println("MIDI Message - Fehler!");
					e2.printStackTrace();
				} catch (InterruptedException e3) {
					System.out.println("Thread unterbrochen!");
					e3.printStackTrace();
				}
			}
		});
	}
}
