package org.herac.tuxguitar.song.managers;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.herac.tuxguitar.song.models.TGChannel;
import org.herac.tuxguitar.song.models.TGColor;
import org.herac.tuxguitar.song.models.TGMeasure;
import org.herac.tuxguitar.song.models.TGMeasureHeader;
import org.herac.tuxguitar.song.models.TGTrack;
public class TGTrackManager {
private TGSongManager songManager;
public TGTrackManager(TGSongManager songManager){
this.songManager = songManager;
}
public TGSongManager getSongManager(){
return this.songManager;
}
public TGMeasure getFirstMeasure(TGTrack track){
TGMeasure firstMeasure = null;
Iterator measures = track.getMeasures();
while(measures.hasNext()){
TGMeasure currMeasure = (TGMeasure)measures.next();
if(firstMeasure == null || (currMeasure.getStart() < firstMeasure.getStart())){
firstMeasure = currMeasure;
}
}
return firstMeasure;
}
public TGMeasure getLastMeasure(TGTrack track){
return track.getMeasure(track.countMeasures() - 1);
}
public TGMeasure getPrevMeasure(TGMeasure measure){
return measure.getTrack().getMeasure(measure.getNumber() - 2);
}
public TGMeasure getNextMeasure(TGMeasure measure){
return measure.getTrack().getMeasure(measure.getNumber());
}
public TGMeasure getMeasureAt(TGTrack track,long start){
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
long measureStart = measure.getStart();
long measureLength = measure.getLength();
if(start >= measureStart && start < measureStart + measureLength){
return measure;
}
}
return null;
}
public TGMeasure getMeasure(TGTrack track,int number){
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
if(measure.getNumber() == number){
return measure;
}
}
return null;
}
/**
* Retorna Todos los desde Start hasta el final del compas
*/
public List getMeasuresBeforeEnd(TGTrack track,long fromStart) {
List measures = new ArrayList();
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure currMeasure = (TGMeasure)it.next();
if (currMeasure.getStart() >= fromStart) {
measures.add(currMeasure);
}
}
return measures;
}
/**
* Retorna Todos los desde Start hasta el final del compas
*/
public List getMeasuresBetween(TGTrack track,long p1,long p2) {
List measures = new ArrayList();
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
if ((measure.getStart() + measure.getLength()) > p1 && measure.getStart() < p2) {
measures.add(measure);
}
}
return measures;
}
public void addNewMeasureBeforeEnd(TGTrack track,TGMeasureHeader header){
addNewMeasureAfter(track,header,getLastMeasure(track));
}
/**
* Agrega un Compas
*/
public void addNewMeasureAfter(TGTrack track,TGMeasureHeader header,TGMeasure measure){
TGMeasure newMeasure = getSongManager().getFactory().newMeasure(header);
newMeasure.setClef(measure.getClef());
newMeasure.setKeySignature(measure.getKeySignature());
addMeasure(track,newMeasure);
}
public void addNewMeasure(TGTrack track,TGMeasureHeader header){
TGMeasure previous = getMeasure(track, (header.getNumber() == 1)?(header.getNumber()+1):header.getNumber()-1);
TGMeasure newMeasure = getSongManager().getFactory().newMeasure(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 addMeasure(TGTrack track,TGMeasure measure){
track.addMeasure(measure);
}
/**
* Agrega un Compas
*/
public void addMeasure(TGTrack track,int index,TGMeasure measure){
track.addMeasure(index,measure);
}
public void removeLastMeasure(TGTrack track){
removeMeasure(getLastMeasure(track));
}
public void removeMeasure(TGTrack track,long start){
removeMeasure(getMeasureAt(track,start));
}
public void removeMeasure(TGMeasure measure){
measure.getTrack().removeMeasure(measure.getNumber() - 1);
}
public TGMeasure replaceMeasure(TGTrack track,TGMeasure newMeasure){
TGMeasure measure = getMeasureAt(track,newMeasure.getStart());
measure.makeEqual(newMeasure);
return measure;
}
/**
* 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){
Iterator it = getMeasuresBeforeEnd(track,start).iterator();
while( it.hasNext() ){
TGMeasure measure = (TGMeasure)it.next();
getSongManager().getMeasureManager().moveOutOfBoundsBeatsToNewMeasure(measure);
}
}
public void moveTrackBeats(TGTrack track, long measureStart, long moveStart, long theMove ){
List 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 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){
List measures = getMeasuresBeforeEnd(track,measure.getStart() + 1);
Iterator it = measures.iterator();
while(it.hasNext()){
TGMeasure nextMeasure = (TGMeasure)it.next();
nextMeasure.setKeySignature(keySignature);
}
}
}
public void changeClef(TGTrack track,long start,int clef,boolean toEnd){
changeClef(track,getMeasureAt(track,start),clef,toEnd);
}
/**
* Cambia el Clef
*/
public void changeClef(TGTrack track,TGMeasure measure,int clef,boolean toEnd){
//asigno el nuevo clef
measure.setClef(clef);
if(toEnd){
List measures = getMeasuresBeforeEnd(track,measure.getStart() + 1);
Iterator it = measures.iterator();
while(it.hasNext()){
TGMeasure nextMeasure = (TGMeasure)it.next();
nextMeasure.setClef(clef);
}
}
}
public void changeInfo(TGTrack track,String name,TGColor color,int offset){
track.setName(name);
track.setOffset(offset);
track.getColor().setR(color.getR());
track.getColor().setG(color.getG());
track.getColor().setB(color.getB());
}
public void changeInstrumentStrings(TGTrack track,List strings){
if(strings.size() < track.getStrings().size()){
removeNotesAfterString(track,strings.size());
}
track.setStrings(strings);
}
public void removeNotesAfterString(TGTrack track,int string){
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
getSongManager().getMeasureManager().removeNotesAfterString(measure,string);
}
}
public void changeInstrument(TGTrack track,int instrument,boolean percussion){
track.getChannel().setInstrument((short)instrument);
if(percussion){
TGChannel.setPercussionChannel(track.getChannel());
track.setStrings(TGSongManager.createPercussionStrings(getSongManager().getFactory(),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 autoCompleteSilences(TGTrack track){
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
this.songManager.getMeasureManager().autoCompleteSilences(measure);
}
}
public void orderBeats(TGTrack track){
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
this.songManager.getMeasureManager().orderBeats(measure);
}
}
public void transposeNotes(TGTrack track, int transposition , boolean tryKeepString, boolean applyToChords, int applyToString){
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
this.songManager.getMeasureManager().transposeNotes(measure, transposition, tryKeepString, applyToChords, applyToString );
}
}
public void transposeNotes(TGTrack track, int[] transpositionStrings , boolean tryKeepString , boolean applyToChords ){
Iterator it = track.getMeasures();
while(it.hasNext()){
TGMeasure measure = (TGMeasure)it.next();
this.songManager.getMeasureManager().transposeNotes(measure, transpositionStrings, tryKeepString , applyToChords);
}
}
/**
* 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());
}
}