In the serial music of the 20th century (perhaps also much earlier, who knows?) the idea came up that one cannot merely transpose and mirror motifs, but can also stretch and shrink them by proportionally enlarging or reducing all pitch intervals. Naturally that only works, strictly speaking, with integral factors, if one wants to assure that one remains in the tonal system at the same time.
What one means, however, are pitches, not frequencies. The frequency proportions of the tones themselves are not affected by it. With the means of spectral transformation, this allows itself to be carried out for all frequencies and with arbitrary factors. In analogy to the interval stretching described at the beginning, some spectral applications call this 'stretch.' One should nevertheless be aware that this is it no stretch in the actual sense. A stretch in the spectrum produces a reciprocal stretch in time – nothing more than the long-known tempo change. (The pitches and the frequencies will indeed be changed then, but not the intervals). In order for the intervals between the single frequencies to appear stretched or compressed, the spectral ordinates must be distorted. In VASP, the according ordinate distortion is called odist, or in the general form with many different variants: warp. Like all routines in VASP, these are also applicable in every domain. In the time domain, odist shows itself to be a continuous tempo change, a special type of tempo glissando. Our much-strained allegro:

sfload mozart.wav
odist 2


Since a tempo change in one domain, as we know, causes a reciprocal tempo change in the respective other domain, it is clear that ordinate distortion in the spectrum must likewise result in a type of glissando in the time domain. At first, a lower rate of distortion (factor 1 would be undistorted):

xodist 1.1

(xodist is a symmetric form that is required in the spectrum, - in VASP, a prefixed 'x' designates the symmetric form of an operation)

One hears very beautifully the stretching of all interval relationships by 10% (each fifth becomes almost a half tone higher, each octave a three-quarter tone higher, etc.). As to expect, we also have to deal with a blurring of the temporal structures. That is no mistake of the routine; it rather lies in the nature of the matter! At a stronger distortion rate, this effect is so dominant that the interval stretches shift to the background, even though they exactly occur. With a factor of 2:

A very similar routine is slope. Here as well, the intervals will be stretched or compressed as with odist; only one point allows itself to be held: a time point, or, in the spectrum, a frequency.

FFT; xslope 440hz,2; xphirand; FFT-

The same with a factor of 0.5
The obvious symmetry of the effect results from the necessary symmetric application of the ordinate distortion in the spectrum. (One finds out more about it in the topics FFT and complex audio).

* * *

This distortion factor is, strictly speaking, an exponent. Each interval in the spectrum – really each one – appears raised to the power of this exponent.
(Naturally, one could maintain a logarithmic perspective and say the intervals are stretched or shrinked, doubled or halved. However, we are not dealing with tone scales here, but rather with sounds. For further considerations, it is good to keep an eye on the exponential character).

If one observes an integral overtone row, as we know it from many instruments, then the newly resulting overtone row in the first case (exponent 2) will consist of the squares of the integers; if a partial tone row only consists of odd numbers (a string torn in the middle, for instance), then only out of the squares of the odd numbers. That is insofar remarkable, since it rather corresponds to the frequency diagram of a bending vibration – of vibrating bar!

In the opposite case, (exponent 0.5) one gets a row from the roots of the integers. That, in turn, partially corresponds to the frequency diagram of a square membrane or plate.
One listens again for that in both of the previous examples: The character of specslope05 is indeed dense and planar; the one from specslope2, in contrast, sounds as if played on a rod. Of course, there are all shades as well – a source for systematic compositional work.

* * *

How can one achieve such ordinate distortions without incurring the temporal changes and glissandi? (But they are also beautiful, aren’t they?) – Just like with all other spectral interventions: only granular.

There are basically two approaches to it. The first: One goes about it like a 'harmonizer'. One does not split the sound into temporal grains, but rather its total spectrum into frequency bands (spectral grains), which one can move to another position (see the VASP scripts below).
Exponent 2
Exponent 0.5

This is the best method. Real time-capable it is naturally not. One has to choose a different approach: Structure the sound temporally in grains and accordingly process each grain. Such a thing can be illustrated in VASP with a granular process:

GRPROC.xdspl {FFT; xslope 440hz,2; FFT-}

A sub-process that can be carried out grain by grain stands here in curly brackets. In this manner, granular processes can be studied in VASP. But whoever does that as artlessly as in this example will be confronted with the usual granular crumbs. One can still build in a few refinements and tricks there. Much more is contained in the AMP core module spec.slope (see AMP script below).

* * *

The distortion of the intervals can be determined, as said, by raising it to the power of the distortion rate (exponent). The other way around, one can also determine how a certain interval should change. In this case, one has to form the quotients of the logarithms of both intervals. Here is one example:

Each pure fifth should become an octave; then the exponential is equal to the logarithm of the octave divided by the logarithm of the fifth. (No matter which logarithm – whether natural, decadal or dual – the quotient is always the same).
x = log(2)/log(1.5) = 1.7095
The changes of all remaining intervals are also the result.
The octaves become 2^1.7095 = 2.3705 = 1.635*2 (a neutral sixth, between a larger and smaller sixth, plus 1 octave)
The fourth becomes 1.333^1.7095 = 1.635 (the same neutral sixth)
The large third becomes 1.25^1.7095 = 1.4644 (a too small fifth)
The small third becomes 1.2^1.7095 = 1.3657 (a too big fourth)One clearly hears this when one levels the time structure (freeze):

FFT; xodist 1.7095; xphirand; FFT-


Many exponents that cause very unconventional harmonic changes can be found. One thus enters the broad area of 'unharmonic' sounds – as they were so beautifully called earlier ...
Try it out (computationally and/or audibly)!

* * *

And now back to warp
The ordinate distortion type in the spectrum, which causes a uniform stretching of all intervals, is surely the most fundamental. The distortion, as well as an amplitude distortion, can be illustrated in a diagram:

On the basis of the corresponding curve, each position of a sample (x-axis) can be assigned a new position (y-axis).
(The operations warp.bend and warp.slope in VASP are also equipped with upstream and downstream variable alias filters). Beyond that, there are still numerous variants, including warp.curly, which is also described in SPILLING THE BEANS #2. Basically, all types of distortion curves can also be used for ordinate distortion.

* * *

To conclude, one small brain-teaser for those who have already worked with VASP. What is happening in the following VASP script?

sfload mozart0.wav
$xgen.medser 400
GRPROC.dspl {FFT-; odist 2; FFT}

The sound will be transformed in its total spectrum; the spectrum split into the individual grains; each spectral grain transformed back into the time domain, distorted and transformed into the frequency domain again; the whole result again transformed from the spectrum back into the time domain ....?


(c) G
ünther Rabl 2012


A:  "switch to buffer A
sfload mozart.wav  "load sound file
FFT  "transformation into spectrum
$xgen.medser 400  "generate structure with 400 frequency bands
B:  "switch to buffer B
$copy "kopiert Struktur
$xslope 440hz,2  "structure distortion slope
GRT.xautofoc  "granular transformation
FFT-  "inverse transformation

First the sound will be transformed in its total spectrum (FFT); then a granular structure will be generated, 400 frequency bands, symmetric, medium – between linear and logarithmic ($xgen.medser); this structure will be copied ($copy) and subsequently distorted with the slope function ($xslope); the granular transformation (GRT) shifts all frequency bands from the original position to the newly distorted one (.xautofoc is a fitting modus in this case); the result will again be transformed back (FFT-).
Nevertheless, one could also extract the granular structures analytically, according to the peaks in the spectrum. Many subtleties can still be hauled out of there.


* AMP script for spec.slope
i1=mozart.wav (m)
k1=spec.slope (m,*i1,dim=4000)
out=mozart_specslope_AMP.wav (m,*k1,opt)
dur: 20  "duration 20 seconds
k1.center: 330  "center frequency
k1.rate: 1.1  "distortion rate

Of course, the parameters k1.center and k1.rate are also available in the sequencer. (These, as well as several other spectral distortions, are implemented in the VST plug-in spexx).