package org.herac.tuxguitar.song.managers;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import org.herac.tuxguitar.gui.editors.tab.TGMeasureImpl;
import org.herac.tuxguitar.song.models.Clef;
import org.herac.tuxguitar.song.models.TGChannel;
import org.herac.tuxguitar.song.models.TGMeasure;
import org.herac.tuxguitar.song.models.TGMeasureHeader;
import org.herac.tuxguitar.song.models.TGString;
import org.herac.tuxguitar.song.models.TGTrack;
public class TGTrackManager {
private TGSongManager songManager;
public TGTrackManager(TGSongManager songManager) {
this.songManager = songManager;
}
/**
* Agrega un Compas
*/
public void addMeasure(TGTrack track, int index, TGMeasure measure) {
track.addMeasure(index, measure);
}
/**
* Agrega un Compas
*/
public void addMeasure(TGTrack track, TGMeasure measure) {
track.addMeasure(measure);
}
public void addNewMeasure(TGTrack track, TGMeasureHeader header) {
TGMeasure previous = getMeasure(track, (header.getNumber() == 1) ? (header
.getNumber() + 1) : header.getNumber() - 1);
TGMeasure newMeasure = new TGMeasureImpl(header);
newMeasure.setTrack(track);
newMeasure.setClef(previous.getClef());
newMeasure.setKeySignature(previous.getKeySignature());
addMeasure(track, header.getNumber() - 1, newMeasure);
}
/*
* public List copyMeasures(TGTrack track,int m1,int m2){ List measures = new
* ArrayList(); int number1 = Math.max(1,m1); int number2 =
* Math.min(track.countMeasures(),m2); for(int number = number1; number <=
* number2;number ++){ measures.add(getMeasure(track, number)); } return
* measures; }
*/
/**
* Agrega un Compas
*/
/*
* public void insertMeasures(TGTrack track,List measures){
* if(!measures.isEmpty()){ Iterator it = measures.iterator();
* while(it.hasNext()){ TGMeasure measure = (TGMeasure)it.next();
* addMeasure(track,(measure.getNumber() - 1),measure); } } }
*/
/**
* Agrega un Compas
*/
public void addNewMeasureAfter(TGTrack track, TGMeasureHeader header,
TGMeasure measure) {
TGMeasure newMeasure = new TGMeasureImpl(header);
newMeasure.setClef(measure.getClef());
newMeasure.setKeySignature(measure.getKeySignature());
addMeasure(track, newMeasure);
}
public void addNewMeasureBeforeEnd(TGTrack track, TGMeasureHeader header) {
addNewMeasureAfter(track, header, getLastMeasure(track));
}
public void autoCompleteSilences(TGTrack track) {
for (final TGMeasure measure : track.getMeasures()) {
this.songManager.getMeasureManager().autoCompleteSilences(measure);
}
}
public void changeClef(TGTrack track, long start, Clef clef, boolean toEnd) {
changeClef(track, getMeasureAt(track, start), clef, toEnd);
}
/**
* Cambia el Clef
*/
public void changeClef(TGTrack track, TGMeasure measure, Clef clef,
boolean toEnd) {
// asigno el nuevo clef
measure.setClef(clef);
if (toEnd) {
for (final TGMeasure nextMeasure : getMeasuresBeforeEnd(track, measure
.getStart() + 1)) {
nextMeasure.setClef(clef);
}
}
}
public void changeInfo(TGTrack track, String name, Color color, int offset) {
track.setName(name);
track.setOffset(offset);
track.setColor(color);
}
public void changeInstrument(TGTrack track, int instrument, boolean percussion) {
track.getChannel().setInstrument((short) instrument);
if (percussion) {
TGChannel.setPercussionChannel(track.getChannel());
track.setStrings(TGSongManager.createPercussionStrings(track.getStrings()
.size()));
} else {
if (track.getChannel().isPercussionChannel()) {
TGChannel tempChannel = this.songManager.getFreeChannel(
(short) instrument, false);
track.getChannel().setChannel(tempChannel.getChannel());
track.getChannel().setEffectChannel(tempChannel.getEffectChannel());
}
}
this.songManager.updateChannel(track.getChannel());
}
public void changeInstrumentStrings(TGTrack track, List<TGString> strings) {
if (strings.size() < track.getStrings().size()) {
removeNotesAfterString(track, strings.size());
}
track.setStrings(strings);
}
public void changeKeySignature(TGTrack track, long start, int keySignature,
boolean toEnd) {
changeKeySignature(track, getMeasureAt(track, start), keySignature, toEnd);
}
/**
* Cambia el Key Signature
*/
public void changeKeySignature(TGTrack track, TGMeasure measure,
int keySignature, boolean toEnd) {
// asigno el nuevo Key
measure.setKeySignature(keySignature);
if (toEnd) {
for (final TGMeasure nextMeasure : getMeasuresBeforeEnd(track, measure
.getStart() + 1)) {
nextMeasure.setKeySignature(keySignature);
}
}
}
public void changeMute(TGTrack track, boolean mute) {
track.setMute(mute);
track.setSolo(track.isMute() ? false : track.isSolo());
}
public void changeSolo(TGTrack track, boolean solo) {
track.setSolo(solo);
track.setMute(track.isSolo() ? false : track.isMute());
}
public TGMeasure getFirstMeasure(TGTrack track) {
TGMeasure firstMeasure = null;
for (final TGMeasure currMeasure : track.getMeasures()) {
if (firstMeasure == null
|| (currMeasure.getStart() < firstMeasure.getStart())) {
firstMeasure = currMeasure;
}
}
return firstMeasure;
}
public TGMeasure getLastMeasure(TGTrack track) {
return track.getMeasure(track.countMeasures() - 1);
}
public TGMeasure getMeasure(TGTrack track, int number) {
for (final TGMeasure measure : track.getMeasures()) {
if (measure.getNumber() == number) {
return measure;
}
}
return null;
}
public TGMeasure getMeasureAt(TGTrack track, long start) {
for (final TGMeasure measure : track.getMeasures()) {
long measureStart = measure.getStart();
long measureLength = measure.getLength();
if (start >= measureStart && start < measureStart + measureLength) {
return measure;
}
}
return null;
}
/**
* Retorna Todos los desde Start hasta el final del compas
*/
public List<TGMeasure> getMeasuresBeforeEnd(TGTrack track, long fromStart) {
List<TGMeasure> measures = new ArrayList<TGMeasure>();
for (final TGMeasure currMeasure : track.getMeasures()) {
if (currMeasure.getStart() >= fromStart) {
measures.add(currMeasure);
}
}
return measures;
}
/**
* Retorna Todos los desde Start hasta el final del compas
*/
public List<TGMeasure> getMeasuresBetween(TGTrack track, long p1, long p2) {
List<TGMeasure> measures = new ArrayList<TGMeasure>();
for (final TGMeasure measure : track.getMeasures()) {
if ((measure.getStart() + measure.getLength()) > p1
&& measure.getStart() < p2) {
measures.add(measure);
}
}
return measures;
}
public TGMeasure getNextMeasure(TGMeasure measure) {
return measure.getTrack().getMeasure(measure.getNumber());
}
public TGMeasure getPrevMeasure(TGMeasure measure) {
return measure.getTrack().getMeasure(measure.getNumber() - 2);
}
public TGSongManager getSongManager() {
return this.songManager;
}
/**
* Retorna true si es el primer compas
*/
public boolean isFirstMeasure(TGMeasure measure) {
return (measure.getNumber() == 1);
}
/**
* Retorna true si es el ultimo compas
*/
public boolean isLastMeasure(TGMeasure measure) {
return (getSongManager().getSong().countMeasureHeaders() == measure
.getNumber());
}
/**
* Mueve el compas
*/
public void moveMeasure(TGMeasure measure, long theMove) {
// getSongManager().getMeasureManager().moveAllComponents(measure,theMove);
getSongManager().getMeasureManager().moveAllBeats(measure, theMove);
}
public void moveOutOfBoundsBeatsToNewMeasure(TGTrack track, long start) {
for (final TGMeasure measure : getMeasuresBeforeEnd(track, start)) {
getSongManager().getMeasureManager().moveOutOfBoundsBeatsToNewMeasure(
measure);
}
}
public void moveTrackBeats(TGTrack track, long measureStart, long moveStart,
long theMove) {
List<TGMeasure> measures = getMeasuresBeforeEnd(track, measureStart);
for (int i = 0; i < measures.size(); i++) {
TGMeasure measure = (TGMeasure) measures.get(i);
if (moveStart + theMove < moveStart) {
getSongManager().getMeasureManager().removeBeatsBeetween(measure,
moveStart, (moveStart + Math.abs(theMove)));
}
getSongManager().getMeasureManager().moveBeats(measure, moveStart,
theMove);
}
for (int i = 0; i < measures.size(); i++) {
TGMeasure measure = (TGMeasure) measures.get(i);
getSongManager().getMeasureManager().moveOutOfBoundsBeatsToNewMeasure(
measure, false);
}
}
public void orderBeats(TGTrack track) {
for (final TGMeasure measure : track.getMeasures()) {
this.songManager.getMeasureManager().orderBeats(measure);
}
}
public void removeLastMeasure(TGTrack track) {
removeMeasure(getLastMeasure(track));
}
public void removeMeasure(TGMeasure measure) {
measure.getTrack().removeMeasure(measure.getNumber() - 1);
}
public void removeMeasure(TGTrack track, long start) {
removeMeasure(getMeasureAt(track, start));
}
public void removeNotesAfterString(TGTrack track, int string) {
for (final TGMeasure measure : track.getMeasures()) {
getSongManager().getMeasureManager().removeNotesAfterString(measure,
string);
}
}
public TGMeasure replaceMeasure(TGTrack track, TGMeasure newMeasure) {
TGMeasure measure = getMeasureAt(track, newMeasure.getStart());
measure.makeEqual(newMeasure);
return measure;
}
public void transposeNotes(TGTrack track, int transposition,
boolean tryKeepString, boolean applyToChords, int applyToString) {
for (final TGMeasure measure : track.getMeasures()) {
this.songManager.getMeasureManager().transposeNotes(measure,
transposition, tryKeepString, applyToChords, applyToString);
}
}
public void transposeNotes(TGTrack track, int[] transpositionStrings,
boolean tryKeepString, boolean applyToChords) {
for (final TGMeasure measure : track.getMeasures()) {
this.songManager.getMeasureManager().transposeNotes(measure,
transpositionStrings, tryKeepString, applyToChords);
}
}
}