xadsr — Calculates the classical ADSR envelope.
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
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:
The length of the sustain is calculated from the length of the note. This means xadsr is not suitable for use with MIDI events, use mxadsr instead. The opcode xadsr is identical to adsr except it uses exponential, rather than linear, line segments.
Here is an example of the xadsr opcode. It uses the file xadsr.csd.
Example 1231. Example of the xadsr opcode.
See the sections Real-time Audio and Command Line Flags for more information on using command line flags.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform -odac ;;;realtime audio out ;-iadc ;;;uncomment -iadc if RT audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o xadsr.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 xadsr iatt, idec, islev, irel kcps = cpspch(p4) ;frequency asig vco2 kenv * 0.8, kcps outs asig, asig endin </CsInstruments> <CsScore> i 1 0 1 7.00 .0001 1 .01 .001 ; short attack i 1 2 1 7.02 1 .5 .01 .001 ; long attack i 1 4 2 6.09 .0001 1 .1 .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 1232. 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>