static void IntervalTier_removeEmptyIntervals (IntervalTier me, IntervalTier boss) { IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (me, U""); if (my intervals.size < 2) return; TextInterval firstInterval = my intervals.at [1]; if (Melder_equ (firstInterval -> text, U"")) { IntervalTier_removeLeftBoundary (me, 2); } if (my intervals.size < 2) return; TextInterval lastInterval = my intervals.at [my intervals.size]; if (Melder_equ (lastInterval -> text, U"")) { IntervalTier_removeLeftBoundary (me, my intervals.size); } if (my intervals.size < 3) return; for (long iinterval = my intervals.size - 1; iinterval >= 2; iinterval --) { TextInterval interval = my intervals.at [iinterval]; if (Melder_equ (interval -> text, U"")) { /* * Distribute the empty interval between its neigbours. */ double newBoundaryTime = boss ? IntervalTier_boundaryTimeClosestTo (boss, interval -> xmin, interval -> xmax) : 0.5 * (interval -> xmin + interval -> xmax); TextInterval previous = my intervals.at [iinterval - 1]; TextInterval next = my intervals.at [iinterval + 1]; previous -> xmax = newBoundaryTime; next -> xmin = newBoundaryTime; my intervals. removeItem (iinterval); } } }
static void IntervalTier_removeEmptyIntervals (IntervalTier me, IntervalTier boss) { IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (me, L""); if (my intervals -> size < 2) return; TextInterval firstInterval = my interval (1); if (Melder_wcsequ (firstInterval -> text, L"")) { IntervalTier_removeLeftBoundary (me, 2); } if (my numberOfIntervals () < 2) return; TextInterval lastInterval = my interval (my numberOfIntervals ()); if (Melder_wcsequ (lastInterval -> text, L"")) { IntervalTier_removeLeftBoundary (me, my numberOfIntervals ()); } if (my numberOfIntervals () < 3) return; for (long iinterval = my numberOfIntervals () - 1; iinterval >= 2; iinterval --) { TextInterval interval = my interval (iinterval); if (Melder_wcsequ (interval -> text, L"")) { /* * Distribute the empty interval between its neigbours. */ double newBoundaryTime = boss ? IntervalTier_boundaryTimeClosestTo (boss, interval -> xmin, interval -> xmax) : 0.5 * (interval -> xmin + interval -> xmax); TextInterval previous = my interval (iinterval - 1); TextInterval next = my interval (iinterval + 1); previous -> xmax = newBoundaryTime; next -> xmin = newBoundaryTime; Collection_removeItem (my intervals, iinterval); } } }
void IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (IntervalTier me, const char32 *label) { try { for (long iint = my intervals -> size; iint > 1; iint--) { TextInterval ti = (TextInterval) my intervals -> item[iint]; if (Melder_equ (ti -> text, label)) { TextInterval tim1 = (TextInterval) my intervals -> item[iint - 1]; if (Melder_equ (tim1 -> text, label)) { Melder_free (tim1 -> text); IntervalTier_removeLeftBoundary (me, iint); } } } } catch (MelderError) { Melder_throw (me, U": boundaries not removed."); } }