{ — Commence une boucle imbriquable, sans section.
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.
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).
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 | |
---|---|
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. |
Voici quelques exemples des instructions { et }.
Exemple 1271. 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 1272. Création d'un groupe d'harmoniques simultanés.
{ 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 1273. 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>