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›