1 package org.herac.tuxguitar.song.managers; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 import org.herac.tuxguitar.song.models.TGChannel; 8 import org.herac.tuxguitar.song.models.TGColor; 9 import org.herac.tuxguitar.song.models.TGMeasure; 10 import org.herac.tuxguitar.song.models.TGMeasureHeader; 11 import org.herac.tuxguitar.song.models.TGTrack; 12 13 public class TGTrackManager { 14 private TGSongManager songManager; 15 TGTrackManager(TGSongManager songManager)16 public TGTrackManager(TGSongManager songManager){ 17 this.songManager = songManager; 18 } 19 getSongManager()20 public TGSongManager getSongManager(){ 21 return this.songManager; 22 } 23 getFirstMeasure(TGTrack track)24 public TGMeasure getFirstMeasure(TGTrack track){ 25 TGMeasure firstMeasure = null; 26 Iterator measures = track.getMeasures(); 27 while(measures.hasNext()){ 28 TGMeasure currMeasure = (TGMeasure)measures.next(); 29 if(firstMeasure == null || (currMeasure.getStart() < firstMeasure.getStart())){ 30 firstMeasure = currMeasure; 31 } 32 } 33 return firstMeasure; 34 } 35 getLastMeasure(TGTrack track)36 public TGMeasure getLastMeasure(TGTrack track){ 37 return track.getMeasure(track.countMeasures() - 1); 38 } 39 getPrevMeasure(TGMeasure measure)40 public TGMeasure getPrevMeasure(TGMeasure measure){ 41 return measure.getTrack().getMeasure(measure.getNumber() - 2); 42 } 43 getNextMeasure(TGMeasure measure)44 public TGMeasure getNextMeasure(TGMeasure measure){ 45 return measure.getTrack().getMeasure(measure.getNumber()); 46 } 47 getMeasureAt(TGTrack track,long start)48 public TGMeasure getMeasureAt(TGTrack track,long start){ 49 Iterator it = track.getMeasures(); 50 while(it.hasNext()){ 51 TGMeasure measure = (TGMeasure)it.next(); 52 long measureStart = measure.getStart(); 53 long measureLength = measure.getLength(); 54 if(start >= measureStart && start < measureStart + measureLength){ 55 return measure; 56 } 57 } 58 return null; 59 } 60 getMeasure(TGTrack track,int number)61 public TGMeasure getMeasure(TGTrack track,int number){ 62 Iterator it = track.getMeasures(); 63 while(it.hasNext()){ 64 TGMeasure measure = (TGMeasure)it.next(); 65 if(measure.getNumber() == number){ 66 return measure; 67 } 68 } 69 return null; 70 } 71 72 /** 73 * Retorna Todos los desde Start hasta el final del compas 74 */ getMeasuresBeforeEnd(TGTrack track,long fromStart)75 public List getMeasuresBeforeEnd(TGTrack track,long fromStart) { 76 List measures = new ArrayList(); 77 Iterator it = track.getMeasures(); 78 while(it.hasNext()){ 79 TGMeasure currMeasure = (TGMeasure)it.next(); 80 if (currMeasure.getStart() >= fromStart) { 81 measures.add(currMeasure); 82 } 83 } 84 return measures; 85 } 86 87 /** 88 * Retorna Todos los desde Start hasta el final del compas 89 */ getMeasuresBetween(TGTrack track,long p1,long p2)90 public List getMeasuresBetween(TGTrack track,long p1,long p2) { 91 List measures = new ArrayList(); 92 Iterator it = track.getMeasures(); 93 while(it.hasNext()){ 94 TGMeasure measure = (TGMeasure)it.next(); 95 if ((measure.getStart() + measure.getLength()) > p1 && measure.getStart() < p2) { 96 measures.add(measure); 97 } 98 } 99 return measures; 100 } 101 addNewMeasureBeforeEnd(TGTrack track,TGMeasureHeader header)102 public void addNewMeasureBeforeEnd(TGTrack track,TGMeasureHeader header){ 103 addNewMeasureAfter(track,header,getLastMeasure(track)); 104 } 105 106 /** 107 * Agrega un Compas 108 */ addNewMeasureAfter(TGTrack track,TGMeasureHeader header,TGMeasure measure)109 public void addNewMeasureAfter(TGTrack track,TGMeasureHeader header,TGMeasure measure){ 110 TGMeasure newMeasure = getSongManager().getFactory().newMeasure(header); 111 newMeasure.setClef(measure.getClef()); 112 newMeasure.setKeySignature(measure.getKeySignature()); 113 addMeasure(track,newMeasure); 114 } 115 addNewMeasure(TGTrack track,TGMeasureHeader header)116 public void addNewMeasure(TGTrack track,TGMeasureHeader header){ 117 TGMeasure previous = getMeasure(track, (header.getNumber() == 1)?(header.getNumber()+1):header.getNumber()-1); 118 TGMeasure newMeasure = getSongManager().getFactory().newMeasure(header); 119 newMeasure.setTrack(track); 120 newMeasure.setClef(previous.getClef()); 121 newMeasure.setKeySignature(previous.getKeySignature()); 122 addMeasure(track,header.getNumber() - 1,newMeasure); 123 } 124 /* 125 public List copyMeasures(TGTrack track,int m1,int m2){ 126 List measures = new ArrayList(); 127 int number1 = Math.max(1,m1); 128 int number2 = Math.min(track.countMeasures(),m2); 129 for(int number = number1; number <= number2;number ++){ 130 measures.add(getMeasure(track, number)); 131 } 132 return measures; 133 } 134 */ 135 /** 136 * Agrega un Compas 137 *//* 138 public void insertMeasures(TGTrack track,List measures){ 139 if(!measures.isEmpty()){ 140 Iterator it = measures.iterator(); 141 while(it.hasNext()){ 142 TGMeasure measure = (TGMeasure)it.next(); 143 addMeasure(track,(measure.getNumber() - 1),measure); 144 } 145 } 146 }*/ 147 148 /** 149 * Agrega un Compas 150 */ addMeasure(TGTrack track,TGMeasure measure)151 public void addMeasure(TGTrack track,TGMeasure measure){ 152 track.addMeasure(measure); 153 } 154 155 /** 156 * Agrega un Compas 157 */ addMeasure(TGTrack track,int index,TGMeasure measure)158 public void addMeasure(TGTrack track,int index,TGMeasure measure){ 159 track.addMeasure(index,measure); 160 } 161 removeLastMeasure(TGTrack track)162 public void removeLastMeasure(TGTrack track){ 163 removeMeasure(getLastMeasure(track)); 164 } 165 removeMeasure(TGTrack track,long start)166 public void removeMeasure(TGTrack track,long start){ 167 removeMeasure(getMeasureAt(track,start)); 168 } 169 removeMeasure(TGMeasure measure)170 public void removeMeasure(TGMeasure measure){ 171 measure.getTrack().removeMeasure(measure.getNumber() - 1); 172 } 173 replaceMeasure(TGTrack track,TGMeasure newMeasure)174 public TGMeasure replaceMeasure(TGTrack track,TGMeasure newMeasure){ 175 TGMeasure measure = getMeasureAt(track,newMeasure.getStart()); 176 measure.makeEqual(newMeasure); 177 return measure; 178 } 179 180 /** 181 * Mueve el compas 182 */ moveMeasure(TGMeasure measure,long theMove)183 public void moveMeasure(TGMeasure measure,long theMove){ 184 //getSongManager().getMeasureManager().moveAllComponents(measure,theMove); 185 getSongManager().getMeasureManager().moveAllBeats(measure,theMove); 186 } 187 moveOutOfBoundsBeatsToNewMeasure(TGTrack track, long start)188 public void moveOutOfBoundsBeatsToNewMeasure(TGTrack track, long start){ 189 Iterator it = getMeasuresBeforeEnd(track,start).iterator(); 190 while( it.hasNext() ){ 191 TGMeasure measure = (TGMeasure)it.next(); 192 getSongManager().getMeasureManager().moveOutOfBoundsBeatsToNewMeasure(measure); 193 } 194 } 195 moveTrackBeats(TGTrack track, long measureStart, long moveStart, long theMove )196 public void moveTrackBeats(TGTrack track, long measureStart, long moveStart, long theMove ){ 197 List measures = getMeasuresBeforeEnd(track,measureStart); 198 for( int i = 0 ; i < measures.size() ; i ++ ){ 199 TGMeasure measure = (TGMeasure)measures.get(i); 200 if( moveStart + theMove < moveStart ){ 201 getSongManager().getMeasureManager().removeBeatsBeetween(measure, moveStart, (moveStart + Math.abs(theMove))); 202 } 203 getSongManager().getMeasureManager().moveBeats(measure, moveStart, theMove); 204 } 205 for( int i = 0 ; i < measures.size() ; i ++ ){ 206 TGMeasure measure = (TGMeasure)measures.get(i); 207 getSongManager().getMeasureManager().moveOutOfBoundsBeatsToNewMeasure(measure,false); 208 } 209 } 210 changeKeySignature(TGTrack track,long start,int keySignature,boolean toEnd)211 public void changeKeySignature(TGTrack track,long start,int keySignature,boolean toEnd){ 212 changeKeySignature(track,getMeasureAt(track,start),keySignature,toEnd); 213 } 214 215 /** 216 * Cambia el Key Signature 217 */ changeKeySignature(TGTrack track,TGMeasure measure,int keySignature,boolean toEnd)218 public void changeKeySignature(TGTrack track,TGMeasure measure,int keySignature,boolean toEnd){ 219 //asigno el nuevo Key 220 measure.setKeySignature(keySignature); 221 222 if(toEnd){ 223 List measures = getMeasuresBeforeEnd(track,measure.getStart() + 1); 224 Iterator it = measures.iterator(); 225 while(it.hasNext()){ 226 TGMeasure nextMeasure = (TGMeasure)it.next(); 227 nextMeasure.setKeySignature(keySignature); 228 } 229 } 230 } 231 changeClef(TGTrack track,long start,int clef,boolean toEnd)232 public void changeClef(TGTrack track,long start,int clef,boolean toEnd){ 233 changeClef(track,getMeasureAt(track,start),clef,toEnd); 234 } 235 236 /** 237 * Cambia el Clef 238 */ changeClef(TGTrack track,TGMeasure measure,int clef,boolean toEnd)239 public void changeClef(TGTrack track,TGMeasure measure,int clef,boolean toEnd){ 240 //asigno el nuevo clef 241 measure.setClef(clef); 242 243 if(toEnd){ 244 List measures = getMeasuresBeforeEnd(track,measure.getStart() + 1); 245 Iterator it = measures.iterator(); 246 while(it.hasNext()){ 247 TGMeasure nextMeasure = (TGMeasure)it.next(); 248 nextMeasure.setClef(clef); 249 } 250 } 251 } 252 changeSolo(TGTrack track,boolean solo)253 public void changeSolo(TGTrack track,boolean solo){ 254 track.setSolo(solo); 255 track.setMute(track.isSolo() ? false : track.isMute()); 256 } 257 changeMute(TGTrack track,boolean mute)258 public void changeMute(TGTrack track,boolean mute){ 259 track.setMute(mute); 260 track.setSolo(track.isMute() ? false : track.isSolo()); 261 } 262 changeInfo(TGTrack track,String name,TGColor color,int offset)263 public void changeInfo(TGTrack track,String name,TGColor color,int offset){ 264 track.setName(name); 265 track.setOffset(offset); 266 track.getColor().setR(color.getR()); 267 track.getColor().setG(color.getG()); 268 track.getColor().setB(color.getB()); 269 } 270 changeInstrumentStrings(TGTrack track,List strings)271 public void changeInstrumentStrings(TGTrack track,List strings){ 272 if(strings.size() < track.getStrings().size()){ 273 removeNotesAfterString(track,strings.size()); 274 } 275 track.setStrings(strings); 276 } 277 removeNotesAfterString(TGTrack track,int string)278 public void removeNotesAfterString(TGTrack track,int string){ 279 Iterator it = track.getMeasures(); 280 while(it.hasNext()){ 281 TGMeasure measure = (TGMeasure)it.next(); 282 getSongManager().getMeasureManager().removeNotesAfterString(measure,string); 283 } 284 } 285 changeInstrument(TGTrack track,int instrument,boolean percussion)286 public void changeInstrument(TGTrack track,int instrument,boolean percussion){ 287 track.getChannel().setInstrument((short)instrument); 288 if(percussion){ 289 TGChannel.setPercussionChannel(track.getChannel()); 290 track.setStrings(TGSongManager.createPercussionStrings(getSongManager().getFactory(),track.getStrings().size())); 291 }else{ 292 if(track.getChannel().isPercussionChannel()){ 293 TGChannel tempChannel = this.songManager.getFreeChannel((short)instrument,false); 294 track.getChannel().setChannel(tempChannel.getChannel()); 295 track.getChannel().setEffectChannel(tempChannel.getEffectChannel()); 296 } 297 } 298 this.songManager.updateChannel(track.getChannel()); 299 } 300 autoCompleteSilences(TGTrack track)301 public void autoCompleteSilences(TGTrack track){ 302 Iterator it = track.getMeasures(); 303 while(it.hasNext()){ 304 TGMeasure measure = (TGMeasure)it.next(); 305 this.songManager.getMeasureManager().autoCompleteSilences(measure); 306 } 307 } 308 orderBeats(TGTrack track)309 public void orderBeats(TGTrack track){ 310 Iterator it = track.getMeasures(); 311 while(it.hasNext()){ 312 TGMeasure measure = (TGMeasure)it.next(); 313 this.songManager.getMeasureManager().orderBeats(measure); 314 } 315 } 316 transposeNotes(TGTrack track, int transposition , boolean tryKeepString, boolean applyToChords, int applyToString)317 public void transposeNotes(TGTrack track, int transposition , boolean tryKeepString, boolean applyToChords, int applyToString){ 318 Iterator it = track.getMeasures(); 319 while(it.hasNext()){ 320 TGMeasure measure = (TGMeasure)it.next(); 321 this.songManager.getMeasureManager().transposeNotes(measure, transposition, tryKeepString, applyToChords, applyToString ); 322 } 323 } 324 transposeNotes(TGTrack track, int[] transpositionStrings , boolean tryKeepString , boolean applyToChords )325 public void transposeNotes(TGTrack track, int[] transpositionStrings , boolean tryKeepString , boolean applyToChords ){ 326 Iterator it = track.getMeasures(); 327 while(it.hasNext()){ 328 TGMeasure measure = (TGMeasure)it.next(); 329 this.songManager.getMeasureManager().transposeNotes(measure, transpositionStrings, tryKeepString , applyToChords); 330 } 331 } 332 333 /** 334 * Retorna true si es el primer compas 335 */ isFirstMeasure(TGMeasure measure)336 public boolean isFirstMeasure(TGMeasure measure){ 337 return (measure.getNumber() == 1); 338 } 339 340 /** 341 * Retorna true si es el ultimo compas 342 */ isLastMeasure(TGMeasure measure)343 public boolean isLastMeasure(TGMeasure measure){ 344 return (getSongManager().getSong().countMeasureHeaders() == measure.getNumber()); 345 } 346 } 347