jeudi 3 septembre 2009

GEN23 et partitions

La table de fonction GEN23 permet de lire les valeurs contenues dans un fichier texte. Ce dernier doit contenir une liste de nombres séparées par des espaces ou des sauts de lignes. Ces données sont ensuite accessibles grâce à l'opcode tab et grâce aussi a leurs index dans la liste (0 pour le premier, 1 pour le deuxième, etc.).
Exemple de définition de la fonction GEN23 :

f7 0 0 -23 "nomfichier.txt"

L'opcode tab :

kval tab kndx, 7

kndx permet de spécifier l'index de la valeur a récupérer.
7 ici fait référence a la table de fonction f7.
kval contient la valeur récupérée.

Partition dans une table

Nous pouvons remplir nos fichiers de toutes sortes de valeurs (chiffres, textes, code, etc.). A nous donc d'établir un format de données.
Voici une proposition de fichier :

7.07 100
7.09 25
7.07 25
7.11 50
-1 0

1ère colonne : une fréquence exprimée en octave point classe
2ème colonne : une durée en centième de seconde
Dernière ligne : un code de bouclage

Quel intérêt ?
Compléter la partition standard. Cela permet notamment plusieurs choses intéressantes :
- Scinder les colonnes p-champs en plusieurs fichiers.
- Chaque valeur de p-champ aura donc sa propre durée.
- Utiliser un autre programme pour enregistrer des données dans ces partitions.

Pour une utilisation confortable de ces fichiers, il est intéressant de placer tout le code de lecture des tables dans un opcode utilisateur. Celui-ci recevra en paramètres d'entrée la table plus quelques options (valeur fixe sur la durée ou évolution linéaire jusqu'à la prochaine valeur, format d'expression des fréquences) et fournira en sortie la valeur lue au taux k.

table5.csd

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
; Audio out Audio in No messages
-odac -iadc -d ;;;RT audio I/O
;-o aa.wav
</CsOptions>
<CsInstruments>

sr = 44100
kr = 4410
ksmps = 10
nchnls = 1

opcode lectgen, kk, iii

itab, iopt, ipck xin ; N° de table de fonction
; 0:freq fixe 1:ka vers kb linéaire
; 1:fréquences données en octave point classe

ka init 0 ;valeur note
kdurek init 0 ;duree note au taux k
kb init 0 ;valeur note suivante
kitab init 0 ;increment lecture dans la table
kik init 0 ;increment au taux k

if kik==kdurek then
kik=0
ka tab kitab, itab
kduree tab kitab+1, itab
kdurek=int(kduree*44.1)
kb tab kitab+2, itab
if kb<0 then ;test si boucle
kitab=0
kb tab kitab, itab ;retour au début
else
kitab=kitab+2
endif
if ipck==1 then ;convertion si octave point classe
ka=cpspch(ka)
kb=cpspch(kb)
endif
else
kik=kik+1
endif

if iopt==0 then
kout=ka
endif
if iopt==1 then
kout=(kb-ka)*(kik/kdurek)+ka
endif
xout kout, kduree

endop

instr 1

kamp,kduree lectgen 6, 1, 0
kfr,kd lectgen 5, 1, 1

a3 oscili kamp, kfr, 1

outs a3

endin

</CsInstruments>
<CsScore>

f1 0 1024 10 1
f5 0 0 23 "table5.g23"
f6 0 0 23 "table6.g23"

i1 0 60

</CsScore>
</CsoundSynthesizer>

Le fichier "table5.g23" :

7.00 10
7.00 0
7.02 10
7.02 0
7.04 10
7.04 0
7.05 10
7.05 0
7.07 10
7.07 0
7.09 10
7.09 0
7.11 10
7.11 0
8.00 10
8.00 0
7.00 120
9.00 90
9.00 30
-1 0

Le fichier "table6.g23" :

5000 20
10 10
10 20
5000 10
-1 0

Le résultat : gen23.ogg