package org.herac.tuxguitar.player.impl.jsa.sequencer; import javax.sound.midi.Sequence; import javax.sound.midi.Sequencer; import javax.sound.midi.Track; import javax.sound.midi.Transmitter; import org.herac.tuxguitar.player.base.MidiSequenceHandler; import org.herac.tuxguitar.player.base.MidiSequencer; import org.herac.tuxguitar.player.base.MidiTransmitter; public class MidiSequencerImpl implements MidiSequencer,MidiSequenceLoader{ private static final int TICK_MOVE = 1; private Sequencer sequencer; private Transmitter sequencerTransmitter; private MidiTransmitter transmitter; public MidiSequencerImpl(Sequencer sequencer){ this.sequencer = sequencer; } public synchronized void open() { try { if(!this.sequencer.isOpen()){ this.sequencer.open(); this.closeTransmitter(); this.openTransmitter(); } } catch (Throwable throwable) { throwable.printStackTrace(); } } public synchronized void close() { try { if(this.sequencer.isOpen()){ this.sequencer.close(); this.closeTransmitter(); } } catch (Throwable throwable) { throwable.printStackTrace(); } } public void openTransmitter(){ try { this.sequencerTransmitter = getSequencer().getTransmitter(); this.sequencerTransmitter.setReceiver( new MidiReceiverImpl(this) ); } catch (Throwable throwable) { throwable.printStackTrace(); } } public void closeTransmitter(){ try { if(this.sequencerTransmitter != null){ this.sequencerTransmitter.close(); this.sequencerTransmitter = null; } } catch (Throwable throwable) { throwable.printStackTrace(); } } protected Sequencer getSequencer() { this.open(); return this.sequencer; } public MidiSequenceHandler createSequence(int tracks) { this.resetTracks(); return new MidiSequenceHandlerImpl(this,tracks); } public synchronized MidiTransmitter getTransmitter() { return this.transmitter; } public synchronized void setTransmitter(MidiTransmitter transmitter) { this.transmitter = transmitter; } public long getTickLength() { try { return getSequencer().getTickLength(); } catch (Throwable throwable) { throwable.printStackTrace(); } return 0; } public long getTickPosition() { try { return (getSequencer().getTickPosition() + TICK_MOVE); } catch (Throwable throwable) { throwable.printStackTrace(); } return 0; } public void setTickPosition(long tickPosition) { try { this.getSequencer().setTickPosition(tickPosition - TICK_MOVE); this.reset( false ); } catch (Throwable throwable) { throwable.printStackTrace(); } } public boolean isRunning() { try { return getSequencer().isRunning(); } catch (Throwable throwable) { throwable.printStackTrace(); } return false; } public void setMute(int index, boolean mute) { try { getSequencer().setTrackMute(index, mute); } catch (Throwable throwable) { throwable.printStackTrace(); } } public void setSolo(int index, boolean solo) { try { getSequencer().setTrackSolo(index, solo); } catch (Throwable throwable) { throwable.printStackTrace(); } } public void setSequence(Sequence sequence){ try { getSequencer().setSequence(sequence); } catch (Throwable throwable) { throwable.printStackTrace(); } } public void start() { try { getSequencer().start(); } catch (Throwable throwable) { throwable.printStackTrace(); } } public void stop() { try { this.getSequencer().stop(); this.reset( true ); } catch (Throwable throwable) { throwable.printStackTrace(); } } public void reset(boolean systemReset){ try { this.getTransmitter().sendAllNotesOff(); for(int channel = 0; channel < 16;channel ++){ this.getTransmitter().sendPitchBend(channel, 64); } if( systemReset ){ this.getTransmitter().sendSystemReset(); } } catch (Throwable throwable) { throwable.printStackTrace(); } } public void resetTracks(){ try { Sequence sequence = this.getSequencer().getSequence(); if(sequence != null){ Track[] tracks = sequence.getTracks(); if( tracks != null ){ int count = tracks.length; for( int i = 0 ; i < count; i++ ){ this.setSolo( i , false ); this.setMute( i , false ); } } } } catch (Throwable throwable) { throwable.printStackTrace(); } } public String getKey() { return this.sequencer.getDeviceInfo().getName(); } public String getName() { return this.sequencer.getDeviceInfo().getName(); } }