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










