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