/**
* Copyright 2010 DFKI GmbH.
* All Rights Reserved. Use is subject to license terms.
*
* This file is part of MARY TTS.
*
* MARY TTS is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package marytts.util.data.text;
/**
* Basic data unit of an IntervalTier in a Praat TextGrid. Every interval has a start and an end time, as well as a label.
*
* @author steiner
*
*/
public class PraatInterval {
// start time of interval
private double xmin = Double.NaN;
// end time of interval
private double xmax = Double.NaN;
// label String of interval
private String text = null;
// duration of interval, stored independently to facilitate creation of IntervalTiers from sparse representation (e.g.
// Xwaves).
private double duration = Double.NaN;
/**
* constructor from start and end times, with empty label
*
* @param xmin
* start time of interval
* @param xmax
* end time of interval
*/
public PraatInterval(double xmin, double xmax) {
setXmin(xmin);
setXmax(xmax);
}
/**
* constructor from start and end times and label
*
* @param xmin
* start time of interval
* @param xmax
* end time of interval
* @param text
* label of interval
*/
public PraatInterval(double xmin, double xmax, String text) {
this(xmin, xmax);
setText(text);
}
/**
* constructor for underspecified interval from duration, with empty label; start and end times are filled in later, when
* interval is one of many
*
* @param duration
* of interval
*/
public PraatInterval(double duration) {
setDuration(duration);
}
/**
* constructor for underspecified interval from duration and label; start and end times are filled in later, when interval is
* one of many
*
* @param duration
* of interval
* @param text
* label of interval
*/
public PraatInterval(double duration, String text) {
this(duration);
setText(text);
}
/**
* getter for start time of interval
*
* @return start time as double
*/
public double getXmin() {
return this.xmin;
}
/**
* getter for end time of interval
*
* @return end time as double
*/
public double getXmax() {
return this.xmax;
}
/**
* getter for label String of interval; should not be null
*
* @return label as String
*/
public String getText() {
if (this.text == null) {
return "";
}
return this.text;
}
/**
* getter for duration of interval
*
* @return duration of interval as double
*/
public double getDuration() {
return this.duration;
}
/**
* set start time of interval
*
* @param xmin
* new start time
*/
public void setXmin(double xmin) {
this.xmin = xmin;
updateDuration();
}
/**
* set end time of interval
*
* @param xmax
* new end time
*/
public void setXmax(double xmax) {
this.xmax = xmax;
updateDuration();
}
/**
* set label String of interval
*
* @param text
* new label
*/
public void setText(String text) {
this.text = text;
}
/**
* set duration of interval
*
* @param duration
* duration
* @throws IllegalArgumentException
* if duration is negative
*/
public void setDuration(double duration) throws IllegalArgumentException {
if (Double.isNaN(duration) || duration < 0.0) {
throw new IllegalArgumentException("duration must be a non-negative value, but was " + duration);
}
this.duration = duration;
}
/**
* recalculate and set duration based on current start and end times
*/
public void updateDuration() {
if (!Double.isNaN(getXmin()) && !Double.isNaN(getXmax())) {
setDuration(getXmax() - getXmin());
}
}
/**
* determine if interval is fully specified
*
* @return true if both start and end time are set; false otherwise
*/
public boolean isComplete() {
if (Double.isNaN(getXmin()) || Double.isNaN(getXmax())) {
return false;
} else {
return true;
}
}
/**
* string representation of interval, used for TextGrid output
*/
public String toString() {
StringBuilder str = new StringBuilder();
str.append("xmin = " + getXmin() + " \n");
str.append("xmax = " + getXmax() + " \n");
str.append("text = \"" + getText() + "\" \n");
return str.toString();
}
}