void TextGrid_Pitch_draw (TextGrid grid, Pitch pitch, Graphics g, long tierNumber, double tmin, double tmax, double fmin, double fmax, double fontSize, int useTextStyles, int horizontalAlignment, int garnish, int speckle, int unit) { try { TextGrid_checkSpecifiedTierNumberWithinRange (grid, tierNumber); double oldFontSize = Graphics_inqFontSize (g); Pitch_draw (pitch, g, tmin, tmax, fmin, fmax, garnish, speckle, unit); if (tmax <= tmin) tmin = grid -> xmin, tmax = grid -> xmax; autoPitchTier pitchTier = Pitch_to_PitchTier (pitch); if (Function_isUnitLogarithmic (pitch, Pitch_LEVEL_FREQUENCY, unit)) { fmin = Function_convertStandardToSpecialUnit (pitch, fmin, Pitch_LEVEL_FREQUENCY, unit); fmax = Function_convertStandardToSpecialUnit (pitch, fmax, Pitch_LEVEL_FREQUENCY, unit); } Graphics_setTextAlignment (g, horizontalAlignment, Graphics_BOTTOM); Graphics_setInner (g); Graphics_setFontSize (g, fontSize); Graphics_setPercentSignIsItalic (g, useTextStyles); Graphics_setNumberSignIsBold (g, useTextStyles); Graphics_setCircumflexIsSuperscript (g, useTextStyles); Graphics_setUnderscoreIsSubscript (g, useTextStyles); Function anyTier = (Function) grid -> tiers -> item [tierNumber]; if (anyTier -> classInfo == classIntervalTier) { IntervalTier tier = (IntervalTier) anyTier; for (long i = 1; i <= tier -> intervals -> size; i ++) { TextInterval interval = (TextInterval) tier -> intervals -> item [i]; double tleft = interval -> xmin, tright = interval -> xmax, tmid, f0; if (! interval -> text || ! interval -> text [0]) continue; if (tleft < pitch -> xmin) tleft = pitch -> xmin; if (tright > pitch -> xmax) tright = pitch -> xmax; tmid = (tleft + tright) / 2; if (tmid < tmin || tmid > tmax) continue; f0 = Function_convertStandardToSpecialUnit (pitch, RealTier_getValueAtTime (pitchTier.peek(), tmid), Pitch_LEVEL_FREQUENCY, unit); if (f0 < fmin || f0 > fmax) continue; Graphics_text (g, horizontalAlignment == Graphics_LEFT ? tleft : horizontalAlignment == Graphics_RIGHT ? tright : tmid, f0, interval -> text); } } else { TextTier tier = (TextTier) anyTier; for (long i = 1; i <= tier -> points -> size; i ++) { TextPoint point = (TextPoint) tier -> points -> item [i]; double t = point -> number, f0; if (! point -> mark || ! point -> mark [0]) continue; if (t < tmin || t > tmax) continue; f0 = Function_convertStandardToSpecialUnit (pitch, RealTier_getValueAtTime (pitchTier.peek(), t), Pitch_LEVEL_FREQUENCY, unit); if (f0 < fmin || f0 > fmax) continue; Graphics_text (g, t, f0, point -> mark); } } Graphics_setPercentSignIsItalic (g, TRUE); Graphics_setNumberSignIsBold (g, TRUE); Graphics_setCircumflexIsSuperscript (g, TRUE); Graphics_setUnderscoreIsSubscript (g, TRUE); Graphics_setFontSize (g, oldFontSize); Graphics_unsetInner (g); } catch (MelderError) { Melder_throw (grid, " & ", pitch, ": not drawn."); } }
autoSound SpeechSynthesizer_and_TextGrid_to_Sound (SpeechSynthesizer me, TextGrid thee, long tierNumber, long iinterval, autoTextGrid *p_tg) { try { TextGrid_checkSpecifiedTierNumberWithinRange (thee, tierNumber); IntervalTier intervalTier = (IntervalTier) thy tiers->at [tierNumber]; if (intervalTier -> classInfo != classIntervalTier) { Melder_throw (U"Tier ", tierNumber, U" is not an interval tier."); } if (iinterval < 1 || iinterval > intervalTier -> intervals.size) { Melder_throw (U"Interval ", iinterval, U" does not exist on tier ", tierNumber, U"."); } return SpeechSynthesizer_and_TextInterval_to_Sound (me, intervalTier -> intervals.at [iinterval], p_tg); } catch (MelderError) { Melder_throw (U"Sound not created from textGrid."); } }
static double TextGrid_getEndTimeOfLastOccurence (TextGrid thee, long tierNumber, const char32 *label) { TextGrid_checkSpecifiedTierNumberWithinRange (thee, tierNumber); IntervalTier intervalTier = (IntervalTier) thy tiers->at [tierNumber]; if (intervalTier -> classInfo != classIntervalTier) { Melder_throw (U"Tier ", tierNumber, U" is not an interval tier."); } double end = NUMundefined; for (long iint = intervalTier -> intervals.size; iint > 0; iint --) { TextInterval ti = intervalTier -> intervals.at [iint]; if (Melder_equ (ti -> text, label)) { end = ti -> xmax; break; } } return end; }
static double TextGrid_getStartTimeOfFirstOccurence (TextGrid thee, long tierNumber, const char32 *label) { TextGrid_checkSpecifiedTierNumberWithinRange (thee, tierNumber); IntervalTier intervalTier = (IntervalTier) thy tiers->at [tierNumber]; if (intervalTier -> classInfo != classIntervalTier) { Melder_throw (U"Tier ", tierNumber, U" is not an interval tier."); } double start = NUMundefined; for (long iint = 1; iint <= intervalTier -> intervals.size; iint ++) { TextInterval ti = intervalTier -> intervals.at [iint]; if (Melder_cmp (ti -> text, label) == 0) { start = ti -> xmin; break; } } return start; }