static void IntervalTier_insertEmptyIntervalsFromOtherTier (IntervalTier to, IntervalTier from) { for (long iint = 1; iint <= from -> intervals.size; iint ++) { TextInterval tifrom = from -> intervals.at [iint]; if (TextInterval_labelLength (tifrom) == 0) { // found empty interval double t_left = tifrom -> xmin, t_right = tifrom -> xmax; long intervalIndex_to = IntervalTier_timeToLowIndex (to, t_left); if (intervalIndex_to > 0) { // insert to the right of intervalIndex_to TextInterval tito = to -> intervals.at [intervalIndex_to]; if (! almost_equal (tito -> xmin, t_left)) { // not on the start boundary of the interval, it cannot be at xmax autoTextInterval newInterval = TextInterval_create (t_left, tito -> xmax, U""); tito -> xmax = t_left; to -> intervals. addItem_move (newInterval.move()); } } intervalIndex_to = IntervalTier_timeToHighIndex (to, t_right); TextInterval tito = to -> intervals.at [intervalIndex_to]; if (intervalIndex_to > 0) { if (! almost_equal (t_right, tito -> xmax)) { // insert to the left of intervalIndex_to autoTextInterval newInterval = TextInterval_create (tito -> xmin, t_right, U""); tito -> xmin = t_right; to -> intervals. addItem_move (newInterval.move()); } } } } }
/* insert boundary at time t and merge/delete intervals after this time */ static void IntervalTier_insertBoundaryAndMergeIntervalsAfter (IntervalTier me, double t) { if (t <= my xmin || t >= my xmax) { return; } long intervalNumber = IntervalTier_timeToLowIndex (me, t); while (my intervals.size > intervalNumber + 1) { my intervals. removeItem (my intervals.size); } // there can be maximally one interval left to the right of intervalNumber TextInterval ti = my intervals.at [intervalNumber]; if (ti -> xmin == t) { // if t happens to be on a boundary: remove the next interval if it exists if (my intervals.size > intervalNumber) { my intervals. removeItem (my intervals .size); } ti -> xmax = my xmax; TextInterval_setText (ti, U""); } else { ti -> xmax = t; TextInterval last = my intervals.at [my intervals.size]; last -> xmin = t; last -> xmax = my xmax; TextInterval_setText (last, U""); } }
static double IntervalTier_boundaryTimeClosestTo (IntervalTier me, double tmin, double tmax) { long intervalNumber = IntervalTier_timeToLowIndex (me, tmax); if (intervalNumber != 0) { TextInterval interval = my intervals.at [intervalNumber]; if (interval -> xmin > tmin && interval -> xmin < tmax) { return interval -> xmin; } } return 0.5 * (tmin + tmax); }
static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, double time, const char32 *leftLabel) { if (time <= my xmin || time >= my xmax) { Melder_throw (U"Time is outside interval."); } // Find interval to split if (iinterval <= 0) { iinterval = IntervalTier_timeToLowIndex (me, time); } // Modify end time of left label TextInterval ti = (TextInterval) my intervals -> item[iinterval]; ti -> xmax = time; TextInterval_setText (ti, leftLabel); autoTextInterval ti_new = TextInterval_create (time, my xmax, U""); Sorted_addItem_unsorted (my intervals, ti_new.transfer()); }
static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, double time, const char32 *newLabel, bool isNewleftLabel) { if (time <= my xmin || time >= my xmax) { Melder_throw (U"Time is outside interval domains."); } // Find interval to split if (iinterval <= 0) { iinterval = IntervalTier_timeToLowIndex (me, time); } // Modify end time of left label TextInterval ti = my intervals.at [iinterval]; ti -> xmax = time; if (isNewleftLabel) TextInterval_setText (ti, newLabel); autoTextInterval ti_new = TextInterval_create (time, my xmax, (! isNewleftLabel ? newLabel : U"" )); my intervals. addItem_unsorted_move (ti_new.move()); }