package org.herac.tuxguitar.jack.sequencer;
import java.util.ArrayList;
import java.util.List;
import org.herac.tuxguitar.player.base.MidiPlayerException;
import org.herac.tuxguitar.song.models.TGDuration;
public class JackEventController {
private List<JackEvent> events;
private double lastTick;
private boolean reset;
private JackSequencer sequencer;
private double tick;
public JackEventController(JackSequencer sequencer) {
this.sequencer = sequencer;
this.events = new ArrayList<JackEvent>();
this.reset();
}
public void addEvent(JackEvent event) {
this.events.add(event);
}
public void clearEvents() {
this.events.clear();
}
public List<JackEvent> getEvents() {
return this.events;
}
public List<long[]> getTempoChanges() {
List<long[]> tempoChanges = new ArrayList<long[]>();
for (int i = 0; i < this.events.size(); i++) {
JackEvent event = (JackEvent) this.events.get(i);
if (event.getType() == JackEvent.MIDI_SYSTEM_EVENT) {
if (event.getData()[0] == 0x51) {
int usq = ((event.getData()[1] & 0xff)
| ((event.getData()[2] & 0xff) << 8) | ((event.getData()[3] & 0xff) << 16));
long[] tempoChange = new long[2];
tempoChange[0] = event.getTick();
tempoChange[1] = ((long) ((60.00 * 1000.00) / (usq / 1000.00)));
tempoChanges.add(tempoChange);
}
}
}
return tempoChanges;
}
public void process() throws MidiPlayerException {
this.lastTick = this.tick;
this.tick = this.sequencer.getJackTickController().getTick();
for (int i = 0; i < this.events.size(); i++) {
JackEvent event = (JackEvent) 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() - (TGDuration.QUARTER_TIME / 8));
this.reset = true;
}
private boolean shouldSend(JackEvent event, double tick, double lastTick) {
if (event.getTick() > tick) {
return false;
}
if (event.getTrack() != JackEvent.ALL_TRACKS) {
if (this.sequencer.getJackTrackController().isMute(event.getTrack())) {
return false;
}
if (this.sequencer.getJackTrackController().isAnySolo()
&& !this.sequencer.getJackTrackController().isSolo(event.getTrack())) {
return false;
}
}
if (this.reset) {
if (event.getType() == JackEvent.MIDI_SYSTEM_EVENT) {
return true;
}
if (event.getType() == JackEvent.MIDI_EVENT_CONTROL_CHANGE) {
return true;
}
if (event.getType() == JackEvent.MIDI_EVENT_PROGRAM_CHANGE) {
return true;
}
}
return (event.getTick() > lastTick);
}
}