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 -
RmsTé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 (kamplkniv_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 (kamplkniv_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-gktimedeb0.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