PointProcess Sound_Pitch_to_PointProcess_peaks (Sound sound, Pitch pitch, int includeMaxima, int includeMinima) { PointProcess point = PointProcess_create (sound -> xmin, sound -> xmax, 10); double t = pitch -> xmin; double addedRight = -1e300; /* * Cycle over all voiced intervals. */ for (;;) { double tleft, tright, tmiddle, f0middle, tmax, tsave; if (! Pitch_getVoicedIntervalAfter (pitch, t, & tleft, & tright)) break; /* * Go to the middle of the voiced interval. */ tmiddle = (tleft + tright) / 2; if (! Melder_progress1 ((tmiddle - sound -> xmin) / (sound -> xmax - sound -> xmin), L"Sound & Pitch to PointProcess")) goto end; f0middle = Pitch_getValueAtTime (pitch, tmiddle, kPitch_unit_HERTZ, Pitch_LINEAR); /* * Our first point is near this middle. */ Melder_assert (NUMdefined (f0middle)); tmax = Sound_findExtremum (sound, tmiddle - 0.5 / f0middle, tmiddle + 0.5 / f0middle, includeMaxima, includeMinima); Melder_assert (NUMdefined (tmax)); if (! PointProcess_addPoint (point, tmax)) goto end; tsave = tmax; for (;;) { double f0 = Pitch_getValueAtTime (pitch, tmax, kPitch_unit_HERTZ, Pitch_LINEAR); if (f0 == NUMundefined) break; tmax = Sound_findExtremum (sound, tmax - 1.25 / f0, tmax - 0.8 / f0, includeMaxima, includeMinima); if (tmax < tleft) { if (tmax - addedRight > 0.8 / f0) if (! PointProcess_addPoint (point, tmax)) goto end; break; } if (tmax - addedRight > 0.8 / f0) /* Do not fill in a short originally unvoiced interval twice. */ if (! PointProcess_addPoint (point, tmax)) goto end; } tmax = tsave; for (;;) { double f0 = Pitch_getValueAtTime (pitch, tmax, kPitch_unit_HERTZ, Pitch_LINEAR); if (f0 == NUMundefined) break; tmax = Sound_findExtremum (sound, tmax + 0.8 / f0, tmax + 1.25 / f0, includeMaxima, includeMinima); if (tmax > tright) { if (! PointProcess_addPoint (point, tmax)) goto end; addedRight = tmax; break; } if (! PointProcess_addPoint (point, tmax)) goto end; addedRight = tmax; } t = tright; } end: Melder_progress1 (1.0, NULL); iferror forget (point); return point; }
static void menu_cb_addPointAtCursor (EDITOR_ARGS) { EDITOR_IAM (PointEditor); Editor_save (me, L"Add point"); PointProcess_addPoint ((PointProcess) my data, 0.5 * (my d_startSelection + my d_endSelection)); FunctionEditor_redraw (me); my broadcastDataChanged (); }
PointProcess PitchTier_to_PointProcess (PitchTier me) { try { autoPointProcess thee = PointProcess_create (my xmin, my xmax, 1000); double area = 0.5; // imagine an event half a period before the beginning long size = my points -> size; if (size == 0) return thee.transfer(); for (long interval = 0; interval <= size; interval ++) { double t1 = interval == 0 ? my xmin : ((RealPoint) my points -> item [interval]) -> number; Melder_assert (NUMdefined (t1)); double t2 = interval == size ? my xmax : ((RealPoint) my points -> item [interval + 1]) -> number; Melder_assert (NUMdefined (t2)); double f1 = ((RealPoint) my points -> item [interval == 0 ? 1 : interval]) -> value; Melder_assert (NUMdefined (f1)); double f2 = ((RealPoint) my points -> item [interval == size ? size : interval + 1]) -> value; Melder_assert (NUMdefined (f2)); area += (t2 - t1) * 0.5 * (f1 + f2); while (area >= 1.0) { double slope = (f2 - f1) / (t2 - t1), discriminant; area -= 1.0; discriminant = f2 * f2 - 2.0 * area * slope; if (discriminant < 0.0) discriminant = 0.0; // catch rounding errors PointProcess_addPoint (thee.peek(), t2 - 2.0 * area / (f2 + sqrt (discriminant))); } } return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": not converted to PointProcess."); } }
autoPointProcess Matrix_to_PointProcess (Matrix me) { try { autoPointProcess thee = PointProcess_create (my z [1] [1], my z [1] [my nx], my nx); for (long i = 1; i <= my nx; i ++) { PointProcess_addPoint (thee.peek(), my z [1] [i]); } return thee; } catch (MelderError) { Melder_throw (me, U": not converted to PointProcess."); } }
static void menu_cb_addPointAt (PointEditor me, EDITOR_ARGS_FORM) { EDITOR_FORM (U"Add point", nullptr) REAL (U"Position", U"0.0"); EDITOR_OK SET_REAL (U"Position", 0.5 * (my startSelection + my endSelection)); EDITOR_DO Editor_save (me, U"Add point"); PointProcess_addPoint ((PointProcess) my data, GET_REAL (U"Position")); FunctionEditor_redraw (me); Editor_broadcastDataChanged (me); EDITOR_END }
void PointProcess_fill (PointProcess me, double tmin, double tmax, double period) { try { if (tmax <= tmin) tmin = my xmin, tmax = my xmax; // autowindowing long n = (long) floor ((tmax - tmin) / period); double t = 0.5 * (tmin + tmax - n * period); for (long i = 1; i <= n; i ++, t += period) { PointProcess_addPoint (me, t); } } catch (MelderError) { Melder_throw (me, U": not filled."); } }
static void menu_cb_addPointAt (EDITOR_ARGS) { EDITOR_IAM (PointEditor); EDITOR_FORM (L"Add point", 0) REAL (L"Position", L"0.0"); EDITOR_OK SET_REAL (L"Position", 0.5 * (my d_startSelection + my d_endSelection)); EDITOR_DO Editor_save (me, L"Add point"); PointProcess_addPoint ((PointProcess) my data, GET_REAL (L"Position")); FunctionEditor_redraw (me); my broadcastDataChanged (); EDITOR_END }
autoPointProcess PointProcesses_union (PointProcess me, PointProcess thee) { try { autoPointProcess him = Data_copy (me); if (thy xmin < my xmin) his xmin = thy xmin; if (thy xmax > my xmax) his xmax = thy xmax; for (long i = 1; i <= thy nt; i ++) { PointProcess_addPoint (him.get(), thy t [i]); } return him; } catch (MelderError) { Melder_throw (me, U" & ", thee, U": union not computed."); } }
PointProcess PitchTier_Point_to_PointProcess (PitchTier me, PointProcess vuv, double maxT) { try { autoPointProcess fullPoint = PitchTier_to_PointProcess (me); autoPointProcess thee = PointProcess_create (my xmin, my xmax, fullPoint -> maxnt); /* * Copy only voiced parts to result. */ for (long i = 1; i <= fullPoint -> nt; i ++) { double t = fullPoint -> t [i]; if (PointProcess_isVoiced_t (vuv, t, maxT)) { PointProcess_addPoint (thee.peek(), t); } } return thee.transfer(); } catch (MelderError) { Melder_throw (me, " & ", vuv, ": not converted to PointProcess."); } }
static void menu_cb_addPointAtCursor (PointEditor me, EDITOR_ARGS_DIRECT) { Editor_save (me, U"Add point"); PointProcess_addPoint ((PointProcess) my data, 0.5 * (my startSelection + my endSelection)); FunctionEditor_redraw (me); Editor_broadcastDataChanged (me); }
PointProcess Sound_Pitch_to_PointProcess_cc (Sound sound, Pitch pitch) { PointProcess point = PointProcess_create (sound -> xmin, sound -> xmax, 10); double t = pitch -> xmin; double addedRight = -1e300; double globalPeak = Vector_getAbsoluteExtremum (sound, sound -> xmin, sound -> xmax, 0), peak; /* * Cycle over all voiced intervals. */ for (;;) { double tleft, tright, tmiddle, f0middle, tmax, tsave; if (! Pitch_getVoicedIntervalAfter (pitch, t, & tleft, & tright)) break; /* * Go to the middle of the voice stretch. */ tmiddle = (tleft + tright) / 2; if (! Melder_progress1 ((tmiddle - sound -> xmin) / (sound -> xmax - sound -> xmin), L"Sound & Pitch to PointProcess")) goto end; f0middle = Pitch_getValueAtTime (pitch, tmiddle, kPitch_unit_HERTZ, Pitch_LINEAR); /* * Our first point is near this middle. */ if (f0middle == NUMundefined) { Melder_fatal ("Sound_Pitch_to_PointProcess_cc: tleft %ls, tright %ls, f0middle %ls", Melder_double (tleft), Melder_double (tright), Melder_double (f0middle)); } tmax = Sound_findExtremum (sound, tmiddle - 0.5 / f0middle, tmiddle + 0.5 / f0middle, TRUE, TRUE); Melder_assert (NUMdefined (tmax)); if (! PointProcess_addPoint (point, tmax)) goto end; tsave = tmax; for (;;) { double f0 = Pitch_getValueAtTime (pitch, tmax, kPitch_unit_HERTZ, Pitch_LINEAR), correlation; if (f0 == NUMundefined) break; correlation = Sound_findMaximumCorrelation (sound, tmax, 1.0 / f0, tmax - 1.25 / f0, tmax - 0.8 / f0, & tmax, & peak); if (correlation == -1) /*break*/ tmax -= 1.0 / f0; /* This one period will drop out. */ if (tmax < tleft) { if (correlation > 0.7 && peak > 0.023333 * globalPeak && tmax - addedRight > 0.8 / f0) if (! PointProcess_addPoint (point, tmax)) goto end; break; } if (correlation > 0.3 && (peak == 0.0 || peak > 0.01 * globalPeak)) { if (tmax - addedRight > 0.8 / f0) /* Do not fill in a short originally unvoiced interval twice. */ if (! PointProcess_addPoint (point, tmax)) goto end; } } tmax = tsave; for (;;) { double f0 = Pitch_getValueAtTime (pitch, tmax, kPitch_unit_HERTZ, Pitch_LINEAR), correlation; if (f0 == NUMundefined) break; correlation = Sound_findMaximumCorrelation (sound, tmax, 1.0 / f0, tmax + 0.8 / f0, tmax + 1.25 / f0, & tmax, & peak); if (correlation == -1) /*break*/ tmax += 1.0 / f0; if (tmax > tright) { if (correlation > 0.7 && peak > 0.023333 * globalPeak) { if (! PointProcess_addPoint (point, tmax)) goto end; addedRight = tmax; } break; } if (correlation > 0.3 && (peak == 0.0 || peak > 0.01 * globalPeak)) { if (! PointProcess_addPoint (point, tmax)) goto end; addedRight = tmax; } } t = tright; } end: Melder_progress1 (1.0, NULL); iferror forget (point); return point; }