#define
Précédent | Opcodes et opérateurs de l'orchestre | Suivant

## #define

#define — Définit une macro.

## Description

Les macros sont des substitutions de texte qui sont faites dans l'orchestre lors de sa lecture. Le système de macro de Csound est très simple, et il utilise les caractères # et $ pour définir et appeler les macros. Il permet d'économiser de la frappe et peut conduire à une structure cohérente dans un style consistant. Il est similaire, tout en étant indépendant, au système de macros du langage de partition.

#define NOM -- définit une macro simple. Le nom de la macro doit commencer par une lettre et peut comprendre n'importe quelle combinaison de lettres et de chiffres. La casse est significative. Cette forme est limitée dans le sens que les noms de variable sont fixes. On peut obtenir plus de flexibilité en utilisant 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 comprendre n'importe quelle combinaison de lettres et de chiffres. Dans le texte de substitution, les arguments sont appelés sous la forme : $A. En fait, l'implémentation définit les arguments comme des macros simples. Il peut y avoir jusqu'à 5 arguments, et les noms sont une combinaison quelconque de lettres. Souvenez-vous que la casse est significative dans les noms de macro.

## Syntaxe

    #define NOM # texte de substitution #

    #define NOM(a' b' c') # texte de substitution #

## Initialisation

# 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 entouré par des caractères #, ce qui garantit qu'aucun caractère supplémentaire ne sera capturé par inadvertance.

## Exécution

Il faut prendre certaines précautions avec les macros de substitution de texte, car elles 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é.

## Exemples

Voici un exemple simple de définition de macro. Il utilise le fichier define.csd.

Exemple 14. Exemple simple de définition de macro.

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    No messages
    -odac           -iadc     -d     ;;;RT audio I/O
    ; For Non-realtime ouput leave only the line below:
    ; -o define.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    ; Initialize the global variables.
    sr = 44100
    kr = 4410
    ksmps = 10
    nchnls = 1

    ; Define the macros.
    #define VOLUME #5000#
    #define FREQ #440#
    #define TABLE #1#

    ; Instrument #1
    instr 1
      ; Use the macros.
      ; This will be expanded to "a1 oscil 5000, 440, 1".
      a1 oscil $VOLUME, $FREQ, $TABLE

      ; Send it to the output.
      out a1
    endin

    </CsInstruments>
    <CsScore>

    ; Define Table #1 with an ordinary sine wave.
    f 1 0 32768 10 1

    ; Play Instrument #1 for two seconds.
    i 1 0 2
    e

    </CsScore>
    </CsoundSynthesizer>

Sa sortie présentera des lignes comme celles-ci :

    Macro definition for VOLUME
    Macro definition for CPS
    Macro definition for TABLE

Voici un exemple simple de définition de macro avec arguments. Il utilise le fichier define_args.csd.

Exemple 15. Exemple simple de définition de macro avec arguments.

    <CsoundSynthesizer>
    <CsOptions>
    ; Select audio/midi flags here according to platform
    ; Audio out   Audio in    No messages
    -odac           -iadc     -d     ;;;RT audio I/O
    ; For Non-realtime ouput leave only the line below:
    ; -o define_args.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    ; Initialize the global variables.
    sr = 44100
    kr = 4410
    ksmps = 10
    nchnls = 1

    ; Define the oscillator macro.
    #define OSCMACRO(VOLUME'FREQ'TABLE) #oscil $VOLUME, $FREQ, $TABLE#

    ; Instrument #1
    instr 1
      ; Use the oscillator macro.
      ; This will be expanded to "a1 oscil 5000, 440, 1".
      a1 $OSCMACRO(5000'440'1)

      ; Send it to the output.
      out a1
    endin

    </CsInstruments>
    <CsScore>

    ; Define Table #1 with an ordinary sine wave.
    f 1 0 32768 10 1

    ; Play Instrument #1 for two seconds.
    i 1 0 2
    e

    </CsScore>
    </CsoundSynthesizer>

Sa sortie présentera des lignes comme celle-ci :

    Macro definition for OSCMACRO

## Macros Prédéfinies de Constantes Mathématiques

A partir de Csound 5.04 des Macros de Constantes Mathématiques sont prédéfinies. Les valeurs définies sont celles que l'on trouve dans le fichier d'en-tête C math.h, et elles sont automatiquement définies au démarrage de Csound et disponibles pour une utilisation dans les orchestres.

Macro | Valeur | Equivalent à
--- | --- | ---
$M_E | 2.7182818284590452354 | e
$M_LOG2E | 1.4426950408889634074 | log_2(e)
$M_LOG10E | 0.43429448190325182765 | log_10(e)
$M_LN2 | 0.69314718055994530942 | log_e(2)
$M_LN10 | 2.30258509299404568402 | log_e(10)
$M_PI | 3.14159265358979323846 | pi
$M_PI_2 | 1.57079632679489661923 | pi/2
$M_PI_4 | 0.78539816339744830962 | pi/4
$M_1_PI | 0.31830988618379067154 | 1/pi
$M_2_PI | 0.63661977236758134308 | 2/pi
$M_2_SQRTPI | 1.12837916709551257390 | 2/sqrt(pi)
$M_SQRT2 | 1.41421356237309504880 | sqrt(2)
$M_SQRT1_2 | 0.70710678118654752440 | 1/sqrt(2)

## Voir aussi

$NOM, #undef

## Crédits

Auteur : John ffitch
University of Bath/Codemist Ltd.
Bath, UK
Avril 1998

Exemples écrits par Kevin Conder.

Nouveau dans la version 3.48 de Csound

Précédent | Niveau supérieur | Suivant
!= | Sommaire | #include