/*
* 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.models;
import org.herac.tuxguitar.song.factory.TGFactory;
/**
* @author julian
*
* TODO To change the template for this generated type comment go to Window - Preferences - Java - Code Style - Code Templates
*/
public abstract class TGBeat {
public static final int MAX_VOICES = 2;
private long start;
private TGMeasure measure;
private TGChord chord;
private TGText text;
private TGVoice[] voices;
private TGStroke stroke;
public TGBeat(TGFactory factory) {
this.start = TGDuration.QUARTER_TIME;
this.stroke = factory.newStroke();
this.voices = new TGVoice[ MAX_VOICES ];
for( int i = 0 ; i < MAX_VOICES ; i ++ ){
this.setVoice(i, factory.newVoice(i));
}
}
public TGMeasure getMeasure() {
return this.measure;
}
public void setMeasure(TGMeasure measure) {
this.measure = measure;
}
public long getStart() {
return this.start;
}
public void setStart(long start) {
this.start = start;
}
public void setVoice(int index, TGVoice voice){
if( index >= 0 && index < this.voices.length ){
this.voices[index] = voice;
this.voices[index].setBeat( this );
}
}
public TGVoice getVoice(int index){
if( index >= 0 && index < this.voices.length ){
return this.voices[index];
}
return null;
}
public int countVoices(){
return this.voices.length;
}
public void setChord(TGChord chord) {
this.chord = chord;
this.chord.setBeat(this);
}
public TGChord getChord() {
return this.chord;
}
public void removeChord() {
this.chord = null;
}
public TGText getText() {
return this.text;
}
public void setText(TGText text) {
this.text = text;
this.text.setBeat(this);
}
public void removeText(){
this.text = null;
}
public boolean isChordBeat(){
return ( this.chord != null );
}
public boolean isTextBeat(){
return ( this.text != null );
}
public TGStroke getStroke() {
return this.stroke;
}
public boolean isRestBeat(){
for(int v = 0; v < this.countVoices() ; v ++ ){
TGVoice voice = this.getVoice( v );
if( !voice.isEmpty() && !voice.isRestVoice() ){
return false;
}
}
return true;
}
public TGBeat clone(TGFactory factory){
TGBeat beat = factory.newBeat();
beat.setStart(getStart());
getStroke().copy( beat.getStroke() );
for( int i = 0 ; i < this.voices.length ; i ++ ){
beat.setVoice(i, this.voices[i].clone(factory));
}
if(this.chord != null){
beat.setChord( this.chord.clone(factory));
}
if(this.text != null){
beat.setText( this.text.clone(factory));
}
return beat;
}
}