package org.herac.tuxguitar.player.impl.jsa.sequencer;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import org.apache.log4j.Logger;
import org.herac.tuxguitar.player.base.MidiPlayerException;
import org.herac.tuxguitar.player.impl.jsa.midiport.MidiPortSynthesizer;
public class MidiReceiverImpl implements Receiver {
/** The Logger for this class. */
public static final transient Logger LOG = Logger
.getLogger(MidiReceiverImpl.class);
private MidiSequencerImpl sequencer;
public MidiReceiverImpl(MidiSequencerImpl sequencer) {
this.sequencer = sequencer;
}
public void close() {
// not implemented
}
private void parseControlChange(byte[] data) throws MidiPlayerException {
int length = data.length;
int channel = (length > 0) ? ((data[0] & 0xFF) & 0x0F) : -1;
int control = (length > 1) ? (data[1] & 0xFF) : -1;
int value = (length > 2) ? (data[2] & 0xFF) : -1;
if (channel != -1 && control != -1 && value != -1) {
this.sequencer.getTransmitter()
.sendControlChange(channel, control, value);
}
}
private void parseMessage(byte[] data) throws MidiPlayerException {
int length = data.length;
// NOTE ON
if ((((length > 0) ? (data[0] & 0xFF) : 0) & 0xF0) == ShortMessage.NOTE_ON) {
parseNoteOn(data);
}
// NOTE OFF
else if ((((length > 0) ? (data[0] & 0xFF) : 0) & 0xF0) == ShortMessage.NOTE_OFF) {
parseNoteOff(data);
}
// PROGRAM CHANGE
else if ((((length > 0) ? (data[0] & 0xFF) : 0) & 0xF0) == ShortMessage.PROGRAM_CHANGE) {
parseProgramChange(data);
}
// CONTROL CHANGE
else if ((((length > 0) ? (data[0] & 0xFF) : 0) & 0xF0) == ShortMessage.CONTROL_CHANGE) {
parseControlChange(data);
}
// PITCH BEND
else if ((((length > 0) ? (data[0] & 0xFF) : 0) & 0xF0) == ShortMessage.PITCH_BEND) {
parsePitchBend(data);
}
}
private void parseNoteOff(byte[] data) throws MidiPlayerException {
int length = data.length;
int channel = (length > 0) ? ((data[0] & 0xFF) & 0x0F) : 0;
int value = (length > 1) ? (data[1] & 0xFF) : 0;
int velocity = (length > 2) ? (data[2] & 0xFF) : 0;
this.sequencer.getTransmitter().sendNoteOff(channel, value, velocity);
}
private void parseNoteOn(byte[] data) throws MidiPlayerException {
int length = data.length;
int channel = (length > 0) ? ((data[0] & 0xFF) & 0x0F) : 0;
int value = (length > 1) ? (data[1] & 0xFF) : 0;
int velocity = (length > 2) ? (data[2] & 0xFF) : 0;
if (velocity == 0) {
parseNoteOff(data);
} else if (value > 0) {
this.sequencer.getTransmitter().sendNoteOn(channel, value, velocity);
}
}
private void parsePitchBend(byte[] data) throws MidiPlayerException {
int length = data.length;
int channel = (length > 0) ? ((data[0] & 0xFF) & 0x0F) : -1;
int value = (length > 2) ? (data[2] & 0xFF) : -1;
if (channel != -1 && value != -1) {
this.sequencer.getTransmitter().sendPitchBend(channel, value);
}
}
private void parseProgramChange(byte[] data) throws MidiPlayerException {
int length = data.length;
int channel = (length > 0) ? ((data[0] & 0xFF) & 0x0F) : -1;
int instrument = (length > 1) ? (data[1] & 0xFF) : -1;
if (channel != -1 && instrument != -1) {
this.sequencer.getTransmitter().sendProgramChange(channel, instrument);
}
}
public void send(MidiMessage message, long timeStamp) {
try {
if (this.sequencer.isRunning()) {
parseMessage(message.getMessage());
}
} catch (MidiPlayerException e) {
LOG.error(e);
}
}
}