Les macros sont des substitutions de texte qui sont réalisées dans la partition lors de sa présentation au système. Le système de macro de Csound est très simple, et il utilise les caractères # et $ pour définir et appeler des macros. C'est un moyen de simplifier l'écriture d'une partition, et une alternative élémentaire aux systèmes de génération de partition complète. Le système de macros de partition est similaire, mais de façon indépendante, au système de macros du langage de l'orchestre.
#define NOM -- définit une macro simple. Le nom de la macro doit commencer par une lettre et peut être une combinaison de lettres et de nombres. La casse est significative. Cette forme est restrictive dans le sens que les noms de variable sont fixes. On peut obtenir plus de souplesse au moyen d'une macro avec arguments, décrite ci-dessous.
#define NOM(a' b' c') -- définit une macro avec arguments. On peut l'utiliser dans des situations plus complexes. Le nom de la macro doit commencer par une lettre et peut être suivi par une combinaison de lettres et de chiffres. Dans le texte de substitution, les arguments sont remplacés par la forme : $A. En fait, les arguments sont implémentés comme des macros simples. Il peut y avoir jusqu'à 5 arguments, et leur nom peut être n'importe quel choix de lettres. Rappelez-vous que la casse est significative dans les noms de macro.
$NOM. -- appelle une macro définie. Pour appeler une macro, on utilise son nom précédé d'un caractère $. Le nom se termine par le premier caractère qui n'est ni une lettre ni un chiffre. S'il est nécessaire que le nom soit suivi d'une lettre ou d'un chiffre, un point, qui sera ignoré, peut être utilisé pour terminer le nom. La chaîne, $NOM., est remplacée par le texte de substitution de la définition. Le texte de substitution peut aussi contenir des appels de macro.
#undef NOM -- rend un nom de macro indéfini. Si l'on a plus besoin d'une macro, on peut la rendre indéfinie avec #undef NOM.
#define NOM # texte de substitution #
#define NOM(a' b' c') # texte de substitution #
$NOM.
#undef NOM
# texte de substitution # -- Le texte de substitution est une chaîne de caractères (ne contenant pas de #) et peut s'étendre sur plusieurs lignes. Le texte de substitution est délimité par des caractères #, ce qui permet d'éviter l'insertion de caractères supplémentaires par inadvertance.
Il faut prendre quelques précautions avec les macros de substitution de texte, car elle peuvent parfois produire d'étranges résultats. Elles ne tiennent compte d'aucune valeur sémantique, et ainsi les espaces sont significatifs. C'est pourquoi, au contraire du langage C, la définition délimite le texte de substitution par des caractères #. Utilisé avec discernement, ce système de macro est un concept puissant, mais il peut aussi être mal employé.
Une autre utilisation des macros. Lorsque l'on écrit une partition complexe, on oublie parfois trop facilement à quoi les différents numéros d'instruments font référence. On peut utiliser des macros pour nommer ces nombres. Par exemple
#define Flute #i1# #define Whoop #i2# $Flute. 0 10 4000 440 $Whoop. 5 1
Exemple 1. Macro simple
Une note a un ensemble de p-champs qui sont répétés :
#define ARGS # 1.01 2.33 138# i1 0 1 8.00 1000 $ARGS i1 0 1 8.01 1500 $ARGS i1 0 1 8.02 1200 $ARGS i1 0 1 8.03 1000 $ARGS
Ce sera développé avant le tri en :
i1 0 1 8.00 1000 1.01 2.33 138 i1 0 1 8.01 1500 1.01 2.33 138 i1 0 1 8.02 1200 1.01 2.33 138 i1 0 1 8.03 1000 1.01 2.33 138
On économise ainsi de la frappe au clavier, et les révisions sont plus faciles. Avec deux ensembles de p-champs on pourrait avoir une seconde macro (il n'y pas de réelle limite au nombre de macros que l'on peut définir).
#define ARGS1 # 1.01 2.33 138# #define ARGS2 # 1.41 10.33 1.00# i1 0 1 8.00 1000 $ARGS1 i1 0 1 8.01 1500 $ARGS2 i1 0 1 8.02 1200 $ARGS1 i1 0 1 8.03 1000 $ARGS2
Exemple 2. Macros avec arguments
#define ARG(A) # 2.345 1.03 $A 234.9# i1 0 1 8.00 1000 $ARG(2.0) i1 + 1 8.01 1200 $ARG(3.0)
qui se développe en
i1 0 1 8.00 1000 2.345 1.03 2.0 234.9 i1 + 1 8.01 1200 2.345 1.03 3.0 234.9