Créer un module cSound compatible avec Sympheo.

Ce tutorial vous apprendra à créer ou adapter des instruments cSound pour Sympheo. Il est absolument indispensable d’être familiarisé au langage de programmation cSound. Si ce n’est le cas, de nombreux tutoriaux existent sur le site www.csounds.com .


Voici un exemple de fichier .orc compatible avec Sympheo :

--------------------------------------------------------------------------------
;1ère section : les données spécifiques à Sympheo

;< info


;<     "tutorial FM" 6

;<     1:a  = id9     "amplitude"       a
;<     2:k  = id2     "frequence"       f
;<     3:t  = id3     "carrierfact"     u     def "1.0"
;<     4:k  = id7     "modfact"         u     def 0.0     min 0.0     max 2.0
;<     5:k  = id5     "indexmod"        u     def 0.0     min 0.0     max 20.0
;<     6:t  = id1     "table"           u     def "$TABLE_SINUS"


;< endinfo

; 2éme section l’opcode spécifique à cSound.

opcode     tutorialFM, a, akpkkp

      aamp, kfreq, icar, kmod, kndxmod, itable xin

      a1 foscili aamp, kfreq, icar, kmod, kndxmod, itable

      xout a1

endop
--------------------------------------------------------------------------------


Tout d’abord vous remarquerez que l’habituelle entête csound est absente. Les fichiers .orc seront inclus au final dans un seul et unique fichier .csd ou l’entête sera créé automatiquement par Sympheo au moment du calcul des sons. Chaque .udo contient un seul opcode.

Ensuite les instructions instr et endin sont remplacés par opcode et endop, celles-ci permettent d’utiliser des instruments exactement comme des opcodes internes à cSound, elles facilitent grandement l’interfaçage avec Sympheo.

            [opcode name]       [outtypes declaration],       [intypes declaration]
opcode      tutorialFM,         a,                            akpkkp

intypes: akpkkp = 1 a-rate, 3 k-rates, 2 constantes
outtypes: a = 1 a-rate channel

Les entrées et les sorties des paramètres s’effectuent respectivement avec xin et xout.
Dans notre exemple xin envoie 6 paramètres de type a,k,p,k,k et p respectivement dans aamp, kfreq, icar, kmod, kndxmod, itable. Les types doivent correspondre entre les déclarations et les variables.

xout envoie a1 dans l’unique canal de sortie.
Une description complète de ces instructions est présente dans les manuels CSound:

Etudions la section spécifique à Sympheo :

;< info


;<     "tutorial FM" 6

;<     1:a  = id9     "amplitude"       a
;<     2:k  = id2     "frequence"       f
;<     3:t  = id3     "carrierfact"     u     def "1.0"
;<     4:k  = id7     "modfact"         u     def 0.0     min 0.0     max 2.0
;<     5:k  = id5     "indexmod"        u     def 0.0     min 0.0     max 20.0
;<     6:t  = id1     "table"           u     def "$TABLE_SINUS"


;< endinfo

 


Les caractères ‘ ;< ‘ marque le début des lignes de texte utilisées par Sympheo, ceci permet la cohabition d’instructions spécifiques à cSound et Sympheo, le caractère ‘ ;’ neutralisant en commentaire tout ce qui est propre à Sympheo.

;<info et ;<endinfo marque le début et la fin du bloc descriptifs des paramètres de l’opcode

vient ensuite :

;<     "tutorial FM"     6
       [nom du module]   [ nb param]     audioin: [nbin]     audioout:[nbout]

audioin:[nbin]: le nb de canaux audio en entrée dans l’opcode, si ce paramètre est omis, nbin vaut 0 par défaut. Ce qui est le cas ici.
Une valeur > 0 implique que l’opcode sera utilisé en tant qu’effet. Cela implique aussi l’ajout de [nbin] paramètres a-rates dans le champs[intype] de l’instruction opcode.

audioout:[nbout]: le nb de canaux audio en sortie, doit correspondre avec le nombre de paramètres [outtype] de l’instruction opcode. Si ce paramètre est omis, nbout vaut 1 par défaut.

IMPORTANT: (version 0.804)
[nom du module]: ce champ doit être présent mais est aujourdhui obsolete. Depuis la version 0.804 Sympheo affiche le nom de fichier.


puis vient la description des 6 paramètres :

;<     1:a  = id9     "amplitude"       a
;<     2:k  = id2     "frequence"       f
;<     3:t  = id3     "carrierfact"     u     def "1.0"
;<     4:k  = id7     "modfact"         u     def 0.0     min 0.0     max 2.0
;<     5:k  = id5     "indexmod"        u     def 0.0     min 0.0     max 20.0
;<     6:t  = id1     "table"           u     def "$TABLE_SINUS"

;<    [oppar]:[opdat] = id[sppar] [nom] [unit]   def [defval]   min [minval]   max [maxval]


oppar : numéro de paramètre dans l’opcode, de 1 à nb param. (Maximum 24)

opdat : le type de données envoyées dans l’opcode

a = a-rate
k = k-rate
ak = a-rate & k-rate

t = constante alphanumérique transmises telle quelle à l’opcode, définir absolument une valeur par défaut entre guillemet, def "mytext".


sppar: numéro d’id du paramètre dans Sympheo. Placez ce que vous voulez comme numéro (de 1 à 128)

nom: le nom du paramètre, l’écrire entre guillemet.


unit: définit le type d’unité spécifique à sound palette.
a = amplitude
f = fréquence
u = utilisateur, dans ce cas les valeurs def, min, max doivent être définies.

Remarque : pour l’amplitude et la frequence il est possible de préciser le numéro de partielle du paramètre de la façon suivante: a1, a2, f4…


defval : la valeur d’initialisation par défaut comprise entre minval et maxval

minval et maxval : définissent les valeurs extrêmes de l’échelle dans « l’editeur graphique » spécifique à ce paramètre.

Defval, minval et maxval s’utilisent uniquement pour les paramètres utilisateur (u)


Voici un exemple d’opcode gérant plusieurs entrées et sorties.
Remarquez que le nombre de canaux définis par audioin et audioout se répercute directement sur les champs[outtype] et [intypes] de l’instruction opcode. Ceci est mis en évidence par la couleur.


---------------------------------------------------------
;1ère section : les données spécifiques à Sympheo

;< info

;<     "stereo pan1" 1         audioin: 2     audioout:2

;<     1:a = id2     "pan"     u     def 0.5     min 0.0     max 1.0

;< endinfo

; 2éme section l’opcode spécifique à cSound.
opcode stereopan1, aa,aaa

    apan, aleft, aright  xin

    a1 = aleft*apan
    a2 = aright*(1.0-apan)

xout a1,a2

; WARNING bug si on utilise directement les params de xin en sortie.
;xout aleft*kpan, aright*(1.0-kpan)

endop
-------------------------------------------------------


La gestion des tables :

Les tables tiennent un rôle important dans l’architecture de cSound, voici comment elles sont gérées par Sympheo :

Les tables servent à communiquer les données des courbes aux opcodes, par conséquent une gestion rigoureuse des numéros de table est indispensable. Pour éviter tout conflit avec les tables internes à Sympheo les tables utilisateur n’ont pas de numéros mais uniquement un label alphanumérique.

Elles sont déclarées de la façon suivante :

;< table

;<     f $TABLE_SINUS      0 16384 10 1
;<     f $TABLE_SAWTOOTH   0 16384 7  1 16384 -1
;<     f $TABLE_SQUARE     0 512   7  1 256 1 0 -1 256 -1

;< endtable


entre les mots-clés ;< table et ;< endtable se trouve la description des tables conformément au modèle cSound.

Chaque table doit tenir sur une seule ligne et doit débuter par ;<

A la place du numéro de la table il y a un nom précédé impérativement d’un $, ce nom est un define  pour csound. Inutile d’utiliser l’instruction #define , Sympheo se charge de la créer automatiquement après analyse du texte. Les autres paramètres sont conformes à cSound.

Où écrire ces tables ?

- Dans le fichier common.tbl :
Placez-y les tables globales et standards communes à plusieurs opcodes.


- Dans les fichiers .orc :
Pour créer des tables spécifiques à un opcode. Cependant elles seront au final gérées globalement au même titre que common.tbl. Donc attention aux éventuels conflits entre les opcodes et common.tbl

Exemple d’utilisation :

---------------------------------------------------------
;1ère section : les données spécifiques à Sympheo

;< info

;<     "granular" 4

;<     1:a = id1     "amplitude"       a
;<     2:k = id2     "frequence"       f
;<     3:k = id3     "density"         u     def 100   min .01   max 2000
;<     4:k = id4     "freq offset"     u     def .5    min 0     max 1


;< endinfo


; les tables spécifiques à cet opcode.
;< table

;<     f $TABLE_WFRM         0 1024 10 1 0 .2 .2 .03 .12 .22 .11 .022 .0101 .0167
;<     f $TABLE_GRAIN_ENVEL1 0 1024 8 0 512 1 512 0

;< endtable


; 2éme section l’opcode spécifique à cSound.
opcode grain, a, akkk

    aampl, kfrq, kdens, kfoff xin

    a1 grain aampl,kfrq, kdens, 10000, kfrq* kfoff, .2, $TABLE_WFRM, $TABLE_GRAIN_ENVEL1, 5

    xout a1

endop
---------------------------------------------------------


Cet autre exemple met en évidence l’utilisation du numéro de partielle (optionel). Il permet, lors de l’édition graphique de ce paramètre, de dessiner directement des courbes proportionnellement à la fondamentale suivant son rang harmonique. Par défaut le numéro de partielle = 1 soit la fondamentale.
Ici nous avons 8 ondes sinusoidales correspondant à la fondamentale plus 7 partielles, elles sont paramètrées chacune par 2 courbes (amplitude et fréquence).
---------------------------------------------------------
;1ère section : les données spécifiques à Sympheo

;<info

;< "additive synth8" 16

;<       1:a = id1       "amplitude1"       a1       ;amplitude fondamentale
;<       2:a = id2       "amplitude2"       a2       ; partielle de rang 2
;<       3:a = id3       "amplitude3"       a3       ; partielle de rang 3
;<       4:a = id4       "amplitude4"       a4       ; etc...
;<       5:a = id5       "amplitude5"       a5
;<       6:a = id6       "amplitude6"       a6
;<       7:a = id7       "amplitude7"       a7
;<       8:a = id8       "amplitude8"       a8

;<       9:a = id21        "frequence1"     f1 ;frequence fondamentale
;<       10:a = id22       "frequence2"     f2 ; partielle de rang 2
;<       11:a = id23       "frequence3"     f3 ; partielle de rang 3
;<       12:a = id24       "frequence4"     f4 ; etc...
;<       13:a = id25       "frequence5"     f5
;<       14:a = id26       "frequence6"     f6
;<       15:a = id27       "frequence7"     f7
;<       16:a = id28       "frequence8"     f8

;<endinfo

; 2éme section l’opcode spécifique à cSound.
opcode addsynth8, a,aaaaaaaaaaaaaaaa

      aampl1, aampl2, aampl3, aampl4, aampl5, aampl6, aampl7, aampl8, afreq1, afreq2, afreq3, afreq4, afreq5, afreq6, afreq7, afreq8 xin

      a2 = 0

      a1 oscil aampl1, afreq1, $TABLE_SINUS ; fondamentale
      a2 = a2 + a1

      a1 oscil aampl2, afreq2, $TABLE_SINUS ; partielle de rang 2
      a2 = a2 + a1

      a1 oscil aampl3, afreq3, $TABLE_SINUS ; partielle de rang 3
      a2 = a2 + a1

      a1 oscil aampl4, afreq4, $TABLE_SINUS ; etc…
      a2 = a2 + a1

      a1 oscil aampl5, afreq5, $TABLE_SINUS
      a2 = a2 + a1

      a1 oscil aampl6, afreq6, $TABLE_SINUS
      a2 = a2 + a1

      a1 oscil aampl7, afreq7, $TABLE_SINUS
      a2 = a2 + a1

      a1 oscil aampl8, afreq8, $TABLE_SINUS
      a2 = a2 + a1

      xout a2

endop
-------------------------------------------------------