madsr
Précédent | Opcodes et opérateurs de l'orchestre | Suivant

## madsr

madsr — Calcule l'enveloppe ADSR classique en utilisant le mécanisme de linsegr.

## Description

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

## Syntaxe

    ares madsr iatt, idec, islev, irel [, idel] [, ireltim]

    kres madsr 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 -- délai de niveau zéro avant le démarrage de l'enveloppe

ireltim (facultatif, par défault = -1) -- 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é).

Noter que la durée du relâchement ne pouvait pas dépasser 32767/kr secondes dans versions antérieures à la 5.00 ; depuis la limite a été étendue à 231/kr secondes.

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

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.

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 madsr, car la durée est allongée automatiquement.

| Note
Les durées pour iatt, idec et irel ne peuvent pas être 0. Si l'on utilise 0, aucune enveloppe n'est générée. Utilisez une très petite valeur comme 0.0001 si vous désirez une attaque, une chute ou un relâchement instantanés.

## Exemples

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

Exemple 553. Exemple de l'opcode madsr.

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
    ; Audio out   Audio in    No messages
    -odac           -iadc     -d     ;;;RT audio I/O
    ; For Non-realtime ouput leave only the line below:
    ; -o madsr.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    /* Written by Iain McCurdy */
    ; Initialize the global variables.
    sr = 44100
    kr = 441
    ksmps = 100
    nchnls = 1

    ; Instrument #1.
    instr 1
      ; Attack time.
      iattack = 0.5
      ; Decay time.
      idecay = 0
      ; Sustain level.
      isustain = 1
      ; Release time.
      irelease = 0.5
      aenv madsr iattack, idecay, isustain, irelease

      a1 oscili 10000, 440, 1
      out a1*aenv
    endin

    </CsInstruments>
    <CsScore>

    /* Written by Iain McCurdy */
    ; Table #1, a sine wave.
    f 1 0 1024 10 1

    ; Leave the score running for 6 seconds.
    f 0 6

    ; Play Instrument #1 for two seconds.
    i 1 0 2
    e

    </CsScore>
    </CsoundSynthesizer>

Voici un autre exemple de l'opcode madsr, utilisant l'entrée midi. Il utilise le fichier madsr-2.csd.

Exemple 554. Second exemple de l'opcode madsr

    <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 madsr-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    madsr  .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  .5
    i 1 5 1 62  100 1.5
    i 1 7 1 58  50  3
    e
    </CsScore>
    </CsoundSynthesizer>

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

Exemple 555. 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, xadsr expon, expseg, expsega line, linseg, xtratim

## Crédits

Auteur : John ffitch

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

Décembre 2002. Merci à Iain McCurdy pour avoir ajouté un exemple.

Décembre 2002. Merci à Istvan Varga pour avoir indiqué la durée maximale de relâchement.

Nouveau dans la version 3.49 de Csound.

Précédent | Niveau supérieur | Suivant
maca | Sommaire | mags