Time-Varying PSOLA Vibrato — User Guide

Per-channel PSOLA vibrato whose rate and depth evolve linearly across the Sound. The changing rate is integrated to phase, so acceleration and deceleration remain phase-continuous.

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

What this does

Time-Varying PSOLA Vibrato modifies the pitch contour of the selected Sound so that vibrato rate and vibrato depth can each move from a start value to an end value across the complete source duration. Rate and depth evolve independently and linearly, enabling acceleration, deceleration, depth swells, depth fades, or combinations of these movements.

The processing is performed with Praat Manipulation and PitchTier objects. Each input channel is analyzed and resynthesized separately, so mono, stereo, and multichannel layouts are preserved.

Legacy filename: the script file is named Time_Varying_Spectral_Vibrato.praat, but v0.5 performs no spectral analysis. The active algorithm is PSOLA/PitchTier pitch modification.

Processing pipeline

Signal flow

Selected Sound → validate preset and parameters → derive adaptive pitch-analysis bounds → extract each channel independently → To Manipulation → Extract PitchTier → multiply PitchTier by time-varying vibrato ratio → Replace PitchTier → Get resynthesis (overlap-add) → recombine processed channels → optional Dry/Wet mix with original → attenuation-only Safety Peak → optional visualization and playback

The pitch modification is calculated from local source time, τ = x − sourceStart. Moving an otherwise identical Sound to a different Praat start time therefore does not change the vibrato trajectory.

Rate & depth evolution

Both controls are linear functions of local time over the complete Sound duration T.

rateSlope = (EndRate − StartRate) / T rate(τ) = StartRate + rateSlope × τ depthSlope = (EndDepth − StartDepth) / T depth(τ) = StartDepth + depthSlope × τ

Integrated phase

Because rate can change continuously, phase is not calculated as 2π × rate(τ) × τ. Instead, v0.5 integrates the linear rate trajectory:

phase(τ) = 2π × [ StartRate × τ + 0.5 × rateSlope × τ² ]

This gives a phase-continuous oscillation whose instantaneous rate is the specified linear rate curve.

Pitch deviation in semitones

deviation_ST(τ) = depth(τ) × sin(phase(τ)) pitchRatio(τ) = 2 ^ [ deviation_ST(τ) / 12 ]

The PitchTier frequency value at each time is multiplied by this ratio. A positive deviation raises the tracked pitch and a negative deviation lowers it by the corresponding equal-tempered semitone amount.

PSOLA / PitchTier processing

Each mono channel is converted to a Praat Manipulation object with a 10 ms time step. The script extracts its PitchTier, applies the vibrato ratio directly to the tier, replaces the modified tier in the Manipulation object, and obtains the result with overlap-add resynthesis.

To Manipulation: 0.01, pitchFloor, pitchCeiling Extract pitch tier PitchTier := PitchTier × pitchRatio(time) Replace pitch tier Get resynthesis (overlap-add)

Adaptive pitch-analysis bounds

The normal analysis floor is 75 Hz. The ceiling is:

pitchCeiling = min(600 Hz, 0.40 × sampleRate)

At low sample rates, if that ceiling becomes too close to 75 Hz, the floor is reduced to maintain a usable analysis range:

pitchFloor = max(20 Hz, pitchCeiling / 3)

This keeps the requested pitch-analysis band safely below Nyquist while retaining the original 75–600 Hz range when the sample rate permits it.

Presets

PresetRate evolutionDepth evolution
Custom4.0 → 8.0 Hz by default0.1 → 0.1 st by default
Ramp Up (Accelerating)2.0 → 10.0 Hz0.2 → 0.2 st
Slow Down (Decelerating)12.0 → 0.5 Hz0.3 → 0.5 st
Swell (Fade-In Depth)5.0 → 5.0 Hz0.0 → 1.0 st
Fade Out (Dying Wobble)6.0 → 3.0 Hz0.5 → 0.0 st
Nervous Shiver (Fast & Shallow)8.0 → 12.0 Hz0.1 → 0.1 st
Opera Finale (Wide & Slowing)5.5 → 4.0 Hz0.3 → 1.5 st

Parameters

ParameterDefaultMeaningRuntime handling
Start Rate Hz4.0Vibrato rate at the beginning of the Sound.Clamped to 0…50 Hz.
End Rate Hz8.0Vibrato rate at the end of the Sound.Clamped to 0…50 Hz.
Start Depth ST0.1Peak vibrato depth at the beginning.Clamped to 0…24 semitones.
End Depth ST0.1Peak vibrato depth at the end.Clamped to 0…24 semitones.
Dry/Wet percent100Linear blend between original and PSOLA-processed result.Clamped to 0…100%.
Safety peak0.99Maximum allowed peak after active processing.Clamped to 0…1; 0 disables safety; attenuation only.
Draw visualizationyesDraws the AudioTools figure.Does not alter audio.
Play resultyesPlays the completed Sound.Does not alter audio.
The current v0.5 limits are substantially wider than the legacy HTML: rate values can reach 50 Hz and depth values can reach 24 semitones.

Channels & output

Every input channel is processed independently through its own Manipulation/PitchTier analysis and resynthesis. No mono fold-down is used and no audio is cross-fed between channels.

PropertyBehavior
MonoProcessed as one channel and returned as mono.
Stereo / multichannelEach channel is processed independently and the original channel count is restored.
Sample ratePreserved.
Duration / sample gridResynthesis follows the original Sound time domain.
Start timePreserved; vibrato calculations use local time.
RandomnessNone.

Dry/Wet

output = Wet × processed + Dry × original

At 100% the result is the PSOLA-resynthesized signal. At intermediate values, it is linearly mixed with the corresponding original channel.

Exact bypass

The script copies the source without PSOLA processing when Dry/Wet = 0% or when both Start Depth and End Depth are 0 semitones. Safety Peak is skipped on this bypass path.

Safety Peak

For active processing, the output peak is measured after Dry/Wet mixing. Only if that peak exceeds Safety Peak is the complete result scaled down. Quiet material is never raised.

Visualization

v0.5 uses the standardized AudioTools layout:

Input

Original waveform.

Output

Final waveform after Dry/Wet and any required safety attenuation.

Rate evolution

The linear Start Rate → End Rate trajectory, with start/end labels.

Depth evolution

The linear Start Depth → End Depth trajectory in semitones.

Pitch-deviation trajectory

A full-width panel plots the actual mathematical vibrato deviation

depth(τ) × sin[2π(StartRate×τ + 0.5×rateSlope×τ²)]

in semitones over the complete Sound. The drawing uses 500 points; this is a visualization of the control law, not the temporal resolution of the PitchTier itself.

Summary

The bottom strip reports rate evolution, depth evolution, Wet percentage, duration, channel count, and final peak.