Digitizing Tapes

Hi all,

Thought I would start a thread to discuss problems and solutions relating to digitizing and restoring recordings from old tapes.

The way I see it, most important is, get a tape player that is “easy” on the old, fragile tapes.
Most cheaper units of today are like using a sledge hammer to drive in a drawing pin and also add to wow & flutter.
Recommendations as regards makes and models are welcome.
(Hope the mods don’t mind recommendations about commercial products, in this case, tape players).

The biggest problems with old, worn out tapes are:

  • wow and flutter.
  • generally playing too slow (normally, as opposed to playing too fast).
  • drop-outs.
  • bad frequency response and/or dynamics.
  • stretched sections.

As to the first two, there are commercial programs available, but they cost a fortune.
(I do have access to Izotope, but in the spirit of open source, other possibilities/software options should be explored).

I have come across a Nyquist script (note, it’s version 1, still uses “s” versus track), that can analyze
wow and flutter but, it requires one to record a 3KHz “pilot tone” first.
This is not always an option.

Plugin written by Paul Schimmel, no not me, another Paul.

;nyquist plug-in
;version 1
;type analyze
;name "Wow and Flutter Visualiser..."
;action "Processing..."
;info "by Paul Schimmel"

; 3kHz BP filter
(setf s (bandpass2 s 3000 2))
; find average, use max 10s to avoid blow up, then scale and limit
(setf s (clip(scale (/ 5 (snd-fetch(snd-avg s (snd-length s 441000) (snd-length s 441000) OP-PEAK)) ) s)1))
; differentiate, rectify
(setf s (s-abs (diff  (feedback-delay s (/ 1 *sound-srate*)0) s )))
; calculate average offset, use max 10s to avoid blow up
(setf offset (snd-fetch(snd-avg s (snd-length s 441000) (snd-length s 441000) OP-AVERAGE)))
; remove offset, 60 Hz lowpass filter, scale output 1 = 1% peak
(scale 365 (lowpass8 (diff s offset) 60))

The other problem of playing too slow, that is quite easily corrected, either by using the “Change Speed”
effect in Audacity if it’s constant or, using a time track to make adjustments for the duration of the audio.

To correct drop-outs, there are several options, ranging from just cutting out the bad sections, to duplicating
a section of one track for the other.
Each situation will be different.

For stretched tapes (or sections of it), doubt there are any solutions.

As for frequency response and dynamics, eq, gain and compression can go a long way.

Any thoughts/suggests/tips, etc are most welcome.

To add to the above, since tape recordings (and erasing), use a high frequency signal anywhere in the region of 40 - 100 KHz, wondering if
an external hardware 20 KHz LPF connected in series with the players output, before going into the line-in of the sound card would have any
Such as reducing possible aliasing and generally make the ADC’s life easier by removing any frequencies that are not need anyways.
The website link below, shows the freq response of some better known tape players/deck:

The high end limit of tapes is lower than 20KHz, so the filter could start cutting off from around 16 KHz or so.

Maybe something like this:

(RL is the load impedance of the sound card input, normally around 10K ohm).
(The 3.3uF caps are DC blocking as some cheaper players/decks have a DC offset on the headphone
jack and when used as a feed for the sound card, this DC will cause problems).

The manual has this useful page (which I recently transferred from the Wiki)

And this tutorial set:

And this suggested workflow:

When I transcribed my tapes (some years ago now) I had my trusty old Nakamichi BX-2 professionally serviced by Bowers&Wilkins. I connected it to my PC via an Edirol UA-1EX external USB soundcard. The tapes were all TDK-SA which is what the Nak was set up for, OOTB factory settings. The results were excellent.


Not easy to work out what exactly that code is doing, but it’s a clever way to extract the wow and flutter.

It performs FM Demodulation by comparing the audio (band-passed at 3000 Hz), with a copy of itself delayed by one sample. For any constant frequency sine tone, that returns a low level sine tone at the same frequency, but for a frequency modulated sine tone the result creates a weakly AM sine tone, from which the modulation signal can be extracts.

It would actually have been better for the signal to have been delayed by 1/4 of the wavelength of the carrier frequency (1 / (4 * 3000)) and then multiplied by the original signal to create a Quadrature detector, but nevertheless it still produces a demodulated signal (though with an unfortunate glitch at the start).

Ignoring the bandpass pre-filtering, and updating to ;version 4 syntax

(setf cf 3000)

; 'trim' may be adjusted experimentally to achieve the
; desied scaling, for example to map +/-1% to full scale.
(setf trim 4.0)

; scale according to 'trim' factor.
(let* ((10s (truncate (* *sound-srate* 10)))
       (peak (peak *track* 10s)))
  (setf *track* (scale (/ trim peak) *track*)))

; Quadrature detector
(let ((delay (feedback-delay *track* (/ (* cf 4.0)) 0)))
  (setf *track* (mult *track* delay))
  (lowpass8 *track* 60))

or to wrap it into an easy to use function that can also be used with stereo tracks:

(defun fm-demod (sig cf &optional (gain 4) (cutoff 60))
  ; normalize according to 'gain' factor.
  (let ((peak (peak sig 100000)))
    (setf sig (scale (/ gain peak) sig)))
  ; Quadrature detector
  (let ((delay (feedback-delay sig (/ (* cf 4.0)) 0)))
    (setf sig (mult sig delay))
    (lowpass8 sig cutoff)))

(multichan-expand #'fm-demod *track* 3000)

Probably not. The sound card will automatically limit the frequency range to a bit below half the sample rate, and some good sound cards limit to around 20 kHz even at high sample rates.

It would only be beneficial when using a sound card that has an extended high frequency response at a high sample rate, but then there is no point using a high sample rate as you will be filtering out the only “benefit” that a high sample rate provides.

Thank you Peter and Steve for your comments and input.

The Nakamichi decks are wonderful machines, alas not easily available any more and those that are,
probably need lots of TLC before they function anywhere as well as they once used to.

Steve, you code looks very interesting, going to give it a spin.
It would be great to come up with a plugin that does not need a tone first and does an OK job
of removing at least a bit of the wow and flutter.

An idea, what if the mains frequency was used as a reference?
I’m prepared to bet that either via direct pick-up or cables (or both), most tape recordings will
contain mains frequency at either 50 or 60 Hz, depending on country.
If a copy of the recording (on a separate track) were to be sharply bandpass filtered, then analyzed
for any deviation, that could give some indication of how “off” the tape speed was.
By tracking changes, a correction or series of corrections could be applied.
Of course, any music that contained those frequencies would mask the mains frequency, but could still work
to a degree, just use the filtered music as the reference.
What do you think? Feasible?

As for the external filter, you are correct about the better quality ones having good filters.
Just wondering about the “dime a dozen” variety that many people have.

although it is also likely that there will be some mains hum from the tape machine even without a tape. I don’t know how you could separate any mains hum on the tape, from mains hum from the playback machine.

Theoretically you could use the AC bias frequency if present on the tape, but that’s unlikely on old tapes.

Even the cheap PCM1808 or ADAU7002 (well under $1 bulk price) have effective anti-aliasing filters. For anything cheaper than that, wow and flutter will be the least of your problems :wink:

Steve wrote:

although it is also likely that there will be some mains hum from the tape machine even without a tape.

A very valid point, how about using a portable (battery powered) unit or “ghetto blaster” or “boom boxes” as they are also known?
Just googled, surprisingly, they are still being produced.

Theoretically you could use the AC bias frequency if present on the tape, but that’s unlikely on old tapes.

AC bias frequency is normally between 40 - 120 KHz, so this presents two challenges:

  • on old tapes, it would be severely attenuated, lots of gain after a BPF may help, but…
  • the ADC would need quite a high sampling rate, cards that support 192KHz and higher tend to cost a lot.

Steve wrote:

For anything cheaper than that, wow and flutter will be the least of your problems > :wink:

Very true. :laughing:

Glad to see that even the cheapest ADC’s have a filter.

Yepper - mine had a whole new set of belts as well as other finaighling from B&W :ugeek:

But better than when I self-maintained my TT and used alcoholic spirit to clean the stylus on my trusty V15-III cart - in the process removing the stylus from the cantilever - OOPS. The repair would’ve cost a lot more than a decent replacement cart :blush:


I am working on digitizing some old reel-to-reel tapes and encountered exactly the issues mentioned in this thread - particularly tapes playing too slow, and more particularly, playing at an inconsistent speed. I managed to more or less fix these issues manually with a time track, but it seems like it would be possible to automate using a plugin.

I’ve been reading up on Nyquist programming in order to use the 60 Hz background hum to correct for tape speed fluctuation:

  1. Identify the peak frequency in the range of 40 - 80 Hz (or in the case of 50 Hz countries, 30 - 70 Hz)
  2. Time stretch the sample on a continuum to keep the peak frequency at 60 Hz

I could not find anything that did this sort of variable time stretch / dilation based on an internal reference frequency. Any pointers or help would be appreciated.

Neither can I, other than a very expensive commercial app.

Theoretically that is possible, though not necessarily practically. The (very) hard part is measuring the frequency accurately enough, which requires being able to isolate the tone that you are trying to track.

The level of the hum is likely to be very low, the amount of noise is likely to be relatively high, and the pitch variation is likely to be very small. All three of these factors increases the difficulty. Developing a plug-in to do this is likely to be very difficult, and I expect the chance of success to be small. Of course if it was easy, then the effect would be commonplace :wink:

Thank you Steve for your response.

If I had more than a few tapes to digitize, I might invest the time to try to get a working prototype. For now, though, I will continue to normalize speed manually via time tracks.


No problem.
It would have been an interesting, but very big project, and as I wrote; no guarantee that it will work adequately at the end of it.