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.herac.tuxguitar.player.base.MidiPlayerException; public class MidiReceiverImpl implements Receiver{ private MidiSequencerImpl sequencer; public MidiReceiverImpl(MidiSequencerImpl sequencer){ this.sequencer = sequencer; } public void send(MidiMessage message, long timeStamp) { try { parseMessage(message.getMessage()); } catch (MidiPlayerException e) { e.printStackTrace(); } } public void close(){ //not implemented } 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 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 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 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); } } 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 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); } } }