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 MidiSequencerImpl sequencer; private List events; private long tick; private long lastTick; private boolean reset; public MidiEventPlayer(MidiSequencerImpl sequencer){ this.sequencer = sequencer; this.events = new ArrayList(); this.reset(); } 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; } 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); } public void addEvent(MidiEvent event){ this.events.add(event); } public void clearEvents(){ this.events.clear(); } public void reset(){ this.tick = (this.sequencer.getTickPosition() - 1); this.reset = true; } }