1
package org.herac.tuxguitar.song.helpers;
3
import java.util.ArrayList;
4
import java.util.Iterator;
7
import org.herac.tuxguitar.song.managers.TGSongManager;
8
import org.herac.tuxguitar.song.managers.TGTrackManager;
9
import org.herac.tuxguitar.song.models.TGMeasure;
10
import org.herac.tuxguitar.song.models.TGMeasureHeader;
11
import org.herac.tuxguitar.song.models.TGTrack;
13
public class TGSongSegmentHelper {
15
private TGSongManager sm;
17
public TGSongSegmentHelper(TGSongManager sm){
21
public TGSongSegment copyMeasures(int m1, int m2){
22
TGSongSegment segment = new TGSongSegment();
23
int number1 = Math.max(1,m1);
24
int number2 = Math.min(this.sm.getSong().countMeasureHeaders(),m2);
25
for(int number = number1; number <= number2;number ++){
26
segment.getHeaders().add( this.sm.getMeasureHeader(number) );
28
Iterator it = this.sm.getSong().getTracks();
30
TGTrack track = (TGTrack)it.next();
31
List measures = new ArrayList();
32
for(int number = number1; number <= number2;number ++){
33
measures.add(this.sm.getTrackManager().getMeasure(track, number));
35
segment.addTrack(track.getNumber(),measures);
37
return segment.clone(this.sm.getFactory());
40
public TGSongSegment copyMeasures(int m1, int m2,TGTrack track){
41
TGSongSegment segment = new TGSongSegment();
42
List measures = new ArrayList();
43
int number1 = Math.max(1,m1);
44
int number2 = Math.min(this.sm.getSong().countMeasureHeaders(),m2);
45
for(int number = number1; number <= number2;number ++){
46
segment.getHeaders().add( this.sm.getMeasureHeader(number) );
47
measures.add(this.sm.getTrackManager().getMeasure(track, number));
49
segment.addTrack(track.getNumber(),measures);
50
return segment.clone(this.sm.getFactory());
53
public void insertMeasures(TGSongSegment segment,int fromNumber,long move, int track){
54
List headers = new ArrayList();
55
this.sm.moveMeasureHeaders(segment.getHeaders(),move,0,false);
57
int headerNumber = fromNumber;
58
Iterator it = segment.getHeaders().iterator();
60
TGMeasureHeader header = (TGMeasureHeader)it.next();
61
header.setNumber(headerNumber);
65
long start = ((TGMeasureHeader)headers.get(0)).getStart();
66
long end = ((TGMeasureHeader)headers.get(headers.size() - 1)).getStart() + ((TGMeasureHeader)headers.get(headers.size() - 1)).getLength();
67
List headersBeforeEnd = this.sm.getMeasureHeadersBeforeEnd(start);
68
this.sm.moveMeasureHeaders(headersBeforeEnd,end - start,headers.size(),true);
70
it = segment.getHeaders().iterator();
72
TGMeasureHeader header = (TGMeasureHeader)it.next();
73
this.sm.addMeasureHeader(header.getNumber() - 1,header);
76
it = this.sm.getSong().getTracks();
77
while (it.hasNext()) {
78
TGTrack currTrack = (TGTrack) it.next();
81
Iterator tracks = segment.getTracks().iterator();
82
while(tracks.hasNext()){
83
TGTrackSegment tSegment = (TGTrackSegment)tracks.next();
85
if( ((track > 0 && segment.getTracks().size() == 1)?track:tSegment.getTrack()) == currTrack.getNumber()){
86
measures = tSegment.getMeasures();
91
TGTrackManager tm = this.sm.getTrackManager();
92
TGMeasure measure = (fromNumber > 1 ? tm.getMeasure(currTrack , (fromNumber - 1) ) : tm.getMeasure(currTrack, headerNumber ));
93
int clef = ( measure != null ? measure.getClef() : TGMeasure.DEFAULT_CLEF );
94
int keySignature = ( measure != null ? measure.getKeySignature() : TGMeasure.DEFAULT_KEY_SIGNATURE );
95
measures = getEmptyMeasures(segment.getHeaders().size(), clef, keySignature);
98
for(int i = 0;i < measures.size();i++){
99
TGMeasure measure = (TGMeasure)measures.get(i);
100
measure.setHeader((TGMeasureHeader)headers.get(i));
101
this.sm.getMeasureManager().moveAllBeats(measure,move);
104
insertMeasures(currTrack,measures);
108
public void insertMeasures(TGTrack track,List measures){
109
if(!measures.isEmpty()){
110
Iterator it = measures.iterator();
112
TGMeasure measure = (TGMeasure)it.next();
113
this.sm.getMeasureManager().removeNotesAfterString(measure, track.stringCount());
114
this.sm.getTrackManager().addMeasure(track,(measure.getNumber() - 1),measure);
119
public void replaceMeasures(TGSongSegment segment,long move, int track) {
120
List measureHeaders = new ArrayList();
121
this.sm.moveMeasureHeaders(segment.getHeaders(),move,0,false);
122
Iterator sHeaders = segment.getHeaders().iterator();
123
while(sHeaders.hasNext()){
124
TGMeasureHeader header = (TGMeasureHeader)sHeaders.next();
125
TGMeasureHeader replace = this.sm.replaceMeasureHeader(header);
127
Iterator nextHeaders = this.sm.getMeasureHeadersAfter(replace.getNumber()).iterator();
128
long nextStart = (replace.getStart() + replace.getLength());
129
while(nextHeaders.hasNext()){
130
TGMeasureHeader next = (TGMeasureHeader)nextHeaders.next();
131
this.sm.moveMeasureComponents(next, (nextStart - next.getStart() ));
132
this.sm.moveMeasureHeader(next, (nextStart - next.getStart() ) , 0);
133
nextStart = (next.getStart() + next.getLength());
135
measureHeaders.add(replace);
138
Iterator sTracks = segment.getTracks().iterator();
139
while(sTracks.hasNext()){
140
TGTrackSegment tSegment = (TGTrackSegment)sTracks.next();
141
TGTrack currTrack = this.sm.getTrack( (track > 0 && segment.getTracks().size() == 1)?track:tSegment.getTrack());
142
if(currTrack != null){
143
for(int i = 0;i < tSegment.getMeasures().size();i++){
144
TGMeasure measure = (TGMeasure)tSegment.getMeasures().get(i);
145
measure.setHeader((TGMeasureHeader)measureHeaders.get(i));
146
this.sm.getMeasureManager().removeNotesAfterString(measure, currTrack.stringCount());
147
this.sm.getMeasureManager().moveAllBeats(measure,move);
148
this.sm.getTrackManager().replaceMeasure(currTrack,measure);
154
private List getEmptyMeasures(int count, int clef, int keySignature) {
155
List measures = new ArrayList();
156
for(int i = 0 ; i < count ; i ++ ){
157
TGMeasure measure = this.sm.getFactory().newMeasure(null);
158
measure.setClef(clef);
159
measure.setKeySignature(keySignature);
160
measures.add(measure);