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

mardi 28 juillet 2009

Kazoo 2

Voici une nouvelle version du programme. Les notes sifflées sont maintenant enregistrées dans un fichier de partition (my.sco) pour pouvoir être rejouées, modifiées, etc.
Télécharger ici : Kazoo2
Le code est commenté (au mieux).
Il est nécessaire de quitter le programme en cliquant sur le bouton [Quit]. Sinon le fichier de partition "my.sco" restera vide. En effet, l'opcode fprints n'enregistre le fichier sur le disque qu'en fin de note. Il faut donc quitter le programme 'proprement'.

La partition peut être rejouées comme ceci :



; Audio out Audio in No messages
-odac -iadc -d ;;;RT audio I/O
 




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

instr 1
kenv linseg 0, p3*0.1, 1, p3*0.5, 0
a1 oscil 50000*kenv, p4*2, 1
out a1
endin
 





f 1 0 8192 10 1
f 2 0 8192 10 1 0 .5 0 .25 0 .125 0 .0625

#include "my.sco" ; ici l'import du fichier
e




dimanche 19 juillet 2009

Kazoo

Vous connaissez le kazoo ?
Ici l'idée est la même : transformer un son en notes de musique.
Les notes sont sifflées dans le micro, les hauteurs et durées sont extraites par le programme puis jouées en temps réel et s'affichent a l'écran.

Deux opcodes sont utilisés : rms et ptrack.
Rms mesure l'amplitude et détecte le début et la fin de la note, ptrack mesure sa fréquence.
Voici mes sources au sujet de ces opcodes :
MUS 1321 > La spatialisation et le traitement de la dynamique > B3--La porte de bruit (Noise Gate)
Et aussi : Le vocodeur > C3--Le vocodeur de phase dans Csound. L'opcode ptrack utilise le même type d'analyse que l'opcode pvsanal décrit dans l'article.
Sur Wikipédia : Série de Fourier - Rms

Télécharger le fichier : kazoo.csd


‹CsoundSynthesizer›
‹CsOptions›
; Audio out Audio in No messages
-odac -iadc -d ;;;RT audio I/O

‹/CsOptions›
‹CsInstruments›

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

;---------------------------------------------------------
;fenetre | larg| haut| x| y
FLpanel "testFLTK.csd", 490, 130, 10, 300
;VALUE_DISPLAY_BOXES WIDTH | HEIGHT| X | Y
idp6 FLvalue "niv deb p6", 70, 18, 5, 5
idp7 FLvalue "niv fin p7", 70, 18, 5, 35
;SLIDERS | HANDLE MIN| MAX| EXP| TYPE| DISP| WIDTH| HEIGHT| X | Y
gkp6, ihp6 FLslider "", 0, 1000, 0, 3, idp6, 400, 25, 80, 5
gkp7, ihp7 FLslider "", 0, 1000, 0, 3, idp7, 400, 25, 80, 35
;SET_INITIAL_VALUES | VALUE | HANDLE
FLsetVal_i 500, ihp6
FLsetVal_i 250, ihp7
FLpanel_end ;END OF PANEL CONTENTS
FLrun ;RUN THE FLTK WIDGET THREAD
;--------------------------------------------------------------------------

instr 9
gkplay = 0 ; 0/1 si 1 : joue la note
gkend = 0 ; 0/1 si 1 : termine la note
gkfreq = 0 ; freq a 0.6s du début
gktimedeb = 0 ; début de la note
endin


instr 1
kniv_h =gkp6 ; niveau rms de debut de note
kniv_b =gkp7 ; niveau rms de fin de note (plus bas)

asig in
kampl rms asig ; analyse rms du niveau

if (kampl›kniv_h) && (gkplay=0) then
gkplay=1
gkend=0
gktimedeb times
event "i", 2, 0, 60 ; "i", inst, init, p3_durée [, kp4] [, kp5]
endif
if (kampl‹kniv_b) && (gkplay=1) then
gkplay=0
gkend=1
endif
endin

instr 2
asig in
kf,ka ptrack asig, 1024 ; 128 256 512 1024 2048 ;ptrack asig, ihopsize[,ipeaks]
; taille de la fenetre d'analyse (paramètre essentiel)

ktime times ; on affiche l'évolution de la freq tous les 0.2s
printks "ktime=%f, kf=%f\\n", 0.02, ktime, kf ;echantillonage 0.00976563

if (ktime-gktimedeb‹0.06) then
gkfreq=kf ;on note la freq a 0.06s du début
endif

if (gkplay==0) then ; en fin de note on affiche les infos
printks "i---- %f %f %f\\n", 1, gktimedeb, ktime-gktimedeb, gkfreq
gkend=1
endif

if (gkend==0) then ; gkend sert a terminer la note proprement (sans tack)
kenv linseg 0, 0.06, 1
gkf=kf
else
kenv linseg 1, 0.06, 0
if (kenv==0) then
turnoff ; on termine la note
endif
endif

a1 oscili 50000*kenv, gkf, 2
out a1
endin

‹/CsInstruments›
‹CsScore›
f 1 0 8192 10 1
f 2 0 8192 10 1 0 .5 0 .25 0 .125 0 .0625

i 1 0.1 480
e

‹/CsScore›
‹/CsoundSynthesizer›

samedi 24 janvier 2009

Composition d'une partition

Composer une partition en rentrant des chiffres les uns a la suite des autres peut être laborieux. Une solution consiste donc a utiliser un clavier midi. Une autre solution : siffler les notes dans un micro puis les extraire avec un logiciel d'analyse audio. J'ai utilisé sonic-visualiser et son Vamp Plugins. Pour tout dire, je n'ai pas vraiment tout compris mais je vais décrire brièvement la méthode utilisée. La première chose a faire est donc d'enregistrer un son de quelques notes. Lancer sonic-visualiser et importer le son. Un outil "main" permet de déplacer le signal de droite a gauche et la molette de la souris de zoomer. Un outil "flèche" permet de sélectionner une portion de son et 2 boutons permettent de ne jouer que cette sélection et en boucle (très pratique).



Ouvrir un nouveau "Pane" (menu Pane>New). Cela ouvre un panneau vide dans la partie inférieure de l'écran. Appliquer le filtre magique : menu Transform > Analysis by categories > Visualisation > Constant Q-Spectrogramme.



Les options "Tunning Frequency" et "Bins per Octave" peuvent rester a 440 et 12. Les options Min et Max Pitch servent a sélectionner la plage de fréquences.
Voila ce que ça donne :



L'axe vertical indique la fréquence du son. Lorsque l'on survole un pavé coloré, l'instant et la note sont données dans l'encart en haut à droite. Dans notre exemple : 2.832 seconde et la note E (en midi : [17]). La correspondance des notes avec leurs fréquences se trouve ici.
Il suffit maintenant de relever les notes et les "instants". Dans notre exemple, on pourra remarquer que les notes apparaissent 2 fois avec un octave de décalage. C'est là un phénomène dût à la voix. En passant du "doum doum doum" au "mmmm mmm mmmm", il y en a trois ! Mais l'écart étant d'un octave, la note est bien la même. Il faut juste faire attention a ne pas passer d'un octave a l'autre au cours du relevé.
Voici ma partition :

f1 0 8192 10 1
; p3 p4 p5
; dur amp cps
r 10
i1 0.882 0.3 10000 58.270
i1 1.207 . 10000 43.654
i1 1.486 . 10000 36.708
i1 1.834 . 10000 30.868
i1 2.182 . 10000 25.957
i1 2.507 . 10000 20.602
i1 2.832 . 10000 21.827
s
e


Curieusement, les notes relevées sont trop basses et peu audibles. J'ai multiplier par 4 la fréquence.




jeudi 22 janvier 2009

Boucles

Avec les "Instructions de Partition" il est possible de faire des "boucles" de notes.
exemple :

f 1 0 4096 10 1 ;A SINE WAVE
;--------------------------------------------------------------------------
; p1 p2 p3 p4 p5 p6 p7 p8 p9
; ins init dur amp freq c m index table d'onde
r 30 freq
i 1 0.5 2 10000 [130.8] 4.02 2.001 8 1
i 1 0.3 2 5000 [329.6] 2.02 3.003 5 1
i 1 0.1 2 6000 [440] 1.02 5.005 3 1
s
e


Ces 3 notes seront jouées 30 fois.
r — Débute une section répétée.
s — Marque la fin d'une section.
Cela couplé avec des variateurs graphiques additionnés sur certaines variables de l'opcode.

Une version du "Manuel de Référence Canonique de Csound" existe en français et peut être téléchargée Ici.


jeudi 15 janvier 2009

Lien

Réf : Initiation à la synthèse sonore avec Csound

Cet article répond à beaucoup de questions générales autours de Csound et sur sa façon de travailler.


mardi 13 janvier 2009

Realtime

Csound intègre dans sa version 5, un langage pour réaliser simplement une interface graphique permettant d'intervenir sur le son en temps réel. En effet, pour explorer toutes les possibilités des opcodes, il est très intéressant de pouvoir créer rapidement un curseur ou deux, qui vont interagir sur les variables qui nous intéressent.

Un exemple d'interface :



Le contenu du fichier testFLTK.csd :

‹csoundsynthesizer›
‹csoptions›
-odevaudio -b400
‹/csoptions›

‹csinstruments›

sr = 44100 ;SAMPLE RATE
kr = 4410 ;CONTROL RATE
ksmps = 10 ;NUMBER OF AUDIO SAMPLES IN EACH CONTROL CYCLE
nchnls = 1 ;NUMBER OF CHANNELS (2=STEREO)

; fenetre | larg | haut | x | y
FLpanel "testFLTK.csd", 490, 100, 10, 300

;VALUE_DISPLAY_BOXES WIDTH | HEIGHT | X | Y
idamp FLvalue " ", 70, 18, 5, 5
idfreq FLvalue " ", 70, 18, 5, 45

;SLIDERS | HANDLE MIN | MAX | EXP | TYPE | DISP | WIDTH|HEIGHT| X | Y
gkPartAmpl, ihPartAmpl FLslider "Ampl", 0, 5000, 0, 3, idamp, 400, 25, 80, 5
gkPartFreq, ihPartFreq FLslider "Freq", 50, 2000, 0, 3, idfreq, 400, 25, 80, 45

;SET_INITIAL_VALUES | VALUE | HANDLE
FLsetVal_i 1000, ihPartAmpl
FLsetVal_i 440, ihPartFreq

FLpanel_end ;END OF PANEL CONTENTS
FLrun ;RUN THE FLTK WIDGET THREAD

instr 1

;OUTPUT OPCODE AMPLITUDE | FREQUENCY | FUNCTION_TABLE
a1 oscil gkPartAmpl, gkPartFreq, 1

out a1
endin

‹/csinstruments›

‹csscore›
f 1 0 4096 10 1 ;A SINE WAVE
;INSTR | START | DURATION
i1 0 3600 ;DUMMY SCORE EVENT - ALLOWS REALTIME PERFORMANCE FOR UP TO 1 HOUR
‹/csscore›

‹/csoundsynthesizer›


La commande pour lancer le programme :

csound testFLTK.csd


Quelques liens :

Csound Realtime FLTK Examples
FLTK Widgets and GUI controllers

Les balises ‹csoptions› contiennent les options du lancement de Csound. Ce sont elles qui dirigent le son de sortie vers la carte audio, en temps réel.

Command-line Flags (by Category)


samedi 10 janvier 2009

Gen10

Voici comment générer la fonction (ou table d'onde) :
exemple d'une sinusoïde :

f1 0 8192 10 1




Les paramètres de la fonction :

  • le n° de la fonction : 1
  • temps d'initialisation (toujours a 0 (pour le moment...))
  • définition d'échantillonnage : 8192 (ça correspond au nombre de pixels pour les photos)
  • N° du sous-programme GEN (dans notre cas: GEN10 (il en existe plus de 20...))
  • paramètre(s) du sous programme GEN (ici 1 : simple sinusoïde)
GEN10 génère des formes d'onde complexes constituées d'une somme de simples sinusoïdes pondérées;

Voici un extrait d'une documention de Csound :

Le générateur GEN 10 peut être utilisé pour faire de nombreuses autres formes d'onde en dehors des ondes sinusoïdales en ajoutant des nombres (ou paramètres). La première composante du son est généralement appelé le fondamental. C'est la base de la fréquence du son. Si seul le fondamental est spécifié, la table contient exactement un cycle de la forme d'une onde sinusoïdale. Les nombres suivants se réfèrent à la hausse des harmoniques ou partiels. Ils sont généralement appelés la première harmonique, deuxième harmonique, troisième harmonique etc. La première harmonique a deux fois la fréquence du fondamental. Cela signifie que deux cycles complets d'une onde sinusoïdale se place dans la table. La hauteur de la première harmonique est d'une octave plus haute que le fondamental. La seconde harmonique est de trois fois la fréquence du fondamental et est de trois octaves plus élevée. Dans la table d'onde suivante, une onde sinusoïdale d'une octave et demie plus élevée que le fondamental, est ajoutée a l'onde originale :

f2 0 8192 10 1 0.5




Autres exemples
Signal en dents de scie :

f3 0 8192 10 1 .5 .333333 .25 .2 .166667 .142857 .125 .111111 .1 .090909 .083333 .076923 ;Saw




Signal carré :

f4 0 8192 10 1 0 .333333 0 .2 0 .142857 0 .111111 0 .090909 0 .076923 ;Square




Un autre exemple avec ici la 1ère harmonique à 1 :

f5 0 8192 10 1 1




Enfin, les articles de Wikipédia au sujet des harmoniques
et du timbre


mercredi 7 janvier 2009

Deb 3

C'est ma 3ème tentative, de découverte de CSound. La doc proposée de CSound est un peu ardue pour un vrai débutant comme moi, n'ayant aucune notions ni de musique ni d'acoustique. Celle-ci se trouve ici : Introduction à la création sonore avec Csound (de Richard Boulanger). C'est LA référence et une excellente documentation, plébiscitée partout sur le net, mais un peu ardue.

La doc du CSound book démarre avec 6 instruments. Le premier, très simple, utilise une table d'onde :

instr 101 ;OSCILLATEUR SIMPLE
a1 oscil 10000, 440, 1
out a1
endin


Les paramètres de l'opcode oscil sont :
  1. l'amplitude : 10000
  2. la fréquence (en Hz) : 440
  3. la table d'onde utilisée : 1
Cette table d'onde décrit la forme du signal. Elle se définie comme ceci :

f1 0 4096 10 1 ;une sinusoïde


La variable a1 correspond à la sortie de l'oscillateur, elle est redirigée vers la carte son de l'ordinateur :
out a1.
Viens ensuite de code de la "note" :

; instrument / temps d'initialisation / durée
; P1 P2 P3
i 101 0 3


L'ensemble de ce code permet de sortir un son de 3 secondes.
C'est le son le plus basique : une sinusoïdale.

Comment visualiser la forme de cette onde ? et comment fonctionnent les paramètres de cette table d'onde ?
- Ecrire ce fichier son en .wav sur le disque dur et l'ouvrir dans un éditeur audio. Par exemple Audacity.
Voici la forme du signal :