package com.xenoage.zong.core.music.direction;
import com.xenoage.utils.annotations.NonNull;
import com.xenoage.utils.math.Fraction;
import com.xenoage.zong.core.header.ColumnHeader;
import com.xenoage.zong.core.music.ColumnElement;
import com.xenoage.zong.core.music.MusicElementType;
import com.xenoage.zong.core.music.TextElement;
import com.xenoage.zong.core.position.MP;
import com.xenoage.zong.core.text.Text;
import lombok.Data;
import lombok.EqualsAndHashCode;
import static com.xenoage.utils.CheckUtils.checkArgsNotNull;
/**
* Class for a tempo direction, like "Andante", "♩ = 120"
* or "Ziemlich langsam und mit Ausdruck".
*
* The text is optional, but the meaning must be given.
*
* Tempo directions must always be written to the {@link ColumnHeader}.
*
* @author Andreas Wenger
*/
@Data @EqualsAndHashCode(callSuper=false)
public final class Tempo
extends Direction
implements TextElement, ColumnElement {
/** The musical meaning: which beat per minute. */
@NonNull private Fraction baseBeat;
/** The musical meaning: how many of that beats per minute. */
private int beatsPerMinute;
/** Custom caption, or null for format "baseBeat = beatsPerMinute". */
private Text text = null;
public Tempo(Fraction baseBeat, int beatsPerMinute) {
checkArgsNotNull(baseBeat);
if (beatsPerMinute <= 0)
throw new IllegalArgumentException("beatsPerMinute must be > 0");
this.baseBeat = baseBeat;
this.beatsPerMinute = beatsPerMinute;
}
@Override public MusicElementType getMusicElementType() {
return MusicElementType.Tempo;
}
@Override public MP getMP() {
return MP.getMPFromParent(this);
}
}