Breathing Pitch Waves — User Guide

Pitch-contour modulation for voiced material using a compound breathing-wave controller, stochastic flutter and gasp components, an increasing drive envelope, and bounded semitone displacement.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.6.1 (2026) License: MIT License Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

What this does

Breathing Pitch Waves analyzes the source pitch contour, builds a new target contour at a fixed 100 Hz control rate, and resynthesizes the sound with Praat Manipulation. The generated semitone displacement combines several periodic components with stochastic amplitude variation, then passes the sum through a tanh limiter so the requested pitch depth is a true maximum displacement.

The generated displacement is applied to the detected source F0 at each control time. The original melody or intonation therefore remains the reference contour; the script does not replace the entire file with a contour around one median pitch.

Input scope: The effect requires usable periodic/voiced material. Pitch analysis is performed with Praat To Pitch. If no usable pitch is detected, the script stops instead of creating an arbitrary target pitch.
Random variation: The flutter and gasp terms call randomUniform() while the control curve is built. There is no random-seed parameter, so repeated runs with the same settings can produce different modulation details.

Quick start

  1. Select exactly one Sound object.
  2. Run Breathing_Pitch_Waves.praat.
  3. Choose Manual or one of the seven built-in presets.
  4. For Manual mode, set Breath_rate, Pitch_depth_semitones, Micro_flutter, and Emotional_intensity.
  5. Set Time_step, Minimum_pitch, and Maximum_pitch for pitch analysis.
  6. Choose the Output_sample_rate and whether to draw the visualization and play the result.
  7. Click OK. The final Sound is named <source>_breathing.

Presets

Presets override only the four modulation controls shown below. Pitch-analysis settings, output sample rate, visualization, and playback remain at the values entered in the form.

PresetBreath rateDepthMicro flutterEmotional intensity
Gentle Breath0.20 Hz8 st1.01.2
Emotional Swell0.25 Hz15 st2.02.0
Dramatic Breath0.35 Hz24 st5.03.0
Panic Breathing0.80 Hz36 st8.04.0
Subtle Tremor0.15 Hz6 st3.00.8
Deep Meditation0.10 Hz4 st0.50.5
Intense Gasping0.50 Hz30 st6.03.5

Parameters

Modulation

ParameterDefaultBehavior
PresetManualManual plus seven built-in modulation presets.
Breath_rate0.3 HzBase phase rate in cycles per second. It also scales the phase rates of the flutter, tremor, and gasp components.
Pitch_depth_semitones18 stMaximum absolute semitone displacement. Values are clamped internally to 0–48.
Micro_flutter4Scales the two high-rate stochastic flutter components. Values are clamped to 0–20.
Emotional_intensity2.5Controls the time-varying drive applied before tanh. Values are clamped to 0–10.

Pitch analysis

ParameterDefaultBehavior
Time_step0.005 sTime step passed to Praat To Pitch. This is separate from the fixed 10 ms modulation-control step.
Minimum_pitch50 HzLower bound for pitch analysis and for the generated target F0.
Maximum_pitch900 HzUpper bound for pitch analysis and for the generated target F0. It must be greater than Minimum_pitch.

Output

ParameterDefaultBehavior
Output_sample_rate44100 HzIf different from the source rate, the completed result is resampled with precision 50.
Draw_visualizationYesDraw the source/result waveforms, modulation curve, component description, run statistics, and summary strip.
Play_resultYesPlay the final Sound after processing.

Modulation controller

The controller is evaluated every 10 ms. For each control time t:

phase = (t - xmin) × 2π × Breath_rate breath_fundamental = sin(phase)^3 breath_harmonic = 0.6 × sin(2 × phase)^5 breath_subharmonic = 0.3 × (sin(0.5 × phase)^2 - 0.5) breath_curve = fundamental + harmonic + subharmonic flutter = Micro_flutter × 0.15 × [sin(12 × phase) × U(0.6,1.4) + 0.5 × sin(23.7 × phase) × U(0.8,1.2)] tremor = 0.8 × sin(7.3 × phase) × cos(2.1 × phase) gasp = 3 × [sin(3 × phase)^8 - 35/128] × U(0.5,1.5) emotional_drive = 1 + Emotional_intensity × time_factor^1.5 bounded_motion = tanh((breath_curve + flutter + tremor + gasp) × emotional_drive) total_shift = Pitch_depth_semitones × bounded_motion

Because tanh() stays within −1…+1, Pitch_depth_semitones bounds the requested displacement. The subsequent F0 clamp can reduce the realized displacement when the shifted target would fall outside the selected pitch range.

Processing pipeline

  1. Pitch-analysis reference: a multichannel source is converted to mono for analysis only; a mono source is copied. To Pitch uses the form's time step and pitch bounds.
  2. Detection check: the median detected F0 is queried only to verify/report usable pitch. It is not used as the synthesis reference.
  3. Control grid: the modulation contour is evaluated at a fixed 0.01 s step across the full duration. The number of control points is ceiling(duration / 0.01) + 1, with a minimum of two points.
  4. Source-contour modulation: at each control time, the detected source F0 is read by linear interpolation and multiplied by 2^(total_shift/12). The target is then clipped to the minimum/maximum pitch range.
  5. Per-channel resynthesis: each original channel receives its own Manipulation object. The same generated target PitchTier is inserted into every channel, and each channel is resynthesized with Get resynthesis (overlap-add).
  6. Rebuild: the resynthesized channels are written back into an N-channel Sound with the original time domain and original sampling rate.
  7. Optional resampling: if requested, the complete result is resampled to Output_sample_rate with precision 50.
  8. Peak safety: if the final absolute peak exceeds 0.95, Scale peak: 0.95 attenuates it. Quieter results are not boosted.

Channels & output

Visualization

When Draw_visualization is enabled, the script draws one Picture page with:

Display scaling: the original and result waveform panels are auto-scaled independently, so their plotted heights should not be used as a direct amplitude comparison. The modulation curve is display-decimated deterministically to at most 500 stored points; the DSP uses the full 100 Hz control grid.

Notes & troubleshooting

No usable pitch detected: choose material with voiced/periodic content and set Minimum_pitch and Maximum_pitch so they bracket the source F0. The script stops if the analysis contains no usable pitch.
Requested depth seems smaller: the semitone controller is bounded by the requested depth, but the final target F0 is also clipped to the analysis pitch range. A narrow pitch range can therefore limit the realized shift.
Different result on another run: stochastic amplitudes are generated for flutter and gasp at control points, and no random seed is exposed in the form.