package org.herac.tuxguitar.player.impl.sequencer;
import java.util.ArrayList;
import java.util.List;
import org.herac.tuxguitar.player.base.MidiPlayerException;
public class MidiEventPlayer {
private List<MidiEvent> events;
private long lastTick;
private boolean reset;
private MidiSequencerImpl sequencer;
private long tick;
public MidiEventPlayer(MidiSequencerImpl sequencer) {
this.sequencer = sequencer;
this.events = new ArrayList<MidiEvent>();
this.reset();
}
public void addEvent(MidiEvent event) {
this.events.add(event);
}
public void clearEvents() {
this.events.clear();
}
public void process() throws MidiPlayerException {
this.lastTick = this.tick;
this.tick = this.sequencer.getTickPosition();
for (int i = 0; i < this.events.size(); i++) {
MidiEvent event = (MidiEvent) this.events.get(i);
if (shouldSend(event, this.tick, this.lastTick)) {
this.sequencer.sendEvent(event);
}
}
this.reset = false;
}
public void reset() {
this.tick = (this.sequencer.getTickPosition() - 1);
this.reset = true;
}
private boolean shouldSend(MidiEvent event, long tick, long lastTick) {
if (event.getTick() > tick) {
return false;
}
if (event.getTrack() != MidiEvent.ALL_TRACKS) {
if (this.sequencer.getMidiTrackController().isMute(event.getTrack())) {
return false;
}
if (this.sequencer.getMidiTrackController().isAnySolo()
&& !this.sequencer.getMidiTrackController().isSolo(event.getTrack())) {
return false;
}
}
if (this.reset) {
if (event.getType() == MidiEvent.MIDI_SYSTEM_EVENT) {
return true;
}
if (event.getType() == MidiEvent.MIDI_EVENT_CONTROL_CHANGE) {
return true;
}
if (event.getType() == MidiEvent.MIDI_EVENT_PROGRAM_CHANGE) {
return true;
}
}
return (event.getTick() > lastTick);
}
}