xtratim — Allonge la durée d'évènements générés en temps réel.
Allonge la durée d'évènements générés en temps réel et gère cet allongement. (Habituellement on l'utilise avec release au lieu de linenr, linsegr, etc).
xtratim allonge la durée de la note MIDI courante de iextradur secondes après que le message note off correspondant ait désactivé cette note. On l'utilise habituellement avec release. Cet opcode n'a pas d'arguments en sortie.
Cet opcode est utile pour implémenter des enveloppes complexes avec relâchement, dont la durée n'est pas connue lors du démarrage de l'enveloppe (par exemple pour des évènements MIDI en temps réel).
Voici un exemple de l'opcode xtratim. Il utilise le fichier xtratim.csd.
Exemple 1231. Exemple de l'opcode xtratim.
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.
Cet exemple montre comment générer un segment de relâchement pour une enveloppe ADSR après qu'un note off MIDI ait été reçu, en allongeant la durée avec xtratim et en utilisant release pour tester si la note est dans sa phase de relâchement.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in Silent MIDI in -odac -iadc -d -M0 ;;;realtime I/O </CsOptions> <CsInstruments> ;Simple usage of the xtratim opcode sr = 44100 ksmps = 10 nchnls = 2 ; sine wave for oscillators gisin ftgen 1, 0, 4096, 10, 1 instr 1 inum notnum icps cpsmidi iamp ampmidi 4000 ; ;------- complex envelope block ------ xtratim 1 ;extra-time, i.e. release dur krel init 0 krel release ;outputs release-stage flag (0 or 1 values) if (krel == 1) kgoto rel ;if in release-stage goto release section ; ;************ attack and sustain section *********** kmp1 linseg 0, .03, 1, .05, 1, .07, 0, .08, .5, 4, 1, 50, 1 kmp = kmp1*iamp kgoto done ; ;--------- release section -------- rel: kmp2 linseg 1, .3, .2, .7, 0 kmp = kmp1*kmp2*iamp done: ;------ a1 oscili kmp, icps, gisin outs a1, a1 endin </CsInstruments> <CsScore> f 0 3600 ;dummy table to wait for realtime MIDI events e </CsScore> </CsoundSynthesizer>
Voici un exemple plus élaboré de l'opcode xtratim. Il utilise le fichier xtratim-2.csd.
Exemple 1232. Exemple plus complexe de l'opcode xtratim.
Cet exemple montre comment générer un segment de relâchement pour une enveloppe ADSR après qu'un note off MIDI ait été reçu, en allongeant la durée avec xtratim et en utilisant release pour tester si la note est dans sa phase de relâchement. Deux enveloppes sont générées simultanément pour les canaux gauche et droit.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in Silent MIDI in -odac -iadc -d -M0 ;;;realtime I/O </CsOptions> <CsInstruments> ;xtratim example by Jonathan Murphy Dec. 2006 sr = 44100 ksmps = 10 nchnls = 2 ; sine wave for oscillators gisin ftgen 1, 0, 4096, 10, 1 ; set volume initially to midpoint ctrlinit 1, 7,64 ;;; simple two oscil, two envelope synth instr 1 ; frequency kcps cpsmidib ; initial velocity (noteon) ivel veloc ; master volume kamp ctrl7 1, 7, 0, 127 kamp = kamp * ivel ; parameters for aenv1 iatt1 = 0.03 idec1 = 1 isus1 = 0.25 irel1 = 1 ; parameters for aenv2 iatt2 = 0.06 idec2 = 2 isus2 = 0.5 irel2 = 2 ; extra (release) time allocated xtratim (irel1>irel2 ? irel1 : irel2) ; krel is used to trigger envelope release krel init 0 krel release ; if noteoff received, krel == 1, otherwise krel == 0 if (krel == 1) kgoto rel ; attack, decay, sustain segments atmp1 linseg 0, iatt1, 1, idec1, isus1 , 1, isus1 atmp2 linseg 0, iatt2, 1, idec2, isus2 , 1, isus2 aenv1 = atmp1 aenv2 = atmp2 kgoto done ; release segment rel: atmp3 linseg 1, irel1, 0, 1, 0 atmp4 linseg 1, irel2, 0, 1, 0 aenv1 = atmp1 * atmp3 ;to go from the current value (in case aenv2 = atmp2 * atmp4 ;the attack hasn't finished) to the release. ; control oscillator amplitude using envelopes done: aosc1 oscil aenv1, kcps, gisin aosc2 oscil aenv2, kcps * 1.5, gisin aosc1 = aosc1 * kamp aosc2 = aosc2 * kamp ; send aosc1 to left channel, aosc2 to right, ; release times are noticably different outs aosc1, aosc2 endin </CsInstruments> <CsScore> f 0 3600 ;dummy table to wait for realtime MIDI events </CsScore> </CsoundSynthesizer>