mxadsr

mxadsr — Calcule l'enveloppe ADSR classique en utilisant le mécanisme de expsegr.

Description

Calcule l'enveloppe ADSR classique en utilisant le mécanisme de expsegr.

Syntaxe

ares mxadsr iatt, idec, islev, irel [, idel] [, ireltim]
kres mxadsr iatt, idec, islev, irel [, idel] [, ireltim]

Initialisation

iatt -- durée de l'attaque (attack)

idec -- durée de la première chute (decay)

islev -- niveau d'entretien (sustain)

irel -- durée de la chute (release)

idel (facultatif, 0 par défaut) -- délai de niveau zéro avant le démarrage de l'enveloppe

ireltim (facultatif, -1 par défaut) -- Contrôle la durée du relâchement après la réception d'un évènement MIDI note-off. S'il est inférieur à zéro, la durée de relâchement la plus longue de l'instrument courant est utilisée. S'il est nul ou positif, la valeur donnée sera utilisée comme durée de relâchement. Sa valeur par défaut est -1. (Nouveau dans Csound 3.59 - pas encore entièrement testé).

Exécution

L'enveloppe évolue dans l'intervalle de 0 à 1 et peut être changée d'échelle par la suite. Voici une description de l'enveloppe :

Image d'une enveloppe ADSR exponentielle.

Image d'une enveloppe ADSR exponentielle.

La longueur de la période d'entretien est calculée à partir de la longueur de la note. C'est pourquoi adsr n'est pas adapté au traitement des évènements MIDI. L'opcode madsr utilise le mécanisme de linsegr, et peut donc être utilisé dans les applications MIDI. L'opcode mxadsr est identique à madsr sauf qu'il utilise des segments exponentiels plutôt que linéaires.

On peut utiliser d'autres enveloppes préfabriquées pour lancer un segment de relâchement à la réception d'un message note off, comme linsegr et expsegr, ou bien l'on peut construire des enveloppes plus complexes au moyen de xtratim et de release. Noter qu'il n'est pas nécessaire d'utiliser xtratim avec mxadsr, car la durée est allongée automatiquement.

mxadsr est nouveau dans la version 3.51 de Csound.

Exemples

Voici un exemple de l'opcode mxadsr. Il utilise le fichier mxadsr.csd.

Exemple 639. Exemple de l'opcode mxadsr.

Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation des options de la ligne de commande.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
-odac  -m0  --midi-key=4 --midi-velocity-amp=5 ; treat p4 and p5 as midi data
; For Non-realtime ouput leave only the line below:
; -o mxadsr-2.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

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

; by Menno Knevel - 2021

instr 1	                              ; use score and treat p4 and p5 as midi data
icps    = cpsmidinn(p4)               ; take midi note (p4) from score
iveloc  ampmidid p5, 92               ; take velocity (p5) from score
;               att, dec, lvl, release
kenv    mxadsr  .001, .2,   1,    p6 
prints  "duration of note (%ds) + release (%2.1fs)\\n", p3, p6                ; 
asig    vco2	iveloc, icps
asig    butlp	asig, 2000 
		outs    asig*kenv, asig*kenv

endin
</CsInstruments>
<CsScore>
;      note vel release	
s
i 1 0 1 62  60	0
i 1 2 1 62  80	0	
i 1 4 1 62  100	0	
i 1 6 1 58  50	0
s
i 1 1 1 62  60	0
i 1 3 1 62  80	1	
i 1 5 1 62  100	3	
i 1 7 1 58  50	5
e
</CsScore>
</CsoundSynthesizer>


Voici un exemple pour le groupe adsr, comparant les différents opcodes adsr. Il utilise le fichier adsr-group.csd.

Exemple 640. Exemple du groupe adsr.

<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>


Voir aussi

linsegr, expsegr, envlpxr, mxadsr, madsr, adsr, expon, expseg, expsega line, linseg, xtratim

Crédits

Auteur : John ffitch

Novembre 2002. Merci à Rasmus Ekman pour avoir documenté le paramètre ireltim.

Novembre 2003. Merci à Kanata Motohashi pour avoir fixé le lien vers l'opcode linsegr.