autoSound Manipulation_to_Sound (Manipulation me, int method) { switch (method) { case Manipulation_OVERLAPADD: return synthesize_overlapAdd (me); case Manipulation_PULSES: return synthesize_pulses (me); case Manipulation_PULSES_HUM: return synthesize_pulses_hum (me); case Manipulation_PITCH: return synthesize_pitch (me); case Manipulation_PITCH_HUM: return synthesize_pitch_hum (me); case Manipulation_PULSES_PITCH: return synthesize_pulses_pitch (me); case Manipulation_PULSES_PITCH_HUM: return synthesize_pulses_pitch_hum (me); case Manipulation_OVERLAPADD_NODUR: return synthesize_overlapAdd_nodur (me); case Manipulation_PULSES_FORMANT: return autoSound(); case Manipulation_PULSES_FORMANT_INTENSITY: return autoSound(); case Manipulation_PULSES_LPC: return synthesize_pulses_lpc (me); case Manipulation_PULSES_LPC_INTENSITY: return autoSound(); case Manipulation_PITCH_LPC: return synthesize_pitch_lpc (me); case Manipulation_PITCH_LPC_INTENSITY: return autoSound(); default: return synthesize_overlapAdd (me); } }
autoSound Spectrogram_to_Sound (Spectrogram me, double fsamp) { try { double dt = 1 / fsamp; long n = (long) floor ((my xmax - my xmin) / dt); if (n < 0) return autoSound (); autoSound thee = Sound_create (1, my xmin, my xmax, n, dt, 0.5 * dt); for (long i = 1; i <= n; i ++) { double t = Sampled_indexToX (thee.peek(), i); double rframe = Sampled_xToIndex (me, t), phase, value = 0.0; long leftFrame, rightFrame; if (rframe < 1 || rframe >= my nx) continue; leftFrame = (long) floor (rframe), rightFrame = leftFrame + 1, phase = rframe - leftFrame; for (long j = 1; j <= my ny; j ++) { double f = Matrix_rowToY (me, j); double power = my z [j] [leftFrame] * (1 - phase) + my z [j] [rightFrame] * phase; value += sqrt (power) * sin (2 * NUMpi * f * t); } thy z [1] [i] = value; } return thee; } catch (MelderError) { Melder_throw (me, U": not converted to Sound."); } }