Instruction {

{ — Commence une boucle imbriquable, sans section.

Description

On peut utiliser les instructions { et } pour répéter un groupe d'instructions de partition. Ces boucles ne constituent pas des sections de partition indépendantes et peuvent ainsi répéter des évènements dans la même section. Plusieurs boucles peuvent se chevaucher dans le temps ou être imbriquées.

Syntaxe

{ p1 p2

Initialisation

p1 -- Nombre de répétitions de la boucle.

p2 -- Un nom de macro qui est automatiquement défini au début de la boucle et dont la valeur est incrémentée à chaque répétition (facultatif). La valeur initiale est zéro et la valeur finale est (p1 - 1).

Exécution

L'instruction { est utilisée conjointement avec l'instruction } pour définir des groupes d'évènements de partition qui se répètent. Une boucle de partition commence par l'instruction { qui définit le nombre de répétitions et un nom de macro unique qui contiendra le compteur de boucle. Le corps d'une boucle peut contenir n'importe quel nombre d'évènements (y compris des sauts de section) et il se termine par une instruction } ayant sa propre ligne. L'instruction } ne prend pas de paramètre.

Le terme "boucle" n'implique aucune sorte de succession temporelle pour les itérations de la boucle. Autrement dit, les valeurs p2 des évènements à l'intérieur de la boucle ne sont pas incrémentées automatiquement de la longueur de la boucle à chaque répétition. C'est un avantage car cela permet de définir facilement des groupes d'évènements simultanés. La macro de boucle peut être utilisée avec des expressions de partition pour incrémenter les dates de début d'évènements ou pour faire varier les évènements de toute autre manière désirée à chaque répétition. Noter que à la différence de l'instruction r, la valeur de la macro au premier passage dans la boucle est zéro (0), pas un (1). Ainsi la valeur finale est inférieure d'une unité au nombre de répétitions.

Les boucles de partition sont un outil très puissant. Bien que semblables à l'outil de répétition de section (l'instruction r), leur principal avantage est que les évènements de partition dans les itérations successives de la boucle ne sont pas séparés par une fin de section. Ainsi, il est possible de créer plusieurs boucles qui se chevauchent dans le temps. Les boucles peuvent aussi être imbriquées jusqu'à une profondeur de 39 niveaux.

[Avertissement] Avertissement

En raison de sérieux problèmes d'interaction avec l'expension de macro, les boucles doivent commencer et se terminer dans le même fichier, et pas à l'intérieur d'une macro.

Exemples

Voici quelques exemples des instructions { et }.

Exemple 1176. Répétition sequentielle d'une phrase de trois notes, quatre fois.

{ 4 CNT

i1  [0.00 + 0.75 * $CNT.]   0.2   220
i1  [0.25 + 0.75 * $CNT.]   .     440
i1  [0.50 + 0.75 * $CNT.]   .     880

}
        
interprété comme
i1  0.00   0.2   220
i1  0.25   .     440
i1  0.50   .     880

i1  0.75   0.2   220
i1  1.00   .     440
i1  1.25   .     880

i1  1.50   0.2   220
i1  1.75   .     440
i1  2.00   .     880

i1  2.25   0.2   220
i1  2.50   .     440
i1  2.75   .     880
        


Exemple 1177. Création d'un groupe d'harmoniques simultanés.

Dans cet exemple, p4 contient la fréquence de la note.
{ 8 PARTIAL
i1  0  1   [100 * ($PARTIAL. + 1)]
}
        
interprété comme
i1  0  1   100
i1  0  1   200
i1  0  1   300
i1  0  1   400
i1  0  1   500
i1  0  1   600
i1  0  1   700
i1  0  1   800
        


Voici un exemple complet des instructions { et }. Il utilise le fichier leftbrace.csd.

Exemple 1178. Un exemple de boucles imbriquées pour créer plusieurs clusters inharmoniques de sinus.

<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 abs.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>
nchnls = 2

gaReverbSend init 0

; a simple sine wave partial
instr 1
    idur   =       p3
    iamp   =       p4
    ifreq  =       p5
    aenv   linseg  0.0, 0.1*idur, iamp, 0.6*idur, iamp, 0.3*idur, 0.0
    aosc   oscili  aenv, ifreq, 1
           vincr   gaReverbSend, aosc
endin

; global reverb instrument
instr 2
    al, ar reverbsc gaReverbSend, gaReverbSend, 0.85, 12000
           outs     gaReverbSend+al, gaReverbSend+ar
           clear    gaReverbSend
endin

</CsInstruments>
<CsScore>
f1 0 4096 10 1

{ 4 CNT
  { 8 PARTIAL
      ;   start time     duration            amplitude          frequency
      
      i1  [0.5 * $CNT.]  [1 + ($CNT * 0.2)]  [500 + (~ * 200)]  [800 + (200 * $CNT.) + ($PARTIAL. * 20)]
  }
}

i2 0 6
e

</CsScore>
</CsoundSynthesizer>


Crédits

Auteur : Gabriel Maldonado

Nouveau dans la version 3.52 (?) de Csound. (Fixé dans la version 5.08).