In my time at the ELAK, one of the first themes I brought to discussion in class was the transformation 'tempo'. The simplest thing in the world, known since the beginnings of sound recording and frequently applied, with the record as with the audiotape: One plays back a recorded sound faster or slower, thereby changing its duration, rhythmic structure, as well as its pitch. (Several other, not so unimportant aspects will also be changed as a result – but more about that another time).
It is a fundamental method that has become a vital part of the technical repertoire of electroacoustics (even if it has sometimes been supplanted by apparently sophisticated effects, which more accommodate conservative musical thinking).
This method thus had a prominent status in VASP and AMP right from the start. Only the perspective is always a different one. In VASP there is the command stretch – the stretching or clinching of a predetermined sound stored in a register (buffer).
In AMP, by contrast, there is a variable speed when scanning the sound files on an input channel 'varispeed', which is available as parameter .vsp in the sequencer. More still: This tempo factor, as with all other parameters as well, is controllable and can be modulated by wave forms of generators or other inputs (from tempo glissando to scratching).
What is new is a system of methods for certain applications, one of which I would like to particularly emphasize, because it is astoundingly simple: pack.
If one would like to execute large tempo transpositions upwards (speedups), one of the most radical means of doing this is to simply allow the corresponding number of samples to be dropped, that is, only using each 100th sample, for instance. Audio engineers would probably smash their hands together over their heads: on a half-way clean recording that does not contain any extreme low frequencies, nothing at all should be able to be heard below 10kHz. The rest is merely aliasing!
And that’s the way it is, too, only these mirror frequencies (aliasing) are so diverse that they take on a character of their own.
The range of 0-220 Hz is retained (it becomes 0-22 Hz)
220-440 Hz will be mirrored downwards
440-660 Hz will again be mirrored upwards
660-880 Hz will again be mirrored downwards
and so on...

One can speak of a 'frequency folding' in which all frequencies are retained in any one of these numerous mirrorings – and, consequently, the spectral density as well.
In the Eighties I produced such frequency foldings with analogue means – in hours-long work with the frequency shifter and umpteen intermediate copies (>> STYX). With this simple digital method we receive this, so to say, free as an encore ...

Here, as an example:


That is the minuet from Mozart’s Jupiter Symphony, speeded up 128-fold through packing. The packing can be directly implemented in VASP during the loading of the sound files:

sfload menuett.wav (pack=128)

Naturally, there are also optional filterings, in case one would like to avoid aliasing. In AMP, the smoothing and anti-alias filters are executed in such a way that they also optimally follow rapid parameter changes.

A second example:


A low-frequency generator will be used here to control the varispeed. The sound file at the input will be, so to say, scratched at a point, while the point slowly moves on. In the AMP script it looks like this:

i1=menuett.wav (s)
k1=noise.band (m)
out=menuett_scratch.wav (s,*i1)
dur: 20
i1.pos: 11
i1.vsp: 0.1 (c=k1,cm=lin,ca=1)
k1.lower: 2
k1.upper: 5

The sound file will be addressed to input 1 (stereo). At the beginning it receives a positioning at second 11 (i1.pos); its varispeed (i1.vsp) is set to 0.1, meaning 1/10 of the original speed, but will also be overlaid (controlled) by the output of the core object 1 (control-mode linear, control-amplitude 1), therefore fluctuating between -0.9 and 1.1.
A generator that creates noise within a certain frequency band that can be arbitrarily low, in this case between 2 Hz (k1.lower) and 5 Hz (k1.upper), will be defined as core object 1.
menuett_scratch.wav, likewise in stereo, will be defined as the output and take over the stream of input 1 in the patching (*i1).
Total duration (dur): 20 seconds.
What is interesting about this example is perhaps that, except for the one generator, no other special objects are needed. That is the standard of the input scanner and the parameter conventions.
Each parameter that does not represent durations or modes can be put in sequencer lists, interpolated, and be controlled or modulated by any other object. In the example above one could, as said, also use the wave forms of other sound files for the control, or the same sound files, or even the same outputs. Feedbacks are also possible.

* * *

With the advent of real-time systems, this fundamental method has increasingly taken a backseat. Naturally, tempo transformation in a real-time context is, strictly speaking, paradoxical. One cannot input a sound stream and 'at the same moment' play it back quicker, or even in time reversal. It could be done slower, but the synchronicity between the original and its slowdown disperses from the first moment onwards.
Nevertheless, such a thing could be deployed live, not only in regard to pitches, but also in a polyrhythmic manner.
In AMP there is the core object retard which allows such a process to be simulated. (AMP does not go in real-time, but allows, if one wants, thinking in streams).
One can imagine it in this way. At an input, a stream from a sound file lies in an approaching fashion. It runs over a delay buffer that can be read arbitrarily slower, also in layerings in several different tempi. The only thing one needs for this is a large enough delay buffer. With a cue parameter, the process can be synchronized again at any moment.

This audio example shall be understood as the processing of an excerpt from published recordings. With the possibility to listen it and study it here for demonstration purposes, there are no further exploitation rights associated with it.

Here, a synchronization takes place every 2 seconds; one could naturally adjust the cue to the content of the sound as well. The corresponding AMP script looks like this:

i1=tomsdiner.wav (m)
k1=retard (layer=3,*i1,dim=80sec,bev=400)
out=demo08_retar.wav (m,*k1,opt)
dur: 2
k1.status: 1
k1.rate.0: 1
k1.rate.1: 8/9
k1.rate.2: 4/5

tomsdiner.wav (Suzanne Vega) will be addressed to input 1 (mono). Core object 1 is the said retard routine with tempo transformations in 3 layers (layer=3), the delay buffer can record for a maximum of 80 seconds (if necessary), crossfade, so that it does not crackle, 400 samples (I call it bevel). The output writes the result of k1 in the sound file, but optimizes the total amplitude beforehand.
The sequencer has 20 segments lasting 2 seconds each.
The status of each segment (k1.status) is 1 (=cue).
The tempo factors of the 3 layers (k1.rate.0 to .2) are 1 (original), 8/9 (a whole tone lower and slower), 4/5 (a major third lower and slower).

If one takes the durations between the cues much smaller, then one has already entered the world of granular methods. The same example with 200 segments lasting 0.1 seconds each:

This audio example shall be understood as the processing of an excerpt from published recordings. With the possibility to listen it and study it here for demonstration purposes, there are no further exploitation rights associated with it."

As indicated, such a thing would also work in a live context. Everything one needs as far as interfaces are concerned would be as many controls as one would like to have tempo layers, and a button for the sync cue.
[Whoever wants to recreate it, please: The delays have to be read in an interpolated manner so that fine tempo nuances are possible; crossfades, so that the transitions do not crackle; besides, with denser layerings an adjustable 'lag' is advantageous so that all tracks do not begin simultaneously, which would lead to phasing effects. Another possibility would be that someone helps me extend AMP to a real-time tool, which would principally work ...].


(c) Günther Rabl 2010