Time Manipulation — User Guide

Pitch-preserving PSOLA time scaling with optional cascaded low-pass spectral blur and a mono-to-stereo widening stage based on channel filtering plus a delayed right channel.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.9.1 (2026) License: MIT License Repo: GitHub
Contents:

What this does

Time Manipulation first converts the selected Sound to a mono processing copy, then changes its duration with Praat Manipulation and a constant DurationTier. Optional filtering can progressively darken the result, and the stereo-width stage can create a new two-channel output from the processed mono signal.

selected Sound
→ mono processing copy
→ PSOLA / DurationTier time scaling
→ optional high-pass + low-pass + cascaded low-pass blur
→ optional pseudo-stereo:
     L = filtered body
     R = differently filtered body + leading delay
→ target peak 0.99
The original Sound object is not modified. Stereo and multichannel inputs are folded to mono before processing; any final stereo image is generated by this script rather than preserved from the source.

Quick start

  1. Select exactly one Sound object.
  2. Run Time_Manipulation.praat.
  3. Choose Custom or one of the six named presets.
  4. Set Duration_factor: values above 1 lengthen the sound; values below 1 shorten it.
  5. Use Blur_amount and the filter cutoffs to control spectral darkening.
  6. Enable Create_stereo_width to create the delayed/filter-differentiated stereo result.
  7. Set Min_pitch and Max_pitch for Praat's Manipulation analysis.
  8. Run. The result is named <source>_stretched_<factor>x.

Pitch-preserving time scaling

The main duration transformation uses:

To Manipulation:
    time step = 0.01
    minimum pitch = Min_pitch
    maximum pitch = effective Max_pitch

Create DurationTier
Add point at start: Duration_factor
Add point at end:   Duration_factor
Replace duration tier
Get resynthesis (overlap-add)

The effective upper pitch limit is:

safeMaxPitch =
    min(
      Max_pitch,
      0.45 × sampleRate
    )

Duration_factor is a relative duration factor:

FactorBehavior
< 1Shorter output; faster temporal progression.
1Nominal original duration.
> 1Longer output; slower temporal progression.

The transformation is intended to alter duration while retaining the pitch contour through Praat's Manipulation resynthesis rather than by changing playback sample rate.

Spectral blur

Blur is enabled whenever Blur_amount > 0. The number of additional blur passes is:

blurPasses =
    floor(Blur_amount)

Initial band limiting

The stretched signal first passes through:

  1. a Hann-band high-pass from effectiveHighpass upward;
  2. a Hann-band low-pass from 0 to effectiveLowpass.

The effective low-pass is Nyquist-safe:

effectiveLowpass =
    min(
      Lowpass_frequency,
      0.49 × sampleRate
    )

Cascaded low-pass passes

Each additional pass lowers the cutoff according to:

passCutoff =
    effectiveLowpass
    × (1 - 0.15 × passIndex)

The cutoff is not allowed to fall below:

cutoffFloor =
    min(
      effectiveLowpass,
      effectiveHighpass + 100
    )
Blur_amount therefore controls the number of cascaded low-pass stages. It is not a spectral averaging, FFT-smearing, or phase-randomization process.

Stereo width stage

When Create_stereo_width is enabled, the processed mono Sound is copied into independent left and right branches.

Channel filtering

If Stereo_detune_amount is positive, it changes the low-pass cutoff differently on the two sides:

leftCutoff =
    effectiveLowpass
    × (1 - 0.10 × Stereo_detune_amount)

rightCutoff =
    effectiveLowpass
    × (1 + 0.05 × Stereo_detune_amount)

The cutoffs are constrained against the high-pass boundary and the Nyquist-safe ceiling.

Despite its name, Stereo_detune_amount does not transpose or detune pitch. It controls the L/R difference in filtering.

Right-channel delay

The right channel receives actual leading silence:

delay =
    Stereo_delay_ms / 1000

R =
    silence(delay)
    + rightBody

The left channel is padded with trailing silence to the same duration. L and R are then explicitly combined in that order.

This creates a delay/filter-based pseudo-stereo field. It is not panning, chorus modulation, or preservation of the source stereo image.

Presets

PresetDurationBlurOther overrides
Normal Speed1.0×0Stereo width off.
Slow Motion1.5×1Low-pass 10 kHz.
Time Lapse0.75×0Stereo width off.
Ambient Stretch2.0×3Low-pass 7 kHz; stereo width on.
Paulstretch-like4.0×5Low-pass 6 kHz; stereo width on.
Extreme Drone8.0×7Low-pass 5 kHz; high-pass 100 Hz; stereo width on; delay 25 ms.

Named presets overwrite only the fields explicitly listed by the script. Unspecified controls retain the values entered in the form. In particular, Slow Motion does not explicitly change Create_stereo_width, Stereo_delay_ms, Stereo_detune_amount, the PSOLA pitch range, visualization, or playback.

Parameters

ParameterDefaultExact role
PresetCustomCustom plus six named configurations.
Duration_factor4.0Constant relative-duration factor written into the DurationTier; must be greater than zero.
Blur_amount3Positive field; floor(value) gives the number of cascaded low-pass passes. Blur is active whenever the value is above zero.
Lowpass_frequency8000 HzUpper spectral boundary, capped internally at 0.49 × sample rate.
Highpass_frequency80 HzLower spectral boundary when blur is active.
Create_stereo_widthOnCreate new stereo from the mono processed signal.
Stereo_delay_ms15 msLeading delay added to the right channel.
Stereo_detune_amount0.5Controls asymmetric L/R low-pass cutoffs; it does not alter pitch.
Min_pitch75 HzLower Manipulation pitch-analysis bound.
Max_pitch600 HzUpper bound, additionally capped at 45% of sample rate.
Draw_visualizationOnDraw waveform, spectrogram and processing summary views.
Play_resultOnPlay the completed output.

Min_pitch must be lower than the effective Max_pitch. When blur is active, Highpass_frequency must be below the effective low-pass/Nyquist limit.

Channels, duration & sample rate

Input channels

Every multichannel input is converted to mono before time scaling. A mono source is copied directly into the private processing object.

Output channels

Duration

Before stereo widening, the PSOLA result is approximately the source duration multiplied by Duration_factor. When stereo widening is enabled, the delayed right channel extends the final object by approximately Stereo_delay_ms, and the left side is padded to match it.

Sample rate

The source sample rate is preserved throughout the process.

Final level

After the final mono or stereo object has been created, the script measures its Sinc70 absolute extremum. Every non-silent result receives:

Scale peak: 0.99

This is target peak normalization, so a quiet non-zero result can be amplified as well as attenuated. Digital silence is left unchanged.

Visualization

When enabled, the Picture view contains:

  1. Title: source, preset and Duration_factor.
  2. Original waveform.
  3. Result waveform.
  4. Original spectrogram.
  5. Result spectrogram.
  6. Stats line: factor, blur amount, stereo setting and source→result duration.

Waveform scaling

The original and result waveforms are drawn independently with Praat's automatic amplitude range. They are not a shared-amplitude-scale comparison.

Spectrograms

For visualization only, multichannel original/result Sounds are converted to mono display copies before spectrogram analysis. The frequency ceiling is:

min(
  5000 Hz,
  0.49 × sampleRate
)

Spectrogram settings are 30 ms analysis window, 10 ms time step, 20 Hz frequency step, and a Gaussian window.

Output behavior