2
* Created on 23-nov-2005
4
* TODO To change the template for this generated file go to
5
* Window - Preferences - Java - Code Style - Code Templates
7
package org.herac.tuxguitar.song.managers;
9
import java.io.FileNotFoundException;
10
import java.io.IOException;
11
import java.util.ArrayList;
12
import java.util.Iterator;
13
import java.util.List;
15
import org.herac.tuxguitar.io.FileFormatFormatException;
16
import org.herac.tuxguitar.io.SongLoader;
17
import org.herac.tuxguitar.io.SongWriter;
18
import org.herac.tuxguitar.io.gp.GPFormatException;
19
import org.herac.tuxguitar.song.helpers.TrackMeasure;
20
import org.herac.tuxguitar.song.helpers.TracksMeasures;
21
import org.herac.tuxguitar.song.models.Duration;
22
import org.herac.tuxguitar.song.models.InstrumentString;
23
import org.herac.tuxguitar.song.models.Marker;
24
import org.herac.tuxguitar.song.models.Measure;
25
import org.herac.tuxguitar.song.models.MeasureHeader;
26
import org.herac.tuxguitar.song.models.RGBColor;
27
import org.herac.tuxguitar.song.models.Song;
28
import org.herac.tuxguitar.song.models.SongChannel;
29
import org.herac.tuxguitar.song.models.SongTrack;
30
import org.herac.tuxguitar.song.models.Tempo;
31
import org.herac.tuxguitar.song.models.TimeSignature;
37
* TODO To change the template for this generated type comment go to
38
* Window - Preferences - Java - Code Style - Code Templates
40
public class SongManager {
41
public static final short MAX_CHANNELS = 16;
44
private SongTrackManager trackManager;
45
private MeasureManager measureManager;
51
public void setSongName(String name){
52
getSong().setName(name);
55
public Song getSong(){
59
public void newSong(){
60
setSong(makeNewSong());
63
public void save(String fileName){
65
new SongWriter(fileName).write(getSong());
66
} catch (FileNotFoundException e) {
68
} catch (GPFormatException e) {
70
} catch (IOException e) {
75
public boolean open(String fileName) throws FileFormatFormatException{
76
SongLoader loader = new SongLoader(fileName);
77
Song song = loader.load();
85
public void setSong(Song song){
89
public void setProperties(String name,String interpret,String album,String author){
90
getSong().setName(name);
91
getSong().setInterpret(interpret);
92
getSong().setAlbum(album);
93
getSong().setAuthor(author);
96
public void addTrack(SongTrack trackToAdd){
99
for(int i = 0;i < getSong().getTracks().size();i++){
100
SongTrack track = (SongTrack)getSong().getTracks().get(i);
101
if(addIndex == -1 && track.getNumber() == trackToAdd.getNumber()){
105
track.setNumber(track.getNumber() + 1);
109
addIndex = getSong().getTracks().size();
111
getSong().getTracks().add(addIndex,trackToAdd);
114
public void removeTrack(int number){
116
SongTrack trackToRemove = null;
118
Iterator it = getSong().getTracks().iterator();
120
SongTrack currTrack = (SongTrack)it.next();
121
if(trackToRemove == null && currTrack.getNumber() == number){
122
trackToRemove = currTrack;
123
}else if(currTrack.getNumber() == (number + 1)){
124
currTrack.setNumber(number);
129
getSong().getTracks().remove(trackToRemove);
132
private void orderTracks(){
133
for(int i = 0;i < getSong().getTracks().size();i++){
134
SongTrack minTrack = null;
135
for(int trackIdx = i;trackIdx < getSong().getTracks().size();trackIdx++){
136
SongTrack track = (SongTrack)getSong().getTracks().get(trackIdx);
137
if(minTrack == null || track.getNumber() < minTrack.getNumber()){
141
getSong().getTracks().remove(minTrack);
142
getSong().getTracks().add(i,minTrack);
146
public SongTrack getTrack(Measure measure){
147
SongTrack track = null;
148
Iterator it = getSong().getTracks().iterator();
150
SongTrack currTrack = (SongTrack)it.next();
151
if(currTrack.getMeasures().contains(measure)){
159
public static Song makeNewSong(){
160
List tracks = new ArrayList();
161
List strings = createDefaultInstrumentStrings();
162
List measureHeaders = new ArrayList();
163
List measures = new ArrayList();
164
MeasureHeader header = new MeasureHeader(1,1000,new TimeSignature(4,new Duration(Duration.QUARTER)),new Tempo(100),null,MeasureHeader.TRIPLET_FEEL_NONE,false,0);
165
measureHeaders.add(header);
166
measures.add(new Measure(header,new ArrayList(),new ArrayList(),1,0));
167
tracks.add(new SongTrack(1,"Track 1",new SongChannel((short)0,(short)1,(short)0), measures, strings,0,RGBColor.RED));
168
return new Song(tracks,measureHeaders);
171
public int getNextTrackNumber(){
172
return countTracks() + 1;
175
public boolean isEmpty(){
176
return this.song.getTracks().isEmpty();
179
public SongChannel getFreeChannel(short instrument,boolean isPercusion){
180
return getFreeChannel(getSong().getTracks(),instrument,isPercusion);
183
public static SongChannel getFreeChannel(List tracks,short instrument,boolean isPercusion){
185
return SongChannel.getDefaultPercusionChannel();
188
short effectChannel = -1;
190
boolean[] usedChannels = getUsedChannels(tracks);
191
boolean[] usedEffectChannels = getUsedEffectChannels(tracks);
192
for(short i = 0;i < MAX_CHANNELS;i++){
193
if(!usedChannels[i] && !usedEffectChannels[i]){
194
channel = (channel < 0)?i:channel;
195
effectChannel = (effectChannel < 0 && i != channel)?i:effectChannel;
198
if(channel < 0 || effectChannel < 0){
200
effectChannel = channel;
202
SongChannel songChannel = (SongChannel)((SongTrack)tracks.get(tracks.size() - 1)).getChannel();
203
return (SongChannel)songChannel.clone();
206
return new SongChannel(channel,effectChannel,instrument);
209
public boolean[] getUsedEffectChannels(){
210
return getUsedEffectChannels(getSong().getTracks());
213
public static boolean[] getUsedEffectChannels(List tracks){
214
boolean[] usedEffectChannels = new boolean[MAX_CHANNELS];
216
for(int i = 0;i < tracks.size();i++){
217
SongTrack track = (SongTrack)tracks.get(i);
218
usedEffectChannels[track.getChannel().getEffectChannel()] = true;
220
return usedEffectChannels;
223
public boolean[] getUsedChannels(){
224
return getUsedChannels(getSong().getTracks());
227
public static boolean[] getUsedChannels(List tracks){
228
boolean[] usedChannels = new boolean[MAX_CHANNELS];
230
for(int i = 0;i < tracks.size();i++){
231
SongTrack track = (SongTrack)tracks.get(i);
232
usedChannels[track.getChannel().getChannel()] = true;
237
public SongChannel getUsedChannel(int channel){
238
for(int i = 0;i < getSong().getTracks().size();i++){
239
SongTrack track = (SongTrack)getSong().getTracks().get(i);
240
if(channel == track.getChannel().getChannel()){
241
return (SongChannel)track.getChannel().clone();
247
public int countTracksForChannel(int channel){
249
for(int i = 0;i < getSong().getTracks().size();i++){
250
SongTrack track = (SongTrack)getSong().getTracks().get(i);
251
if(channel == track.getChannel().getChannel()){
258
public void updateChannel(SongChannel channel){
259
for(int i = 0;i < getSong().getTracks().size();i++){
260
SongTrack track = (SongTrack)getSong().getTracks().get(i);
261
if(channel.getChannel() == track.getChannel().getChannel()){
262
track.setChannel((SongChannel)channel.clone());
267
public static List createDefaultInstrumentStrings(){
268
List strings = new ArrayList();
269
strings.add(new InstrumentString(1, 64));
270
strings.add(new InstrumentString(2, 59));
271
strings.add(new InstrumentString(3, 55));
272
strings.add(new InstrumentString(4, 50));
273
strings.add(new InstrumentString(5, 45));
274
strings.add(new InstrumentString(6, 40));
278
public static List createPercusionStrings(int stringCount){
279
List strings = new ArrayList();
280
for(int i = 1;i <= stringCount; i++){
281
strings.add(new InstrumentString(i, 0));
286
public void calculateMeasureStartWithRepetitions(){
287
boolean repeatOpen = true;
288
long repeatStart = 1000;
292
int repeatStartIndex = 0;
293
int repeatNumber = 0;
295
for (int headerIdx = 0; headerIdx < getSong().getMeasureHeaders().size(); headerIdx++) {
296
MeasureHeader header = (MeasureHeader) getSong().getMeasureHeaders().get(headerIdx);
298
//asigno el start con repeticiones
299
if(!repeatOpen || header.getStart() + header.getLength() > repeatEnd){
300
header.setStartWidthRepetitions(header.getStart() + startMove);
301
//calculo las notas dentro del compas
302
Iterator it = getSong().getTracks().iterator();
304
SongTrack track = (SongTrack)it.next();
305
getMeasureManager().calculateNoteStartWithRepetitions(getTrackManager().getMeasure(track,header.getNumber()),startMove);
309
//guardo el indice de el compas donde empieza una repeticion
310
if (header.isRepeatStart()) {
311
repeatStartIndex = headerIdx;
312
repeatStart = header.getStart();
316
//si hay una repeticion la hago
317
if (repeatOpen && header.getNumberOfRepetitions() > 0) {
318
if (repeatNumber < header.getNumberOfRepetitions()) {
319
repeatEnd = header.getStart() + header.getLength();
320
startMove += repeatEnd - repeatStart;
321
headerIdx = repeatStartIndex - 1;
335
public int countTracks(){
336
return (getSong().getTracks().size());
339
public int countMeasures(){
340
return (getMeasureHeaders().size());
343
public SongTrackManager getTrackManager(){
344
if(this.trackManager == null){
345
this.trackManager = new SongTrackManager(this);
347
return this.trackManager;
350
public MeasureManager getMeasureManager(){
351
if(this.measureManager == null){
352
this.measureManager = new MeasureManager(this);
354
return this.measureManager;
357
public SongTrack getTrack(long number){
358
SongTrack track = null;
359
for (int i = 0; i < getSong().getTracks().size(); i++) {
360
SongTrack currTrack = (SongTrack) getSong().getTracks().get(i);
361
if(currTrack.getNumber() == number){
370
public SongTrack getFirstTrack(){
371
SongTrack track = null;
372
if(!getSong().getTracks().isEmpty()){
373
track = (SongTrack)getSong().getTracks().get(0);
378
public SongTrack getLastTrack(){
379
SongTrack track = null;
380
if(!getSong().getTracks().isEmpty()){
381
track = (SongTrack)getSong().getTracks().get(getSong().getTracks().size() - 1);
386
public SongTrack cloneTrack(SongTrack track){
387
SongTrack clone = (SongTrack)track.clone(getMeasureHeaders());
388
clone.setNumber(getNextTrackNumber());
393
public boolean moveTrackUp(SongTrack track){
394
if(track.getNumber() > 1){
395
SongTrack prevTrack = getTrack(track.getNumber() - 1);
396
prevTrack.setNumber(prevTrack.getNumber() + 1);
397
track.setNumber(track.getNumber() - 1);
404
public boolean moveTrackDown(SongTrack track){
405
if(track.getNumber() < this.countTracks()){
406
SongTrack nextTrack = getTrack(track.getNumber() + 1);
407
nextTrack.setNumber(nextTrack.getNumber() - 1);
408
track.setNumber(track.getNumber() + 1);
415
private SongTrack makeNewTrack(){
417
List measures = new ArrayList();
418
Iterator it = getSong().getMeasureHeaders().iterator();
420
MeasureHeader header = (MeasureHeader)it.next();
421
measures.add(new Measure(header,new ArrayList(),new ArrayList(),1,0));
424
int number = getNextTrackNumber();
425
String name = "Track " + number;
426
SongChannel channel = getFreeChannel((short)0,false);
427
List strings = createDefaultInstrumentStrings();
429
return new SongTrack(number,name,channel,measures,strings,0,RGBColor.RED);
432
public SongTrack createTrack(){
433
SongTrack track = null;
434
if(getSong().getTracks().isEmpty()){
435
setSong(makeNewSong());
437
track = makeNewTrack();
443
public void removeTrack(SongTrack track){
444
removeTrack(track.getNumber());
447
public void changeTimeSignature(long start,TimeSignature timeSignature,boolean toEnd){
448
changeTimeSignature(getMeasureHeaderAt(start),timeSignature,toEnd);
452
public void changeTimeSignature(MeasureHeader header,TimeSignature timeSignature,boolean toEnd){
453
//asigno el nuevo ritmo
454
header.setTimeSignature((TimeSignature)timeSignature.clone());
456
long nextStart = header.getStart() + header.getLength();
457
List measures = getMeasureHeadersBeforeEnd(header.getStart() + 1);
458
Iterator it = measures.iterator();
460
MeasureHeader nextHeader = (MeasureHeader)it.next();
462
long theMove = nextStart - nextHeader.getStart();
464
moveMeasureComponents(nextHeader,theMove,0);
465
moveMeasureHeader(nextHeader,theMove,0);
468
nextHeader.setTimeSignature((TimeSignature)timeSignature.clone());
471
nextStart = nextHeader.getStart() + nextHeader.getLength();
476
public void changeTripletFeel(long start,int tripletFeel,boolean toEnd){
477
changeTripletFeel(getMeasureHeaderAt(start),tripletFeel,toEnd);
481
public void changeTripletFeel(MeasureHeader header,int tripletFeel,boolean toEnd){
482
//asigno el nuevo tripletFeel
483
header.setTripletFeel(tripletFeel);
486
List measures = getMeasureHeadersBeforeEnd(header.getStart() + 1);
487
Iterator it = measures.iterator();
489
MeasureHeader nextHeader = (MeasureHeader)it.next();
490
nextHeader.setTripletFeel(tripletFeel);
496
public void changeTempo(long start,Tempo tempo,boolean toEnd){
497
changeTempo(getMeasureHeaderAt(start),tempo,toEnd);
500
public void changeTempo(MeasureHeader header,Tempo tempo,boolean toEnd){
501
//asigno el nuevo tempo
502
header.setTempo((Tempo)tempo.clone());
505
List measures = getMeasureHeadersBeforeEnd(header.getStart() + 1);
506
Iterator it = measures.iterator();
508
MeasureHeader nextHeader = (MeasureHeader)it.next();
509
nextHeader.setTempo((Tempo)tempo.clone());
515
public void changeOpenRepeat(long start){
516
MeasureHeader header = getMeasureHeaderAt(start);
517
header.setRepeatStart(!header.isRepeatStart());
518
calculateMeasureStartWithRepetitions();
521
public void changeCloseRepeat(long start,int numberOfRepetitions){
522
MeasureHeader header = getMeasureHeaderAt(start);
523
header.setNumberOfRepetitions(numberOfRepetitions);
524
calculateMeasureStartWithRepetitions();
527
public void addNewMeasureBeforeEnd(){
528
MeasureHeader lastHeader = getLastMeasureHeader();
529
TimeSignature timeSignature = (TimeSignature)lastHeader.getTimeSignature().clone();
530
Tempo tempo = (Tempo)lastHeader.getTempo().clone();
531
int number = (lastHeader.getNumber() + 1);
532
long start = (lastHeader.getStart() + lastHeader.getLength());
533
boolean repeatStart = false;
534
int numberOfRepetitions = 0;
535
int tripletFeel = lastHeader.getTripletFeel();
537
MeasureHeader header = new MeasureHeader(number,start,timeSignature,tempo,null,tripletFeel,repeatStart,numberOfRepetitions);
538
getSong().getMeasureHeaders().add(header);
540
Iterator it = getSong().getTracks().iterator();
542
SongTrack track = (SongTrack)it.next();
544
getTrackManager().addNewMeasureBeforeEnd(track,header);
546
calculateMeasureStartWithRepetitions();
549
public void addNewMeasure(int number){
550
//Obtengo un clon para el nuevo Header.
551
MeasureHeader header = null;
553
header = (MeasureHeader)getMeasureHeader(number).clone();
555
header = (MeasureHeader)getMeasureHeader((number - 1)).clone();
556
header.setStart(header.getStart() + header.getLength());
557
header.setNumber(header.getNumber() + 1);
559
header.setMarker(null);
560
header.setRepeatStart(false);
561
header.setNumberOfRepetitions(0);
563
//Si hay Headers siguientes los muevo
564
MeasureHeader nextHeader = getMeasureHeader(number);
565
if(nextHeader != null){
566
moveMeasureHeaders(getMeasureHeadersBeforeEnd(nextHeader.getStart()),header.getLength(),1,true);
569
//Agrego el header a la lista
570
addMeasureHeader( (header.getNumber() - 1) ,header);
572
//Agrego los compases en todas las pistas
573
Iterator it = getSong().getTracks().iterator();
575
SongTrack track = (SongTrack)it.next();
576
getTrackManager().addNewMeasure(track,header);
579
calculateMeasureStartWithRepetitions();
583
public List getMeasures(long start){
584
List measures = new ArrayList();
585
Iterator it = getSong().getTracks().iterator();
587
SongTrack track = (SongTrack)it.next();
588
Measure measure = getTrackManager().getMeasureAt(track,start);
590
measures.add(measure);
596
public SongTrack replaceTrack(SongTrack t){
597
SongTrack track = getTrack(t.getNumber());
599
track.makeEqual(t,getMeasureHeaders());
604
public TracksMeasures copyMeasures(long p1, long p2){
605
TracksMeasures tracksMeasures = new TracksMeasures();
606
tracksMeasures.setMeasureHeaders(getMeasureHeadersBetween(p1,p2));
608
List list = new ArrayList();
609
Iterator it = getSong().getTracks().iterator();
611
SongTrack track = (SongTrack)it.next();
612
List measures = getTrackManager().copyMeasures(track,p1,p2);
613
tracksMeasures.addTrackMeasure(track.getNumber(),measures);
615
return (TracksMeasures)tracksMeasures.clone();
618
public TracksMeasures copyMeasures(long p1, long p2,SongTrack track){
619
TracksMeasures tracksMeasures = new TracksMeasures();
620
tracksMeasures.setMeasureHeaders(getMeasureHeadersBetween(p1,p2));
622
List list = new ArrayList();
623
List measures = getTrackManager().copyMeasures(track,p1,p2);
624
tracksMeasures.addTrackMeasure(track.getNumber(),measures);
626
return (TracksMeasures)tracksMeasures.clone();
630
public void insertMeasures(TracksMeasures tracksMeasures,int fromNumber,long move){
631
List measureHeaders = new ArrayList();
632
moveMeasureHeaders(tracksMeasures.getMeasureHeaders(),move,0,false);
634
int headerNumber = fromNumber;
635
Iterator it = tracksMeasures.getMeasureHeaders().iterator();
637
MeasureHeader header = (MeasureHeader)it.next();
638
header.setNumber(headerNumber);
639
measureHeaders.add(header);
643
//-----------------------------
644
long start = ((MeasureHeader)measureHeaders.get(0)).getStart();
645
long end = ((MeasureHeader)measureHeaders.get(measureHeaders.size() - 1)).getStart() + ((MeasureHeader)measureHeaders.get(measureHeaders.size() - 1)).getLength();
646
List headersBeforeEnd = getMeasureHeadersBeforeEnd(start);
647
moveMeasureHeaders(headersBeforeEnd,end - start,measureHeaders.size(),true);
649
it = getMeasureHeadersBeforeEnd(start).iterator();
651
MeasureHeader header = (MeasureHeader)it.next();
652
moveMeasureComponents(header,end - start,measureHeaders.size());
654
it= getMeasureHeadersBeforeEnd(start).iterator();
656
MeasureHeader header = (MeasureHeader)it.next();
657
moveMeasureHeader(header,end - start,measureHeaders.size(),false);
660
//---------------------------------------
662
it = tracksMeasures.getMeasureHeaders().iterator();
664
MeasureHeader header = (MeasureHeader)it.next();
665
addMeasureHeader(header.getNumber() - 1,header);
668
it = getSong().getTracks().iterator();
669
while (it.hasNext()) {
670
SongTrack currTrack = (SongTrack) it.next();
671
List measures = null;
673
Iterator trackMeasureIt = tracksMeasures.getTrackMeasures().iterator();
674
while(trackMeasureIt.hasNext()){
675
TrackMeasure trackMeasure = (TrackMeasure)trackMeasureIt.next();
676
if(trackMeasure.getTrack() == currTrack.getNumber()){
677
measures = trackMeasure.getMeasures();
681
if(measures == null){
682
measures = getEmptyMeasures(((TrackMeasure)tracksMeasures.getTrackMeasures().get(0)).getMeasures());
685
for(int i = 0;i < measures.size();i++){
686
Measure measure = (Measure)measures.get(i);
687
measure.setHeader((MeasureHeader)measureHeaders.get(i));
688
getMeasureManager().moveAllComponents(measure,move);
691
getTrackManager().insertMeasures(currTrack,measures, fromNumber);
693
calculateMeasureStartWithRepetitions();
696
private List getEmptyMeasures(List measures) {
697
List emptyMeasures = new ArrayList();
699
Iterator it = measures.iterator();
700
while (it.hasNext()) {
701
Measure measure = (Measure) it.next();
702
int clef = measure.getClef();
703
int keySignature = measure.getKeySignature();
705
emptyMeasures.add(new Measure(null, new ArrayList(), new ArrayList(),clef,keySignature));
707
return emptyMeasures;
711
public void replaceMeasures(TracksMeasures tracksMeasures,long move) {
712
List measureHeaders = new ArrayList();
713
moveMeasureHeaders(tracksMeasures.getMeasureHeaders(),move,0,false);
714
Iterator it = tracksMeasures.getMeasureHeaders().iterator();
716
MeasureHeader header = (MeasureHeader)it.next();
717
measureHeaders.add(replaceMeasureHeader(header));
720
it = tracksMeasures.getTrackMeasures().iterator();
722
TrackMeasure trackMeasure = (TrackMeasure)it.next();
724
SongTrack currTrack = getTrack(trackMeasure.getTrack());
725
List measures = trackMeasure.getMeasures();
726
for(int i = 0;i < measures.size();i++){
727
Measure measure = (Measure)measures.get(i);
728
measure.setHeader((MeasureHeader)measureHeaders.get(i));
729
getMeasureManager().moveAllComponents(measure,move);
730
getTrackManager().replaceMeasure(currTrack,measure);
733
calculateMeasureStartWithRepetitions();
738
public MeasureHeader getFirstMeasureHeader(){
739
MeasureHeader firstHeader = null;
740
for(int i = 0;i < getSong().getMeasureHeaders().size();i++){
741
MeasureHeader currHeader = (MeasureHeader)getSong().getMeasureHeaders().get(i);
742
if(firstHeader == null || (currHeader.getStart() < firstHeader.getStart())){
743
firstHeader = currHeader;
749
public MeasureHeader getLastMeasureHeader(){
750
int lastIndex = getSong().getMeasureHeaders().size() - 1;
751
return (MeasureHeader)getSong().getMeasureHeaders().get(lastIndex);
754
public MeasureHeader getPrevMeasureHeader(MeasureHeader header){
755
int prevIndex = header.getNumber() - 1;
757
return (MeasureHeader)getSong().getMeasureHeaders().get(prevIndex - 1);
762
public MeasureHeader getNextMeasureHeader(MeasureHeader header){
763
int nextIndex = header.getNumber();
764
if(nextIndex < getSong().getMeasureHeaders().size()){
765
return (MeasureHeader)getSong().getMeasureHeaders().get(nextIndex);
770
public MeasureHeader getMeasureHeaderAt(long start){
771
Iterator it = getSong().getMeasureHeaders().iterator();
773
MeasureHeader header = (MeasureHeader)it.next();
774
long measureStart = header.getStart();
775
long measureLength = header.getLength();
776
if(start >= measureStart && start < measureStart + measureLength){
783
public MeasureHeader getMeasureHeader(int number){
784
for (int i = 0; i < getSong().getMeasureHeaders().size(); i++) {
785
MeasureHeader header = (MeasureHeader)getSong().getMeasureHeaders().get(i);
786
if(header.getNumber() == number){
794
* Retorna Todos los desde Start hasta el final del compas
796
public List getMeasureHeadersBeforeEnd(long fromStart) {
797
List headers = new ArrayList();
798
Iterator it = getSong().getMeasureHeaders().iterator();
800
MeasureHeader header = (MeasureHeader)it.next();
801
if (header.getStart() >= fromStart) {
809
* Retorna Todos los desde Start hasta el final del compas
811
public List getMeasureHeadersAfter(int number) {
812
List headers = new ArrayList();
813
Iterator it = getSong().getMeasureHeaders().iterator();
815
MeasureHeader header = (MeasureHeader)it.next();
816
if (header.getNumber() > number) {
824
* Retorna Todos los desde Start hasta el final del compas
826
public List getMeasureHeadersBetween(long p1,long p2) {
827
List headers = new ArrayList();
828
Iterator it = getSong().getMeasureHeaders().iterator();
830
MeasureHeader header = (MeasureHeader)it.next();
831
long start = header.getStart();
832
if (start >= p1 && start <= p2) {
839
public List getMeasureHeaders(){
840
return getSong().getMeasureHeaders();
844
public void removeMeasures(long p1,long p2){
845
removeMeasureHeaders(p1,p2);
848
public void removeLastMeasure(){
849
removeLastMeasureHeader();
852
public void removeMeasure(long start){
853
removeMeasureHeader(start);
857
public void removeMeasure(int number){
858
removeMeasureHeader(number);
865
public void addMeasureHeader(MeasureHeader measure){
866
getSong().getMeasureHeaders().add(measure);
872
public void addMeasureHeader(int index,MeasureHeader measure){
873
getSong().getMeasureHeaders().add(index,measure);
876
public void removeMeasureHeaders(long p1,long p2){
877
List measures = new ArrayList();
879
Iterator it = getMeasureHeadersBetween(p1,p2).iterator();
881
MeasureHeader measure = (MeasureHeader)it.next();
882
removeMeasureHeader(measure);
886
public void removeLastMeasureHeader(){
887
removeMeasureHeader(getLastMeasureHeader());
890
public void removeMeasureHeader(long start){
891
removeMeasureHeader(getMeasureHeaderAt(start));
894
public void removeMeasureHeader(int number){
895
removeMeasureHeader(getMeasureHeader(number));
898
public void removeMeasureHeader(MeasureHeader header){
899
long start = header.getStart();
900
long length = header.getLength();
902
Iterator it = getSong().getTracks().iterator();
904
SongTrack track = (SongTrack)it.next();
905
getTrackManager().removeMeasure(track,start);
908
List nextMeasures = getMeasureHeadersBeforeEnd(start + 1);
909
moveMeasureHeaders(nextMeasures,-length,-1,true);
911
it = nextMeasures.iterator();
913
MeasureHeader currMeasure = (MeasureHeader)it.next();
914
moveMeasureHeader(currMeasure,-length,-1,true);
917
getSong().getMeasureHeaders().remove(header.getNumber() - 1);
919
calculateMeasureStartWithRepetitions();
922
public MeasureHeader replaceMeasureHeader(MeasureHeader newMeasure){
923
MeasureHeader measure = getMeasureHeaderAt(newMeasure.getStart());
924
measure.makeEqual((MeasureHeader)newMeasure.clone());
925
//measure.makeEqual(newMeasure);
932
public void moveMeasureHeaders(List headers,long theMove,int numberMove,boolean moveComponents) {
934
Iterator it = headers.iterator();
936
MeasureHeader header = (MeasureHeader) it.next();
937
moveMeasureComponents(header,theMove,numberMove);
940
Iterator it = headers.iterator();
941
while (it.hasNext()) {
942
MeasureHeader header = (MeasureHeader) it.next();
943
moveMeasureHeader(header,theMove,numberMove);
950
public void moveMeasureHeader(MeasureHeader header,long theMove,int numberMove){
951
header.setNumber(header.getNumber() + numberMove);
952
header.setStart(header.getStart() + theMove);
958
public void moveMeasureComponents(MeasureHeader header,long theMove,int numberMove){
959
Iterator it = getSong().getTracks().iterator();
961
SongTrack track = (SongTrack)it.next();
962
getTrackManager().moveMeasure(track,getTrackManager().getMeasure(track,header.getNumber()),theMove,numberMove);
968
* Retorna true si el start esta en el rango del compas
970
public boolean isAtPosition(MeasureHeader header,long start){
971
return (start >= header.getStart() && start < header.getStart() + header.getLength());
987
public Marker updateMarker(int number,String title,RGBColor color){
988
return updateMarker(new Marker(number,title,color));
991
public Marker updateMarker(Marker marker){
992
MeasureHeader header = getMeasureHeader(marker.getMeasure());
994
header.setMarker(marker);
999
public void removeMarker(Marker marker){
1001
removeMarker(marker.getMeasure());
1005
public void removeMarker(int number){
1006
MeasureHeader header = getMeasureHeader(number);
1007
if(header != null && header.hasMarker()){
1008
header.setMarker(null);
1012
public void removeAllMarkers(){
1013
Iterator it = getSong().getMeasureHeaders().iterator();
1014
while(it.hasNext()){
1015
MeasureHeader header = (MeasureHeader)it.next();
1016
if(header.hasMarker()){
1017
header.setMarker(null);
1022
public List getMarkers(){
1023
List markers = new ArrayList();
1024
Iterator it = getSong().getMeasureHeaders().iterator();
1025
while(it.hasNext()){
1026
MeasureHeader header = (MeasureHeader)it.next();
1027
if(header.hasMarker()){
1028
markers.add(header.getMarker());
1034
public Marker getMarker(int number){
1035
MeasureHeader header = getMeasureHeader(number);
1036
if(header != null && header.hasMarker()){
1037
return header.getMarker();
1042
public Marker getPreviousMarker(int from){
1043
MeasureHeader previous = null;
1044
Iterator it = getSong().getMeasureHeaders().iterator();
1045
while(it.hasNext()){
1046
MeasureHeader header = (MeasureHeader)it.next();
1047
if(header.hasMarker() && header.getNumber() < from){
1048
if(previous == null || previous.getNumber() < header.getNumber()){
1053
return (previous != null)?previous.getMarker():null;
1056
public Marker getNextMarker(int from){
1057
MeasureHeader next = null;
1058
Iterator it = getSong().getMeasureHeaders().iterator();
1059
while(it.hasNext()){
1060
MeasureHeader header = (MeasureHeader)it.next();
1061
if(header.hasMarker() && header.getNumber() > from){
1062
if(next == null || next.getNumber() > header.getNumber()){
1067
return (next != null)?next.getMarker():null;
1070
public Marker getFirstMarker(){
1071
MeasureHeader first = null;
1072
Iterator it = getSong().getMeasureHeaders().iterator();
1073
while(it.hasNext()){
1074
MeasureHeader header = (MeasureHeader)it.next();
1075
if(header.hasMarker()){
1076
if(first == null || header.getNumber() < first.getNumber()){
1081
return (first != null)?first.getMarker():null;
1084
public Marker getLastMarker(){
1085
MeasureHeader next = null;
1086
Iterator it = getSong().getMeasureHeaders().iterator();
1087
while(it.hasNext()){
1088
MeasureHeader header = (MeasureHeader)it.next();
1089
if(header.hasMarker()){
1090
if(next == null || header.getNumber() > next.getNumber()){
1095
return (next != null)?next.getMarker():null;
1099
public void autoCompleteSilences(){
1100
Iterator it = getSong().getTracks().iterator();
1101
while(it.hasNext()){
1102
SongTrack track = (SongTrack)it.next();
1103
getTrackManager().autoCompleteSilences(track);