package org.herac.tuxguitar.midiinput;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Transmitter;
import org.herac.tuxguitar.gui.TuxGuitar;
import org.herac.tuxguitar.util.TGSynchronizer;
public class MiPort implements Receiver {
private static MiPort s_ControlPort;
private static MiPort s_NotesPort;
public static long getNotesPortTimeStamp() {
if (s_NotesPort != null)
return (s_NotesPort.f_Device.getMicrosecondPosition());
else
return (-1);
}
public static void setControlPort(String inDeviceName) throws MiException {
if (s_ControlPort != null)
s_ControlPort.closePort();
MidiDevice device = MiPortProvider.getDevice(inDeviceName);
if (device != null) {
s_ControlPort = new MiPort(device);
s_ControlPort.openPort();
}
}
public static void setNotesPort(String inDeviceName) throws MiException {
if (s_NotesPort != null)
s_NotesPort.closePort();
MidiDevice device = MiPortProvider.getDevice(inDeviceName);
if (device != null) {
s_NotesPort = new MiPort(device);
s_NotesPort.openPort();
}
}
private MidiDevice f_Device;
private Transmitter f_Transmitter;
private MiPort(MidiDevice inDevice) {
this.f_Device = inDevice;
}
public void close() {
}
/*
* Notes port management
*/
protected synchronized void closePort() throws MiException {
try {
if (this.f_Transmitter != null) {
final Transmitter transmitter = this.f_Transmitter;
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
public void run() throws Throwable {
transmitter.close();
connectTransmitter(null);
}
});
}
if (this.f_Device.isOpen()) {
final MidiDevice device = this.f_Device;
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
public void run() throws Throwable {
device.close();
}
});
}
} catch (Throwable t) {
throw new MiException(TuxGuitar
.getProperty("midiinput.error.midi.port.close"), t);
}
}
protected void connectTransmitter(Transmitter inTransmitter) {
this.f_Transmitter = inTransmitter;
if (this.f_Transmitter != null)
this.f_Transmitter.setReceiver(this);
}
/*
* Control port management
*/
public String getName() {
return this.f_Device.getDeviceInfo().getName();
}
/*
* javax.sound.midi.Receiver implementation
*/
protected synchronized void openPort() throws MiException {
try {
if (!this.f_Device.isOpen()) {
final MidiDevice device = this.f_Device;
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
public void run() throws Throwable {
device.open();
}
});
}
if (this.f_Transmitter == null) {
final MidiDevice device = this.f_Device;
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
public void run() throws Throwable {
connectTransmitter(device.getTransmitter());
}
});
}
} catch (Throwable t) {
throw new MiException(TuxGuitar
.getProperty("midiinput.error.midi.port.open"), t);
}
}
public void send(MidiMessage inMessage, long inTimeStamp) {
if (inMessage instanceof ShortMessage) {
ShortMessage mm = (ShortMessage) inMessage;
switch (mm.getCommand()) {
case ShortMessage.NOTE_ON:
case ShortMessage.NOTE_OFF:
MiProvider.instance().noteReceived(mm, inTimeStamp);
break;
case ShortMessage.CONTROL_CHANGE:
// System.err.println("Control change");
break;
}
}
}
}