1
package org.herac.tuxguitar.player.impl.sequencer;
3
import org.herac.tuxguitar.player.base.MidiPlayerException;
4
import org.herac.tuxguitar.player.base.MidiPort;
5
import org.herac.tuxguitar.player.base.MidiPortEmpty;
6
import org.herac.tuxguitar.player.base.MidiSequenceHandler;
7
import org.herac.tuxguitar.player.base.MidiSequencer;
9
public class MidiSequencerImpl implements MidiSequencer{
11
private boolean reset;
12
private boolean running;
13
private MidiPort midiPort;
14
private MidiTickPlayer midiTickPlayer;
15
private MidiEventPlayer midiEventPlayer;
16
private MidiEventDispacher midiEventDispacher;
17
private MidiTrackController midiTrackController;
19
public MidiSequencerImpl(){
21
this.midiTickPlayer = new MidiTickPlayer();
22
this.midiEventPlayer = new MidiEventPlayer(this);
23
this.midiEventDispacher = new MidiEventDispacher(this);
24
this.midiTrackController = new MidiTrackController(this);
27
public synchronized MidiTrackController getMidiTrackController(){
28
return this.midiTrackController;
31
public synchronized void setTempo(int tempo){
32
this.midiTickPlayer.setTempo(tempo);
35
public synchronized long getTickPosition(){
36
return this.midiTickPlayer.getTick();
39
public synchronized void setTickPosition(long tickPosition){
41
this.midiTickPlayer.setTick(tickPosition);
44
public synchronized long getTickLength(){
45
return this.midiTickPlayer.getTickLength();
48
public synchronized void sendEvent(MidiEvent event) throws MidiPlayerException{
50
this.midiEventDispacher.dispatch(event);
54
public synchronized void addEvent(MidiEvent event){
55
this.midiEventPlayer.addEvent(event);
56
this.midiTickPlayer.notifyTick(event.getTick());
59
public synchronized boolean isRunning() {
63
public synchronized void setRunning(boolean running) {
64
this.running = running;
67
this.setTickPosition( this.getTickPosition() );
68
new MidiTimer(this).start();
72
public synchronized void stop() throws MidiPlayerException{
73
this.setRunning(false);
76
public synchronized void start() throws MidiPlayerException{
77
this.setRunning(true);
80
public synchronized void reset(boolean systemReset) throws MidiPlayerException{
81
this.getMidiPort().out().sendAllNotesOff();
82
for(int channel = 0; channel < 16;channel ++){
83
this.getMidiPort().out().sendPitchBend(channel, 64);
86
this.getMidiPort().out().sendSystemReset();
90
protected synchronized boolean process() throws MidiPlayerException{
91
boolean running = this.isRunning();
96
this.midiEventPlayer.reset();
98
this.midiTickPlayer.process();
99
this.midiEventPlayer.process();
100
if(this.getTickPosition() > this.getTickLength()){
105
this.midiEventPlayer.clearEvents();
106
this.midiTickPlayer.clearTick();
112
public synchronized MidiPort getMidiPort() {
113
if(this.midiPort == null){
114
this.midiPort = new MidiPortEmpty();
116
return this.midiPort;
119
public synchronized void setMidiPort(MidiPort midiPort) {
120
this.midiPort = midiPort;
123
public synchronized void open() {
127
public synchronized void close() throws MidiPlayerException {
133
public synchronized MidiSequenceHandler createSequence(int tracks){
134
return new MidiSequenceHandlerImpl(this,tracks);
137
public synchronized void setSolo(int index,boolean solo) throws MidiPlayerException{
138
this.getMidiTrackController().setSolo(index, solo);
141
public synchronized void setMute(int index,boolean mute) throws MidiPlayerException{
142
this.getMidiTrackController().setMute(index, mute);
145
public String getKey() {
146
return "tuxguitar.sequencer";
149
public String getName() {
150
return "TuxGuitar Sequencer";
153
private class MidiTimer extends Thread{
155
private static final int TIMER_DELAY = 15;
157
private MidiSequencerImpl sequencer;
159
public MidiTimer(MidiSequencerImpl sequencer){
160
this.sequencer = sequencer;
165
synchronized(this.sequencer) {
166
while( this.sequencer.process() ){
167
this.sequencer.wait( TIMER_DELAY );
170
} catch (Throwable throwable) {
171
throwable.printStackTrace();