if

if — Branchement conditionnel à l'initialisation ou durant l'exécution.

Description

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

Syntaxe

if ia R ib igoto label
if ka R kb kgoto label
if xa R xb goto label
if xa R xb then

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

Exemples

Voici une exemple de la combinaison if ... igoto. Il utilise le fichier igoto.csd.

Exemple 400. 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 401. 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

Exemples

Voici un exemple de la combinaison if ... then. Il utilise le fichier ifthen.csd.

Exemple 402. 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>


Voir aussi

elseif, else, endif, goto, igoto, kgoto, tigoto, timout

Crédits

Exemples écrits par Kevin Conder.

Note ajoutée par Jim Aikin.

Février 2004. Note ajoutée par Matt Ingalls.