if — Branchement conditionnel à l'initialisation ou durant l'exécution.
if...igoto -- branchement conditionnel à l'initialisation, dépendant de la valeur de vérité de l'expression logique ia R ib. Le branchement n'a lieu que si le résultat est vrai.
if...kgoto -- branchement conditionnel durant l'exécution, dépendant de la valeur de vérité de l'expression logique ka R kb. Le branchement n'a lieu que si le résultat est vrai.
if...goto -- combinaison des deux versions ci-dessus. La condition est testée à chaque passage.
if...then -- donne la possibilité de spécifier des blocs conditionnels if/else/endif. Tous les blocs if...then doivent se terminer par une instruction endif. Les instructions elseif et else sont facultatives. On peut utiliser n'importe quel nombre d'instructions elseif. Il ne peut y avoir qu'une seule instruction else et elle doit être la dernière instruction conditionnelle avant l'instruction endif. Des blocs imbriqués de if...then sont permis.
Note | |
---|---|
Notez que si la condition utilise une variable de taux-k (par exemple, « if kval > 0 »), l'instruction if...goto ou if...then sera ignorée lors de la phase d'initialisation. Cela permet une initialisation de l'opcode même si la variable de taux-k a déjà reçu une valeur appropriée par une instruction init antérieure. |
if ia R ib igoto label
if ka R kb kgoto label
if xa R xb goto label
if xa R xb then
où label est dans le même bloc d'instrument et n'est pas une expression, et où R est un des opérateurs relationnels (<, =, <=, ==, !=) (et = par commodité, voir aussi Valeurs Conditionnelles).
Si l'on utilise goto ou then à la place de kgoto ou igoto, le comportement est déterminé par le type étant comparé. Si la comparaison utilise des variables de taux-k, kgoto est utilisé et vice-versa.
Note | |
---|---|
Les instructions If/then/goto ne peuvent pas effectuer de comparaisons de type audio. On ne peut pas mettre de variables de type-a dans les expressions de comparaison pour ces opcodes. La raison en est que les variables audio sont des vecteurs qui ne peuvent pas être comparés de la même façon que des scalaires. Si l'on doit comparer des échantillons audio individuellement il faut utiliser kr = 1 ou Comparateurs et Accumulateurs |
Voici une exemple de la combinaison if ... igoto. Il utilise le fichier igoto.csd.
Exemple 452. Exemple de la combinaison if ... igoto.
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 -odac -iadc ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: ; -o igoto.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> ; Initialize the global variables. sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 ; Instrument #1. instr 1 ; Get the value of the 4th p-field from the score. iparam = p4 ; If iparam is 1 then play the high note. ; If not then play the low note. if (iparam == 1) igoto highnote igoto lownote highnote: ifreq = 880 goto playit lownote: ifreq = 440 goto playit playit: ; Print the values of iparam and ifreq. print iparam print ifreq a1 oscil 10000, ifreq, 1 out a1 endin </CsInstruments> <CsScore> ; Table #1: a simple sine wave. f 1 0 32768 10 1 ; p4: 1 = high note, anything else = low note ; Play Instrument #1 for one second, a low note. i 1 0 1 0 ; Play a Instrument #1 for one second, a high note. i 1 1 1 1 e </CsScore> </CsoundSynthesizer>
Sa sortie contiendra des lignes comme celles-ci :
instr 1: iparam = 0.000 instr 1: ifreq = 440.000 instr 1: iparam = 1.000 instr 1: ifreq = 880.000
Voici un exemple de la combinaison if ... kgoto. Il utilise le fichier kgoto.csd.
Exemple 453. Exemple de la combinaison if ... kgoto.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in -odac -iadc ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: ; -o kgoto.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> ; Initialize the global variables. sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 ; Instrument #1. instr 1 ; Change kval linearly from 0 to 2 over ; the period set by the third p-field. kval line 0, p3, 2 ; If kval is greater than or equal to 1 then play the high note. ; If not then play the low note. if (kval >= 1) kgoto highnote kgoto lownote highnote: kfreq = 880 goto playit lownote: kfreq = 440 goto playit playit: ; Print the values of kval and kfreq. printks "kval = %f, kfreq = %f\\n", 1, kval, kfreq a1 oscil 10000, kfreq, 1 out a1 endin </CsInstruments> <CsScore> ; Table #1: a simple sine wave. f 1 0 32768 10 1 ; Play Instrument #1 for two seconds. i 1 0 2 e </CsScore> </CsoundSynthesizer>
Sa sortie contiendra des lignes comme celles-ci :
kval = 0.000000, kfreq = 440.000000 kval = 0.999732, kfreq = 440.000000 kval = 1.999639, kfreq = 880.000000
Voici un exemple de la combinaison if ... then. Il utilise le fichier ifthen.csd.
Exemple 454. Exemple de la combinaison if ... then.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in -odac -iadc ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: ; -o ifthen.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 ; Instrument #1. instr 1 ; Get the note value from the fourth p-field. knote = p4 ; Does the user want a low note? if (knote == 0) then kcps = 220 ; Does the user want a middle note? elseif (knote == 1) then kcps = 440 ; Does the user want a high note? elseif (knote == 2) then kcps = 880 endif ; Create the note. kamp init 25000 ifn = 1 a1 oscili kamp, kcps, ifn out a1 endin </CsInstruments> <CsScore> ; Table #1, a sine wave. f 1 0 16384 10 1 ; p4: 0=low note, 1=middle note, 2=high note. ; Play Instrument #1 for one second, low note. i 1 0 1 0 ; Play Instrument #1 for one second, middle note. i 1 1 1 1 ; Play Instrument #1 for one second, high note. i 1 2 1 2 e </CsScore> </CsoundSynthesizer>