Artificial wow and flutter

Good day

I know that there is a software that can remove wow and flutter from samples recorded from a tape or vinyl (for example Capstan). But I wonder whether there is a software that, conversely, can create artificial wow and flutter (I really need that for some sound processing). I don’t think it’s possible with Audacity, but probably you could give me an advise of other ways to do it.

Thanks

How about adding a Time Track, and give it a wiggly envelope? (see: http://manual.audacityteam.org/o/man/time_tracks.html)

Thanks, that’s a good idea. But the only thing is that if I have even a 5 minute record and the flutter should be about 20 Hz then I have to manually envelope all time track every 0,2 second which is really boring. Is there a way of using preloaded patterns for time tracks?

Try pasting this code into the Nyquist Prompt effect and applying it:

;; speed is in rpm
(setf depth 0.004)
(setf speed 45)
(multichan-expand #'snd-tapv *track* 0 (mult depth (sum 1 (hzosc (/ speed 60.0)))) 2)

It says “Nyquist returned the value: 45”. Nyquist output is as follows:

error: unbound variable - *
if continued: try evaluating symbol again
1>

Sorry, it says “unbound variable - TRACK”, not “*”

Assuming that you are using the current Audacity version 2.1.1, ensure that “Use legacy (version 3) syntax” is not selected (see http://manual.audacityteam.org/o/man/nyquist_prompt.html)

(The current version of Audacity is available here: http://web.audacityteam.org/download/)

Your “Tremolo/Vibrato” plug-in will do that (on vibrato), but has the added advantage that users can select to have the rate gradually change over time.

Unfortunately the “Tremolo/Vibrato” plug-in is not suitable for long sections of audio because cumulative rounding errors (it’s only 32 bit) cause the sound quality to deteriorate when applied to selections much more than a few tens of seconds.

And in the following code:

;; speed is in rpm
(setf depth 0.004)
(setf speed 45)
(multichan-expand #'snd-tapv *track* 0 (mult depth (sum 1 (hzosc (/ speed 60.0)))) 2)

by which parameters can I change the frequency and intensity of flutter?

(setf depth 0.004)
That’s the "intensity. Larger values for more intensity.

(setf speed 45)
That’s the “frequency”. Larger values for increased frequency.

Note that increasing the frequency will also increase the perceived intensity (because the amount of variation is an absolute amount of time per cycle, so when spread over a longer period it becomes less significant).

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.

Looking at Audacity 4.0 beta, it seems that Time Tracks no longer exist - the feature has been removed.

If I were asked to do this, I would start with auto-ducking to an intermittent sound source track (maybe occasional speech), then mix and render to a new track and delete the two old tracks. This might provide the wow without manually enveloping the whole track.

From there, I am not sure how to simulate the flutter.