Skip to content

adsr

Calculates the classical ADSR envelope using linear segments.

Syntax

ares adsr iatt, idec, islev, irel [, idel]
kres adsr iatt, idec, islev, irel [, idel]

Initialization

iatt -- duration of attack phase

idec -- duration of decay

islev -- level for sustain phase

irel -- duration of release phase

idel -- period of zero before the envelope starts

Performance

The envelope generated is the range 0 to 1 and may need to be scaled further, depending on the amplitude required. If using 0dbfs = 1, scaling down will probably be required since playing more than one note might result in clipping. If not using 0dbfs, scaling to a large amplitude (e.g. 32000) might be required.

The envelope may be described as:

Picture of an ADSR envelope.
Picture of an ADSR envelope.

The length of the sustain is calculated from the length of the note. This means adsr is not suitable for use with MIDI events. The opcode madsr uses the linsegr mechanism, and so can be used in MIDI applications.

adsr is new in Csound version 3.49.

Examples

Here is an example of the adsr opcode. It uses the file adsr.csd.

Example of the adsr opcode.
<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
-odac     ;;;RT audio out
;-iadc    ;;;uncomment -iadc if RT audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o adsr.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

sr = 44100
ksmps = 32
nchnls = 2
0dbfs = 1

instr 1

iatt  = p5
idec  = p6  
islev = p7
irel  = p8

kenv    adsr iatt, idec, islev, irel
kcps =  cpspch(p4)        ;frequency

asig    vco2  kenv * 0.8, kcps
        outs  asig, asig

endin

</CsInstruments>
<CsScore>

i 1  0  2  7.00  .0001  1  .5  .001 ; short attack
i 1  3  2  7.02  1  .5  .5  .001    ; long attack
i 1  6  2  6.09  .0001  1 .5  .7     ; long release

e

</CsScore>
</CsoundSynthesizer>

Here is an example for the adsr-group, comparing the different adsr opcodes. It uses the file adsr-group.csd.

Example of the adsr group.
<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
-odac    ;;;realtime audio out
;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o adsr-group.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

; by Menno Knevel - 2021

sr = 44100
ksmps = 32
nchnls = 2
0dbfs  = 1

; both amplitude and filter use same ADSR curves 
instr 1                  
kenv    adsr    .01, .5, .5, p4         ; linear envelope 
asig    vco2    kenv, 110                       ; A+D+S+R = p3  
asig    rezzy   asig, 500+(kenv*1000), 10       ; same curve but scaled 
                outs    asig, asig       
endin

instr 2 ; midi behavior                  
kenv    madsr   .01, .5, .5, p4         ; linear envelope
asig    vco2    kenv, 110                       ; A+D+S = p3, then go into Release stage                
asig    rezzy   asig, 500+(kenv*1000), 10       ; same curve but scaled  
                outs    asig, asig                      
endin

instr 3                  
kenv    xadsr   .01, .5 , .5, p4    ; exponential envelope
asig    vco2    kenv, 110                       ; A+D+S+R = p3   
asig    rezzy   asig, 500+(kenv*1000), 10       ; same curve but scaled 
                outs    asig, asig
endin

instr 4 ; midi behavior          
kenv    mxadsr  .01, .5 , .5, p4        ; exponential envelope
asig    vco2    kenv, 110                       ; A+D+S = p3, then go into Release stage         
asig    rezzy   asig, 500+(kenv*1000), 10       ; same curve but scaled 
                outs    asig, asig                      
endin

</CsInstruments>
<CsScore>
s
i1 1 2 .01      ; same notes for everyone!
i1 5 . .5
i1 9 . 1.5
s
i2 1 2 .01
i2 5 . .5
i2 9 . 1.5
s
i3 1 2 .01
i3 5 . .5
i3 9 . 1.5
s
i4 1 2 .01
i4 5 . .5
i4 9 . 1.5
e
</CsScore>
</CsoundSynthesizer>

See Also

Envelope Generators

Credits

Author: John ffitch

New in version 3.49