A passion of mine is to look at established things from a different perspective and to discover new methods and applications thereby.

For a long time I was missing something like an envelope curve generator. (In my older pieces I adjusted envelope curves manually when needed, with a switch and a fader...). The usual devices solve such a thing with attack-sustain-release, or something like that. That was not organic enough for me, so I came to the following solution.

kex (complementary exponential functions)
One imagines two exponentially decreasing envelope curves, both beginning with full amplitude; one of them decreasing more slowly, the other quicker:



If one subtracts them from each other, the result is a progression that begins at zero, initially rises continually, in order to then peter out again exponentially:


The shorter curve thereby acts as an attack, the longer one as a decay. If both curves are very different, the attack becomes steeper; if they are very similar, the progression becomes flatter:



An interesting, organic side effect is that the flatter curve progressions are also quieter. One could naturally counteract that by a standardization; however, it definitely makes (hearable) sense to work with it this way.

Here are the three variants as listening examples. A freeze from a cut of 'Watersong' by Limpe Fuchs serves as the sound. (I have already described how such a freeze can be constructed. >> SPILLING THE BEANS #1 Reverberation).


A further interesting aspect is that such envelope curves allow themselves to be layered. A new attack can, so to say, be set upon an already existing progression, making very dynamic, rhythmic patterns possible.

A motif: the same freeze, now in a series with tempo transposition and frequency shift and various settings of the exponential functions.


Already at the beginning of the 1980s I used an analog envelope curve generator according to this principle. Wolfgang and Thomas Musil built this device. It can be heard very well in the pieces LANDSCHAFT, EVE and KLEINE FUGE (>> Werke 4, ccr 404).

In VASP it is the routine env.kex, in AMP the core module env.kex that can be run in the sequencer. For the workshop, Wolfgang Musil has engineered such an envelope curve generator also as a MAX patch.

* * *

I personally love such simple, organic functions. However, such an envelope curve generator could also be crafted in a more sophisticated manner. Combinations of several functions would be possible, also complexly (with pulses of different frequency). A complex exponential function could, for instance, look like this in the xy representation (in VASP gen.cexp):


* * *

The exponential function is the prototype of an energetic behavior, such as with a dulled pendulum or with a damped string – and it is extremely simple to have (a multiplication with a decay factor sample for sample).

However, there are definitely still other elementary functions that are also not much more elaborate – the Gauss function, for example, an exponential function according the square of time, flatter at the beginning, but then fading more rapidly (env.gauss):


[In one of my newest generators I use a combination of complementary exponential and Gauss functions]
Or a function that simulates a decrease of amplitude as through growing distance, first steeply sustaining, but then only slowly fading:


(The violet lines mark equal intervals in which the curve decreases reciprocally : 1/2, 1/3, 1/4, 1/5 ...)
env.fade is the name of the function in VASP and it exists in several interesting variants.

[That perhaps also explains why I only use the term 'fade' reluctantly if simply a banal cut is meant. What is elsewhere called fade in and fade out is therefore called bevel (bev) in VASP – as a rule, a brief cut in and blank out so that the edges do not crackle].

If nothing else, one can also furnish different spectral areas with various envelope curves or provide variable filters. One thing at a time...


(c) Günther Rabl 2011


AMP script for the motif above

i1=limpe6_freeze.wav (m,vsp=flt)
k1=env.kex (m,*i1)
k2=fshift (m,*k1)
out=akex01.wav (m,*k2,opt)
time: / [[1],0,[8],1.5,[15],2.6,[22],3.1,[23],4.2,[24],5.3]
dur: [RAND(.09,.11),[7],4,[14,21,22,23],6,[24],6]
k1.att: [RAND(.01,.1),[21,22,23],6,[24],8,[],decay]
k1.dec: 2 [[7,14],4,[21],8,[22,23,24],10,[],decay]
k1.ini: 1
k1.iniamp: 1
i1.pos: / [[1,22,23,24],0]
i1.vsp: 1 [[csz/7=1],.5,[csz/7=2],.25,[22,23],.125,[24],.125]
k2.freq: 100 [csz/7=1],300,[csz/7=2],0,[22],2000,[23],2400,[24],0]