A more systematic approach to artificial Wow & Flutter
I came across this old thread while experimenting with artificial Wow & Flutter, and I thought I would add some results from a more systematic approach.
Rather than processing the audio directly, I am currently experimenting with Audacity’s Time Track as the underlying representation of tape-speed variation. This seems particularly useful for modelling Wow & Flutter because the speed curve can be kept separate from the audio and applied non-destructively.
For example, I am experimenting with a combination of:
- slow Wow (LFO): e.g. a sinusoidal modulation with a period of several seconds
- faster Flutter (MFO): e.g. around 1 Hz with a much smaller amplitude
- amplitudes specified as percentages of nominal speed
- optionally adding the two modulations as one combined speed function
A useful detail is that a ±3% speed modulation already corresponds to roughly +51 / −53 cents of instantaneous pitch deviation if pitch compensation is not used. So even apparently small speed variations can produce quite substantial pitch modulation.
I have also been testing Sliding Stretch / Pitch Compensation with synthetic reference signals (50 Hz, 100 Hz and 44.1 Hz sine/triangle waves). These make phase and boundary effects much easier to see than music recordings.
One interesting observation is that symmetric Sliding Stretch curves such as
-5% → +5%
can preserve the overall duration very well. However, I have also observed distortions near the boundaries of the processed region. In some tests the last part of a periodic waveform no longer follows the expected waveform shape, even though the total number of samples remains correct. This seems worth investigating separately from the mathematical time-warp itself, possibly in relation to the analysis/synthesis windows and overlap used by the stretching algorithm.
This also makes me think that a useful implementation should process a little context/guard material before and after the actual region of interest, and only retain the central part afterwards. For non-periodic audio, relying on zero crossings obviously isn’t robust, so a more general continuity/crossfade strategy would be needed.
Generating Time Tracks programmatically
This brings me back to an older question in this forum:
Generate Time Track with Nyquist or Python
The situation still seems to be essentially the same: there is no normal Time Track import/export facility, and Nyquist cannot directly create or modify Time Track control points. The SetEnvelope scripting command applies to audio-track envelopes, but not to the Time Track.
I found, however, that the Time Track data is stored in the Audacity project itself. In older .aup projects it appears directly as XML <timetrack> / <controlpoint> data; current .aup3 projects store the corresponding project information inside the SQLite-based project file.
This suggests a possible practical workaround: generate an AUP3 project containing a ready-made Time Track from Python, rather than trying to draw the curve manually in Audacity.
The generator could take parameters such as:
Wow period: 10.0 s
Wow amplitude: 3.0 %
Flutter frequency: 1.0 Hz
Flutter amplitude: 0.3 %
phase: 0°
and generate the corresponding (time, speed) control points.
This could also make it possible to experiment systematically with different curve densities, interpolation modes, sample rates and modulation frequencies.
Possible feature request
I think a native Time Track import/export API would be very useful. Ideally it would include:
- import/export of
(time, speed) control points
- access to Time Track envelopes from Nyquist/Python scripting
- setting the lower/upper display range
- selecting linear/logarithmic interpolation
This would make Time Tracks much more useful for reproducible experiments, tape-speed simulation, Wow & Flutter modelling, and other forms of non-destructive time warping.
I would be interested to hear whether there is already a feature request or issue for this, or whether there is a preferred way to implement such functionality in current Audacity 3.7.8.