package org.herac.tuxguitar.gui.editors; import org.herac.tuxguitar.gui.TuxGuitar; import org.herac.tuxguitar.gui.editors.tab.Caret; import org.herac.tuxguitar.gui.editors.tab.TGBeatImpl; import org.herac.tuxguitar.gui.editors.tab.TGMeasureImpl; import org.herac.tuxguitar.gui.util.MidiTickUtil; import org.herac.tuxguitar.song.managers.TGSongManager; import org.herac.tuxguitar.song.models.TGBeat; import org.herac.tuxguitar.song.models.TGDuration; import org.herac.tuxguitar.song.models.TGMeasure; import org.herac.tuxguitar.song.models.TGTrack; public class EditorCache { //Modo edition private boolean editUpdate; private TGBeatImpl editBeat; //Modo reproduccion private int playTrack; private long playTick; private long playStart; private long playBeatEnd; private boolean playChanges; private boolean playUpdate; private TGBeatImpl playBeat; private TGMeasureImpl playMeasure; public EditorCache(){ this.reset(); } public void reset(){ this.resetEditMode(); this.resetPlayMode(); } private void resetEditMode(){ this.editBeat = null; this.editUpdate = false; } private void resetPlayMode(){ this.playBeat = null; this.playMeasure = null; this.playUpdate = false; this.playChanges = false; this.playTrack = 0; this.playTick = 0; this.playStart = 0; this.playBeatEnd = 0; } public void updateEditMode(){ this.editUpdate = true; this.resetPlayMode(); this.getEditBeat(); } public void updatePlayMode(){ this.playUpdate = true; this.resetEditMode(); this.getPlayBeat(); } public TGBeatImpl getEditBeat() { if(this.editUpdate){ this.editBeat = TuxGuitar.instance().getTablatureEditor().getTablature().getCaret().getSelectedBeat(); this.editUpdate = false; } return this.editBeat; } public TGBeatImpl getPlayBeat(){ if(this.playUpdate){ this.playChanges = false; TGSongManager manager = TuxGuitar.instance().getSongManager(); if(TuxGuitar.instance().getPlayer().isRunning()){ Caret caret = TuxGuitar.instance().getTablatureEditor().getTablature().getCaret(); TGTrack track = caret.getTrack(); long tick = TuxGuitar.instance().getPlayer().getTickPosition(); long start = this.playStart + (tick - this.playTick); if(this.playMeasure == null || start < this.playMeasure.getStart() || start > (this.playMeasure.getStart() + this.playMeasure.getLength())){ this.playMeasure = null; start = MidiTickUtil.getStart(tick); } if(this.playMeasure == null || this.playBeatEnd == 0 || start > this.playBeatEnd || start < this.playStart || track.getNumber() != this.playTrack){ this.playBeat = null; this.playBeatEnd = 0; this.playChanges = true; if(this.playMeasure == null || !this.playMeasure.hasTrack(track.getNumber()) || !isPlaying(this.playMeasure)){ this.playMeasure = (TGMeasureImpl)manager.getTrackManager().getMeasureAt(track,start); } if (this.playMeasure != null) { this.playBeat = (TGBeatImpl)manager.getMeasureManager().getBeatIn(this.playMeasure, start); if(this.playBeat != null){ TGBeat next = manager.getMeasureManager().getNextBeat(this.playMeasure.getBeats(), this.playBeat); if( next != null ){ this.playBeatEnd = next.getStart(); }else{ TGDuration duration = manager.getMeasureManager().getMinimumDuration(this.playBeat); this.playBeatEnd = (this.playBeat.getStart() + duration.getTime()); } } } } this.playTrack = track.getNumber(); this.playTick = tick; this.playStart = start; } this.playUpdate = false; } return this.playBeat; } public long getPlayTick(){ return this.playTick; } public long getPlayStart(){ return this.playStart; } public TGMeasureImpl getPlayMeasure(){ return this.playMeasure; } public boolean shouldRedraw(){ return this.playChanges; } public boolean isPlaying(TGMeasure measure){ return (TuxGuitar.instance().getPlayer().isRunning() && this.playMeasure != null && measure.equals(this.playMeasure)); } public boolean isPlaying(TGMeasure measure,TGBeat b){ return (isPlaying(measure) && this.playBeat != null && this.playBeat.getStart() == b.getStart()); } }