package org.herac.tuxguitar.gm.port;
import org.herac.tuxguitar.gm.GMChannelRoute;
import org.herac.tuxguitar.gm.GMChannelRouter;
import org.herac.tuxguitar.player.base.MidiChannel;
import org.herac.tuxguitar.player.base.MidiControllers;
import org.herac.tuxguitar.player.base.MidiPlayerException;
public class GMChannel implements MidiChannel{
public static final short PERCUSSION_BANK = 128;
private GMReceiver receiver;
private GMChannelRoute route;
private GMChannelRouter router;
public GMChannel(int channelId, GMChannelRouter router, GMReceiver receiver){
this.receiver = receiver;
this.route = new GMChannelRoute(channelId);
this.router = router;
this.router.configureRoutes(this.route, false);
}
public GMChannelRoute getRoute(){
return this.route;
}
@Override
public void sendAllNotesOff() throws MidiPlayerException {
this.receiver.sendAllNotesOff();
}
@Override
public void sendNoteOn(int key, int velocity, int voice, boolean bendMode) throws MidiPlayerException {
this.receiver.sendNoteOn(resolveChannel(bendMode), key, velocity);
}
@Override
public void sendNoteOff(int key, int velocity, int voice, boolean bendMode) throws MidiPlayerException {
this.receiver.sendNoteOff(resolveChannel(bendMode), key, velocity);
}
@Override
public void sendPitchBend(int value, int voice, boolean bendMode) throws MidiPlayerException {
this.receiver.sendPitchBend(resolveChannel(bendMode), value);
}
@Override
public void sendProgramChange(int value) throws MidiPlayerException {
this.receiver.sendProgramChange(this.route.getChannel1(), value);
if( this.route.getChannel1() != this.route.getChannel2() ){
this.receiver.sendProgramChange(this.route.getChannel2(), value);
}
}
@Override
public void sendControlChange(int controller, int value) throws MidiPlayerException {
if( controller == MidiControllers.BANK_SELECT && value == PERCUSSION_BANK ){
this.router.configureRoutes(this.route, true);
}
this.receiver.sendControlChange(this.route.getChannel1(), controller, value);
if( this.route.getChannel1() != this.route.getChannel2() ){
this.receiver.sendControlChange(this.route.getChannel2(), controller, value);
}
}
@Override
public void sendParameter(String key, String value) throws MidiPlayerException{
if( key.equals(GMChannelRoute.PARAMETER_GM_CHANNEL_1) ){
this.route.setChannel1(Integer.parseInt(value));
this.router.configureRoutes(this.route, false);
}
if( key.equals(GMChannelRoute.PARAMETER_GM_CHANNEL_2) ){
this.route.setChannel2(Integer.parseInt(value));
this.router.configureRoutes(this.route, false);
}
}
private int resolveChannel(boolean bendMode){
return (bendMode ? this.route.getChannel2() : this.route.getChannel1());
}
}