/*
* Created on 23-nov-2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.herac.tuxguitar.song.managers;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.herac.tuxguitar.song.factory.TGFactory;
import org.herac.tuxguitar.song.models.TGChannel;
import org.herac.tuxguitar.song.models.TGColor;
import org.herac.tuxguitar.song.models.TGDuration;
import org.herac.tuxguitar.song.models.TGMarker;
import org.herac.tuxguitar.song.models.TGMeasure;
import org.herac.tuxguitar.song.models.TGMeasureHeader;
import org.herac.tuxguitar.song.models.TGSong;
import org.herac.tuxguitar.song.models.TGString;
import org.herac.tuxguitar.song.models.TGTempo;
import org.herac.tuxguitar.song.models.TGTimeSignature;
import org.herac.tuxguitar.song.models.TGTrack;
/**
* @author julian
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TGSongManager {
public static final short MAX_CHANNELS = 16;
private TGFactory factory;
private TGSong song;
private TGTrackManager trackManager;
private TGMeasureManager measureManager;
public TGSongManager(){
this(new TGFactory());
}
public TGSongManager(TGFactory factory){
this.factory = factory;
}
public TGFactory getFactory(){
return this.factory;
}
public void setFactory(TGFactory factory){
this.factory = factory;
}
public TGTrackManager getTrackManager(){
if(this.trackManager == null){
this.trackManager = new TGTrackManager(this);
}
return this.trackManager;
}
public TGMeasureManager getMeasureManager(){
if(this.measureManager == null){
this.measureManager = new TGMeasureManager(this);
}
return this.measureManager;
}
public void setSongName(String name){
getSong().setName(name);
}
public TGSong getSong(){
return this.song;
}
public void clearSong(){
if(getSong() != null){
getSong().clear();
}
}
public void setSong(TGSong song){
if(song != null){
clearSong();
this.song = song;
}
}
public void setProperties(String name,String artist,String album,String author,String date,String copyright,String writer,String transcriber,String comments){
getSong().setName(name);
getSong().setArtist(artist);
getSong().setAlbum(album);
getSong().setAuthor(author);
getSong().setDate(date);
getSong().setCopyright(copyright);
getSong().setWriter(writer);
getSong().setTranscriber(transcriber);
getSong().setComments(comments);
}
public void addTrack(TGTrack trackToAdd){
this.orderTracks();
int addIndex = -1;
for(int i = 0;i < getSong().countTracks();i++){
TGTrack track = getSong().getTrack(i);
if(addIndex == -1 && track.getNumber() == trackToAdd.getNumber()){
addIndex = i;
}
if(addIndex >= 0){
track.setNumber(track.getNumber() + 1);
}
}
if(addIndex < 0){
addIndex = getSong().countTracks();
}
getSong().addTrack(addIndex,trackToAdd);
}
public void removeTrack(int number){
int nextNumber = number;
TGTrack trackToRemove = null;
orderTracks();
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack currTrack = (TGTrack)it.next();
if(trackToRemove == null && currTrack.getNumber() == nextNumber){
trackToRemove = currTrack;
}else if(currTrack.getNumber() == (nextNumber + 1)){
currTrack.setNumber(nextNumber);
nextNumber ++;
}
}
getSong().removeTrack(trackToRemove);
}
private void orderTracks(){
for(int i = 0;i < getSong().countTracks();i++){
TGTrack minTrack = null;
for(int trackIdx = i;trackIdx < getSong().countTracks();trackIdx++){
TGTrack track = getSong().getTrack(trackIdx);
if(minTrack == null || track.getNumber() < minTrack.getNumber()){
minTrack = track;
}
}
getSong().moveTrack(i,minTrack);
}
}
public TGSong newSong(){
TGSong song = getFactory().newSong();
TGMeasureHeader header = getFactory().newHeader();
header.setNumber(1);
header.setStart(TGDuration.QUARTER_TIME);
header.getTimeSignature().setNumerator(4);
header.getTimeSignature().getDenominator().setValue(TGDuration.QUARTER);
song.addMeasureHeader(header);
TGMeasure measure = getFactory().newMeasure(header);
TGTrack track = getFactory().newTrack();
track.setNumber(1);
track.setName("Track 1");
track.addMeasure(measure);
track.getChannel().setChannel((short)0);
track.getChannel().setEffectChannel((short)1);
track.setStrings(createDefaultInstrumentStrings());
TGColor.RED.copy(track.getColor());
song.addTrack(track);
return song;
}
public int getNextTrackNumber(){
return (getSong().countTracks() + 1);
}
public TGChannel getFreeChannel(short instrument,boolean isPercussion){
if(isPercussion){
return TGChannel.newPercussionChannel(getFactory());
}
short normalChannel = -1;
short effectChannel = -1;
boolean[] usedChannels = getUsedChannels();
boolean[] usedEffectChannels = getUsedEffectChannels();
for(short i = 0;i < MAX_CHANNELS;i++){
if(!TGChannel.isPercussionChannel(i) && !usedChannels[i] && !usedEffectChannels[i]){
normalChannel = (normalChannel < 0)?i:normalChannel;
effectChannel = (effectChannel < 0 && i != normalChannel)?i:effectChannel;
}
}
if(normalChannel < 0 || effectChannel < 0){
if(normalChannel >= 0 ){
effectChannel = normalChannel;
}else{
TGChannel songChannel = getLastTrack().getChannel();
return songChannel.clone(getFactory());
}
}
TGChannel channel = getFactory().newChannel();
channel.setChannel(normalChannel);
channel.setEffectChannel(effectChannel);
channel.setInstrument(instrument);
return channel;
}
public boolean[] getUsedEffectChannels(){
boolean[] channels = new boolean[MAX_CHANNELS];
for(int i = 0;i < getSong().countTracks();i++){
TGTrack track = getSong().getTrack(i);
channels[track.getChannel().getEffectChannel()] = true;
}
return channels;
}
public boolean[] getUsedChannels(){
boolean[] channels = new boolean[MAX_CHANNELS];
for(int i = 0;i < getSong().countTracks();i++){
TGTrack track = getSong().getTrack(i);
channels[track.getChannel().getChannel()] = true;
}
return channels;
}
public TGChannel getUsedChannel(int channel){
for(int i = 0;i < getSong().countTracks();i++){
TGTrack track = getSong().getTrack(i);
if(channel == track.getChannel().getChannel()){
return track.getChannel().clone(getFactory());
}
}
return null;
}
public int countTracksForChannel(int channel){
int count = 0;
for(int i = 0;i < getSong().countTracks();i++){
TGTrack track = getSong().getTrack(i);
if(channel == track.getChannel().getChannel()){
count ++;
}
}
return count;
}
public void updateChannel(TGChannel channel){
for(int i = 0;i < getSong().countTracks();i++){
TGTrack track = getSong().getTrack(i);
if(channel.getChannel() == track.getChannel().getChannel()){
track.setChannel(channel.clone(getFactory()));
}
}
}
public TGTrack getTrack(int number){
TGTrack track = null;
for (int i = 0; i < getSong().countTracks(); i++) {
TGTrack currTrack = getSong().getTrack(i);
if(currTrack.getNumber() == number){
track = currTrack;
break;
}
}
return track;
}
public TGTrack getFirstTrack(){
TGTrack track = null;
if(!getSong().isEmpty()){
track = getSong().getTrack(0);
}
return track;
}
public TGTrack getLastTrack(){
TGTrack track = null;
if(!getSong().isEmpty()){
track = getSong().getTrack(getSong().countTracks() - 1);
}
return track;
}
public TGTrack cloneTrack(TGTrack track){
TGTrack clone = track.clone(getFactory(),getSong());
clone.setNumber(getNextTrackNumber());
addTrack(clone);
return clone;
}
public boolean moveTrackUp(TGTrack track){
if(track.getNumber() > 1){
TGTrack prevTrack = getTrack(track.getNumber() - 1);
prevTrack.setNumber(prevTrack.getNumber() + 1);
track.setNumber(track.getNumber() - 1);
orderTracks();
return true;
}
return false;
}
public boolean moveTrackDown(TGTrack track){
if(track.getNumber() < getSong().countTracks()){
TGTrack nextTrack = getTrack(track.getNumber() + 1);
nextTrack.setNumber(nextTrack.getNumber() - 1);
track.setNumber(track.getNumber() + 1);
orderTracks();
return true;
}
return false;
}
private TGTrack makeNewTrack(){
TGTrack track = getFactory().newTrack();
track.setNumber(getNextTrackNumber());
track.setName("Track " + track.getNumber());
//measures
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
TGMeasure measure = getFactory().newMeasure(header);
track.addMeasure(measure);
}
track.setStrings(createDefaultInstrumentStrings());
getFreeChannel(TGChannel.DEFAULT_INSTRUMENT,false).copy(track.getChannel());
TGColor.RED.copy(track.getColor());
return track;
}
public TGTrack createTrack(){
if(getSong().isEmpty()){
setSong(newSong());
return getLastTrack();
}
TGTrack track = makeNewTrack();
addTrack(track);
return track;
}
public void removeTrack(TGTrack track){
removeTrack(track.getNumber());
}
public void changeTimeSignature(long start,TGTimeSignature timeSignature,boolean toEnd){
changeTimeSignature(getMeasureHeaderAt(start),timeSignature,toEnd);
}
public void changeTimeSignature(TGMeasureHeader header,TGTimeSignature timeSignature,boolean toEnd){
//asigno el nuevo ritmo
timeSignature.copy(header.getTimeSignature());
long nextStart = header.getStart() + header.getLength();
List measures = getMeasureHeadersBeforeEnd(header.getStart() + 1);
Iterator it = measures.iterator();
while(it.hasNext()){
TGMeasureHeader nextHeader = (TGMeasureHeader)it.next();
long theMove = nextStart - nextHeader.getStart();
//moveMeasureComponents(nextHeader,theMove);
moveMeasureHeader(nextHeader,theMove,0);
if(toEnd){
timeSignature.copy(nextHeader.getTimeSignature());
}
nextStart = nextHeader.getStart() + nextHeader.getLength();
}
moveOutOfBoundsBeatsToNewMeasure(header.getStart());
}
public void moveOutOfBoundsBeatsToNewMeasure(long start){
Iterator it = getSong().getTracks();
while( it.hasNext() ){
TGTrack track = (TGTrack) it.next();
getTrackManager().moveOutOfBoundsBeatsToNewMeasure(track, start);
}
}
/*
public void changeTimeSignature(TGMeasureHeader header,TGTimeSignature timeSignature,boolean toEnd){
//asigno el nuevo ritmo
timeSignature.copy(header.getTimeSignature());
long nextStart = header.getStart() + header.getLength();
List measures = getMeasureHeadersBeforeEnd(header.getStart() + 1);
Iterator it = measures.iterator();
while(it.hasNext()){
TGMeasureHeader nextHeader = (TGMeasureHeader)it.next();
long theMove = nextStart - nextHeader.getStart();
moveMeasureComponents(nextHeader,theMove);
moveMeasureHeader(nextHeader,theMove,0);
if(toEnd){
timeSignature.copy(nextHeader.getTimeSignature());
}
nextStart = nextHeader.getStart() + nextHeader.getLength();
}
}
*/
public void changeTripletFeel(long start,int tripletFeel,boolean toEnd){
changeTripletFeel(getMeasureHeaderAt(start),tripletFeel,toEnd);
}
public void changeTripletFeel(TGMeasureHeader header,int tripletFeel,boolean toEnd){
//asigno el nuevo tripletFeel
header.setTripletFeel(tripletFeel);
if(toEnd){
List measures = getMeasureHeadersBeforeEnd(header.getStart() + 1);
Iterator it = measures.iterator();
while(it.hasNext()){
TGMeasureHeader nextHeader = (TGMeasureHeader)it.next();
nextHeader.setTripletFeel(tripletFeel);
}
}
}
public void changeTempos(long start,TGTempo tempo,boolean toEnd){
changeTempos(getMeasureHeaderAt(start),tempo,toEnd);
}
public void changeTempos(TGMeasureHeader header,TGTempo tempo,boolean toEnd){
int oldValue = header.getTempo().getValue();
Iterator it = getMeasureHeadersAfter(header.getNumber() - 1).iterator();
while(it.hasNext()){
TGMeasureHeader nextHeader = (TGMeasureHeader)it.next();
if(toEnd || nextHeader.getTempo().getValue() == oldValue){
changeTempo(nextHeader,tempo);
}else{
break;
}
}
}
public void changeTempo(TGMeasureHeader header,TGTempo tempo){
tempo.copy(header.getTempo());
}
public void changeOpenRepeat(long start){
TGMeasureHeader header = getMeasureHeaderAt(start);
header.setRepeatOpen(!header.isRepeatOpen());
}
public void changeCloseRepeat(long start,int repeatClose){
TGMeasureHeader header = getMeasureHeaderAt(start);
header.setRepeatClose(repeatClose);
}
public void changeAlternativeRepeat(long start,int repeatAlternative){
TGMeasureHeader header = getMeasureHeaderAt(start);
header.setRepeatAlternative(repeatAlternative);
}
public TGMeasureHeader addNewMeasureBeforeEnd(){
TGMeasureHeader lastHeader = getLastMeasureHeader();
TGMeasureHeader header = getFactory().newHeader();
header.setNumber((lastHeader.getNumber() + 1));
header.setStart((lastHeader.getStart() + lastHeader.getLength()));
header.setRepeatOpen(false);
header.setRepeatClose(0);
header.setTripletFeel(lastHeader.getTripletFeel());
lastHeader.getTimeSignature().copy(header.getTimeSignature());
lastHeader.getTempo().copy(header.getTempo());
getSong().addMeasureHeader(header);
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
getTrackManager().addNewMeasureBeforeEnd(track,header);
}
return header;
}
public void addNewMeasure(int number){
//Obtengo un clon para el nuevo Header.
TGMeasureHeader header = null;
if(number == 1){
header = getMeasureHeader(number).clone(getFactory());
}else{
header = getMeasureHeader((number - 1)).clone(getFactory());
header.setStart(header.getStart() + header.getLength());
header.setNumber(header.getNumber() + 1);
}
header.setMarker(null);
header.setRepeatOpen(false);
header.setRepeatAlternative(0);
header.setRepeatClose(0);
//Si hay Headers siguientes los muevo
TGMeasureHeader nextHeader = getMeasureHeader(number);
if(nextHeader != null){
moveMeasureHeaders(getMeasureHeadersBeforeEnd(nextHeader.getStart()),header.getLength(),1,true);
}
//Agrego el header a la lista
addMeasureHeader( (header.getNumber() - 1) ,header);
//Agrego los compases en todas las pistas
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
getTrackManager().addNewMeasure(track,header);
}
}
public List getMeasures(long start){
List measures = new ArrayList();
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
TGMeasure measure = getTrackManager().getMeasureAt(track,start);
if(measure != null){
measures.add(measure);
}
}
return measures;
}
public TGTrack replaceTrack(TGTrack track){
TGTrack current = getTrack(track.getNumber());
if(current != null){
track.copy(getFactory(), getSong(), current);
}
return current;
}
/*
public TGSongSegment copyMeasures(int m1, int m2){
TGSongSegment segment = new TGSongSegment();
int number1 = Math.max(1,m1);
int number2 = Math.min(getSong().countMeasureHeaders(),m2);
for(int number = number1; number <= number2;number ++){
segment.getHeaders().add( getMeasureHeader(number) );
}
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
List measures = getTrackManager().copyMeasures(track,number1,number2);
segment.addTrack(track.getNumber(),measures);
}
return segment.clone(getFactory());
}
public TGSongSegment copyMeasures(int m1, int m2,TGTrack track){
TGSongSegment segment = new TGSongSegment();
int number1 = Math.max(1,m1);
int number2 = Math.min(getSong().countMeasureHeaders(),m2);
for(int number = number1; number <= number2;number ++){
segment.getHeaders().add( getMeasureHeader(number) );
}
List measures = getTrackManager().copyMeasures(track,number1,number2);
segment.addTrack(track.getNumber(),measures);
return segment.clone(getFactory());
}
public void insertMeasures(TGSongSegment segment,int fromNumber,long move){
List headers = new ArrayList();
moveMeasureHeaders(segment.getHeaders(),move,0,false);
int headerNumber = fromNumber;
Iterator it = segment.getHeaders().iterator();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
header.setNumber(headerNumber);
headers.add(header);
headerNumber ++;
}
long start = ((TGMeasureHeader)headers.get(0)).getStart();
long end = ((TGMeasureHeader)headers.get(headers.size() - 1)).getStart() + ((TGMeasureHeader)headers.get(headers.size() - 1)).getLength();
List headersBeforeEnd = getMeasureHeadersBeforeEnd(start);
moveMeasureHeaders(headersBeforeEnd,end - start,headers.size(),true);
it = segment.getHeaders().iterator();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
addMeasureHeader(header.getNumber() - 1,header);
}
it = getSong().getTracks();
while (it.hasNext()) {
TGTrack currTrack = (TGTrack) it.next();
List measures = null;
Iterator tracks = segment.getTracks().iterator();
while(tracks.hasNext()){
TGTrackSegment tSegment = (TGTrackSegment)tracks.next();
if(tSegment.getTrack() == currTrack.getNumber()){
measures = tSegment.getMeasures();
break;
}
}
if(measures == null){
measures = getEmptyMeasures(((TGTrackSegment)segment.getTracks().get(0)).getMeasures());
}
for(int i = 0;i < measures.size();i++){
TGMeasure measure = (TGMeasure)measures.get(i);
measure.setHeader((TGMeasureHeader)headers.get(i));
getMeasureManager().moveAllComponents(measure,move);
}
getTrackManager().insertMeasures(currTrack,measures);
}
}
private List getEmptyMeasures(List measures) {
List emptyMeasures = new ArrayList();
Iterator it = measures.iterator();
while (it.hasNext()) {
TGMeasure measure = (TGMeasure) it.next();
TGMeasure emptyMeasure = getFactory().newMeasure(null);
emptyMeasure.setClef(measure.getClef());
emptyMeasure.setKeySignature(measure.getKeySignature());
emptyMeasures.add(emptyMeasure);
}
return emptyMeasures;
}
*/
/*
public void replaceMeasures(TGSongSegment tracksMeasures,long move) {
List measureHeaders = new ArrayList();
moveMeasureHeaders(tracksMeasures.getHeaders(),move,0,false);
Iterator it = tracksMeasures.getHeaders().iterator();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
TGMeasureHeader replace = replaceMeasureHeader(header);
Iterator nextHeaders = getMeasureHeadersAfter(replace.getNumber()).iterator();
long nextStart = (replace.getStart() + replace.getLength());
while(nextHeaders.hasNext()){
TGMeasureHeader next = (TGMeasureHeader)nextHeaders.next();
moveMeasureComponents(next, (nextStart - next.getStart() ));
moveMeasureHeader(next, (nextStart - next.getStart() ) , 0);
nextStart = (next.getStart() + next.getLength());
}
measureHeaders.add(replace);
}
it = tracksMeasures.getTracks().iterator();
while(it.hasNext()){
TGTrackSegment trackMeasure = (TGTrackSegment)it.next();
TGTrack currTrack = getTrack(trackMeasure.getTrack());
List measures = trackMeasure.getMeasures();
for(int i = 0;i < measures.size();i++){
TGMeasure measure = (TGMeasure)measures.get(i);
measure.setHeader((TGMeasureHeader)measureHeaders.get(i));
getMeasureManager().moveAllComponents(measure,move);
getTrackManager().replaceMeasure(currTrack,measure);
}
}
}
*/
public TGMeasureHeader getFirstMeasureHeader(){
TGMeasureHeader firstHeader = null;
for(int i = 0;i < getSong().countMeasureHeaders();i++){
TGMeasureHeader currHeader = getSong().getMeasureHeader(i);
if(firstHeader == null || (currHeader.getStart() < firstHeader.getStart())){
firstHeader = currHeader;
}
}
return firstHeader;
}
public TGMeasureHeader getLastMeasureHeader(){
int lastIndex = getSong().countMeasureHeaders() - 1;
return getSong().getMeasureHeader(lastIndex);
}
public TGMeasureHeader getPrevMeasureHeader(TGMeasureHeader header){
int prevIndex = header.getNumber() - 1;
if(prevIndex > 0){
return getSong().getMeasureHeader(prevIndex - 1);
}
return null;
}
public TGMeasureHeader getNextMeasureHeader(TGMeasureHeader header){
int nextIndex = header.getNumber();
if(nextIndex < getSong().countMeasureHeaders()){
return getSong().getMeasureHeader(nextIndex);
}
return null;
}
public TGMeasureHeader getMeasureHeaderAt(long start){
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
long measureStart = header.getStart();
long measureLength = header.getLength();
if(start >= measureStart && start < measureStart + measureLength){
return header;
}
}
return null;
}
public TGMeasureHeader getMeasureHeader(int number){
for (int i = 0; i < getSong().countMeasureHeaders(); i++) {
TGMeasureHeader header = getSong().getMeasureHeader(i);
if(header.getNumber() == number){
return header;
}
}
return null;
}
/**
* Retorna Todos los desde Start hasta el final del compas
*/
public List getMeasureHeadersBeforeEnd(long fromStart) {
List headers = new ArrayList();
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if (header.getStart() >= fromStart) {
headers.add(header);
}
}
return headers;
}
/**
* Retorna Todos los desde Start hasta el final del compas
*/
public List getMeasureHeadersAfter(int number) {
List headers = new ArrayList();
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if (header.getNumber() > number) {
headers.add(header);
}
}
return headers;
}
/**
* Retorna Todos los desde Start hasta el final del compas
*/
public List getMeasureHeadersBetween(long p1,long p2) {
List headers = new ArrayList();
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if ((header.getStart() + header.getLength()) > p1 && header.getStart() < p2) {
headers.add(header);
}
}
return headers;
}
public void removeLastMeasure(){
removeLastMeasureHeader();
}
public void removeMeasure(long start){
removeMeasureHeader(start);
}
public void removeMeasure(int number){
removeMeasureHeader(number);
}
/**
* Agrega un Compas
*/
public void addMeasureHeader(TGMeasureHeader measure){
getSong().addMeasureHeader(measure);
}
/**
* Agrega un Compas
*/
public void addMeasureHeader(int index,TGMeasureHeader measure){
getSong().addMeasureHeader(index,measure);
}
public void removeMeasureHeaders(int n1,int n2){
for(int i = n1; i <= n2; i ++){
TGMeasureHeader measure = getMeasureHeader(n1);
removeMeasureHeader(measure);
}
/*
Iterator it = getMeasureHeadersBetween(p1,p2).iterator();
while(it.hasNext()){
TGMeasureHeader measure = (TGMeasureHeader)it.next();
removeMeasureHeader(measure);
} */
}
public void removeLastMeasureHeader(){
removeMeasureHeader(getLastMeasureHeader());
}
public void removeMeasureHeader(long start){
removeMeasureHeader(getMeasureHeaderAt(start));
}
public void removeMeasureHeader(int number){
removeMeasureHeader(getMeasureHeader(number));
}
public void removeMeasureHeader(TGMeasureHeader header){
long start = header.getStart();
long length = header.getLength();
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
getTrackManager().removeMeasure(track,start);
}
moveMeasureHeaders(getMeasureHeadersBeforeEnd(start + 1),-length,-1,true);
getSong().removeMeasureHeader(header.getNumber() - 1);
}
public TGMeasureHeader replaceMeasureHeader(TGMeasureHeader newMeasure){
TGMeasureHeader header = getMeasureHeaderAt(newMeasure.getStart());
header.makeEqual(newMeasure.clone(getFactory()));
return header;
}
public void moveMeasureHeaders(List headers,long theMove,int numberMove,boolean moveComponents) {
if(moveComponents){
Iterator it = headers.iterator();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader) it.next();
moveMeasureComponents(header,theMove);
}
}
Iterator it = headers.iterator();
while (it.hasNext()) {
TGMeasureHeader header = (TGMeasureHeader) it.next();
moveMeasureHeader(header,theMove,numberMove);
}
}
/**
* Mueve el compas
*/
public void moveMeasureHeader(TGMeasureHeader header,long theMove,int numberMove){
header.setNumber(header.getNumber() + numberMove);
header.setStart(header.getStart() + theMove);
}
/**
* Mueve el compas
*/
public void moveMeasureComponents(TGMeasureHeader header,long theMove){
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
getTrackManager().moveMeasure(getTrackManager().getMeasure(track,header.getNumber()),theMove);
}
}
/**
* Retorna true si el start esta en el rango del compas
*/
public boolean isAtPosition(TGMeasureHeader header,long start){
return (start >= header.getStart() && start < header.getStart() + header.getLength());
}
public TGMarker updateMarker(int measure,String title,TGColor color){
TGMeasureHeader header = getMeasureHeader(measure);
if(header != null){
if(!header.hasMarker()){
header.setMarker(getFactory().newMarker());
}
header.getMarker().setMeasure(measure);
header.getMarker().setTitle(title);
header.getMarker().getColor().setR(color.getR());
header.getMarker().getColor().setG(color.getG());
header.getMarker().getColor().setB(color.getB());
return header.getMarker();
}
return null;
}
public TGMarker updateMarker(TGMarker marker){
return updateMarker(marker.getMeasure(),marker.getTitle(),marker.getColor());
}
public void removeMarker(TGMarker marker){
if(marker != null){
removeMarker(marker.getMeasure());
}
}
public void removeMarker(int number){
TGMeasureHeader header = getMeasureHeader(number);
if(header != null && header.hasMarker()){
header.setMarker(null);
}
}
public void removeAllMarkers(){
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if(header.hasMarker()){
header.setMarker(null);
}
}
}
public List getMarkers(){
List markers = new ArrayList();
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if(header.hasMarker()){
markers.add(header.getMarker());
}
}
return markers;
}
public TGMarker getMarker(int number){
TGMeasureHeader header = getMeasureHeader(number);
if(header != null && header.hasMarker()){
return header.getMarker();
}
return null;
}
public TGMarker getPreviousMarker(int from){
TGMeasureHeader previous = null;
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if(header.hasMarker() && header.getNumber() < from){
if(previous == null || previous.getNumber() < header.getNumber()){
previous = header;
}
}
}
return (previous != null)?previous.getMarker():null;
}
public TGMarker getNextMarker(int from){
TGMeasureHeader next = null;
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if(header.hasMarker() && header.getNumber() > from){
if(next == null || next.getNumber() > header.getNumber()){
next = header;
}
}
}
return (next != null)?next.getMarker():null;
}
public TGMarker getFirstMarker(){
TGMeasureHeader first = null;
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if(header.hasMarker()){
if(first == null || header.getNumber() < first.getNumber()){
first = header;
}
}
}
return (first != null)?first.getMarker():null;
}
public TGMarker getLastMarker(){
TGMeasureHeader next = null;
Iterator it = getSong().getMeasureHeaders();
while(it.hasNext()){
TGMeasureHeader header = (TGMeasureHeader)it.next();
if(header.hasMarker()){
if(next == null || header.getNumber() > next.getNumber()){
next = header;
}
}
}
return (next != null)?next.getMarker():null;
}
public void autoCompleteSilences(){
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
getTrackManager().autoCompleteSilences(track);
}
}
public void orderBeats(){
Iterator it = getSong().getTracks();
while(it.hasNext()){
TGTrack track = (TGTrack)it.next();
getTrackManager().orderBeats(track);
}
}
public List createDefaultInstrumentStrings(){
List strings = new ArrayList();
strings.add(newString(getFactory(),1, 64));
strings.add(newString(getFactory(),2, 59));
strings.add(newString(getFactory(),3, 55));
strings.add(newString(getFactory(),4, 50));
strings.add(newString(getFactory(),5, 45));
strings.add(newString(getFactory(),6, 40));
return strings;
}
public static List createPercussionStrings(TGFactory factory,int stringCount){
List strings = new ArrayList();
for(int i = 1;i <= stringCount; i++){
strings.add(newString(factory,i, 0));
}
return strings;
}
public static TGString newString(TGFactory factory,int number,int value){
TGString string = factory.newString();
string.setNumber(number);
string.setValue(value);
return string;
}
public static long getDivisionLength(TGMeasureHeader header){
long defaultLenght = TGDuration.QUARTER_TIME;
int denominator = header.getTimeSignature().getDenominator().getValue();
switch(denominator){
case TGDuration.EIGHTH:
if(header.getTimeSignature().getNumerator() % 3 == 0){
defaultLenght += TGDuration.QUARTER_TIME / 2;
}
break;
}
return defaultLenght;
}
}