GuitarCure Première Soutenance Rapport de Soutenance

Transcription

GuitarCure Première Soutenance Rapport de Soutenance
GuitarCure Première Soutenance
Rapport de Soutenance
Candelaresi Raphaël candel_r
Goyard Alexandre goyard_a
Tilatti Alban tilatt_a
Lhuillier Gaëtan lhuill_g
10 février 2009
1
GuitarCure
Table des Matières
1
Présentation du projet
3
2
Résumé de l'épisode précédent
3
3
L'avancement du projet
4
4
Acquisition du son
4
5
Interface
5
6
Traitement du son
8
7
Site Web
11
8
Conclusion
12
5.1 Interfacage C/Caml . . . . . . . . . . . . . . . . . . . . . . . .
5.1.1 Appel d'une fonction C depuis Caml . . . . . . . . . .
5.1.2 Appel d'une fonction Caml depuis C . . . . . . . . . .
6.1 Recherche de la note . . . . . . . . . . . . . . . . . . . . . . .
6.2 Accordeur digital . . . . . . . . . . . . . . . . . . . . . . . . .
6.3 Reconnaissance des notes et des accords . . . . . . . . . . . .
2
5
5
6
8
9
9
GuitarCure
1
Présentation du pro jet
Guitare Cure est un projet qui a pris sa source dans les rêves des guitaristes. Rien de plus pratique que de pouvoir faire une improvisation avec sa
guitare sans avoir à s'arrêter en plein milieu pour noter ce qu'on joue quand
ça nous plait. Mettre en tablature vos compositions sera une simplicité grâce
à notre projet.
Notre priorité a été de ne pas reproduire les mêmes erreurs que nous avions
faites dans nos groupes respectifs l'année précédente. Nous nous sommes penchés sur des sujets tels que le périmètre de notre projet ou encore les solutions
à nos problèmes fondamentaux. Ainsi, le logiciel que nous allons programmer
a été déni de façon plus précise an de pouvoir programmer sans mauvaise
surprise. Nous devons tendre vers un logiciel de création, c'est-à-dire que
nous ne gèrerons pas la reconnaissance des éléments technique qu'un guitariste ferait dans une musique construite. Ceci permet de pouvoir bien dénir
les problèmes qui nous font face tout en respectant le but de notre projet.
2
Résumé de l'épisode précédent
Quoi ? ? ! ! Comment ça il y a pas d'épisode précédent !
Mais c'est pas possible on me dis jamais rien à moi.
3
GuitarCure
3
L'avancement du pro jet
Le projet GuitarCure en est maintenant à la n de la première étape de
sa création.
Nous allons pouvoir vous montrer l'avancement du projet selon les diérentes
parties dont nous nous sommes occupés jusque là :
4
Acquisition du son
Il est nécessaire de transformer le son en quelque chose qui peut être analysé .
Le but de cette partie est de récupérer un tableau de réels (type double)
représentants le signal sonore.
J'ai donc utilisé l'implémentation de la librairie OSS sur FreeBSD pour avoir
accès à la carte son. L'avantage de cette solution est que nous pouvons utiliser les fonctions standards de la libc.
Le chier d'interface avec la carte son est /dev/dsp, donc la gestion est laissée au noyau du système. On peut modier la plupart des paramètres de la
carte son avec la fonction ioctl. La lecture et l'écriture sur le chier /dev/dsp
se fait avec les fonctions standards de la libc : open , read et write. Le tableau résultant va être ensuite utilisé par les fonctions d'analyse de Fourier
en Caml.
Pour tester mon acquisition j'utilise la bibliothèque graphics de caml. Ca me
permet d'acher le signal et de le comparer avec un logiciel comme audacity.
screenshot du test
4
GuitarCure
5
Interface
J'ai utilisé la bibliothèque GTK pour acher l'interface. Pour la première
soutenance l'interface dispose d'un bouton permettant de verier l 'accord
ainsi que d'un menu déroulant pour choisir une note à tester. Le résultat de
la vérication est aché grace à un carré changeant de couleur selon le résultat. Pour le dessin vectoriel du carré j'ai utilisé la bibliothèque cairo allant
tout naturellment avec GTK.
Screenshot de notre interface
La principale diculté fut l'interfaçage entre le caml et le C. Des fonctions caml doivent être appelées depuis le code C , pour cela j'ai utilisé des
callbacks. On associe une fonction à un callback dans le code caml , ensuite
on appelle ce callback depuis le C.Les données en caml et en C ne sont pas
les même car Ocaml dispose d'un garbage collector et a donc besoin de plus
d'informations.
Il faut donc convertir les données de C en type caml et vice versa , des macros
et des fonctions sont fournis par Ocaml.
Des macros permettant également de faire gérer en C des composants caml
par le Garbage collector de OCaml. Mais Dr Robotnik etait la pour nous
détendre face au d'erreurs à la compilation. C'est grace à Alexandre Goyard
que nous avons ni cette partie nécessaire du projet.
5.1
Interfacage C/Caml
Le dialogue entre C et Caml est une chose simple car la documentation de
Caml nous l'explique bien. Nous allons voir comment fait-on pour appeller
une fonction C depuis Caml et inversement.
5.1.1
Appel d'une fonction C depuis Caml
Dans le code Caml il sut de donner le prototype de la fonction.
external f : int -> int-> int -> int = "fun_c"
Voila le code de la fonction C qui est appelé par Caml.
value fun_c(value x, value y, value z)
{
return Val_long(Long_val(x) + Long_val(y) + long_val(z))
}
5
GuitarCure
value et Long_val sont des type fournit par Caml, qu'il sut d'inclure
dans le chier C. Pour exécuter la fonction depuis Caml il sut de l'appeler
par sont nom donné dans le code Caml précédent.
let result = f 1 2 3;;
Pour nir il sut d'ajouter au compilateur C où sont le chier d'include
Caml.
5.1.2
Appel d'une fonction Caml depuis C
L'appel d'une fonction Caml depuis C est plus dicile mais la document
aide bien pour comprendre.
Pour que C puisse appeler la fonction Caml il faut l'enregistrer dans le
callback. Voici comment faire.
let mult2 x = 2 * x;;
let _ = Callback.register "fois2" mult2
Le plus simple est fait. Il faut maintenant appeler la fonction Caml depuis
C. Voici le code C qui permet l'appel.
#include
#include
#include
#include
<stdio.h>
<caml/mlvalues.h>
<caml/memory.h>
<caml/callback.h>
value mult2 (value x)
{
CAMLparam1 (x);
CAMLlocal1 (f);
f = * caml_named_value("mult2");
return callback(f,x);
}
int main(int argc, char * argv[])
{
int result;
int x;
caml_main (argv);
6
GuitarCure
scanf("%i",&x);
result = Int_val(mult2(Val_int(x)));
}
printf("%i\n",result);
return 0;
L'appel est ce fait en plusieurs partis. CAMLparam1 et CAMLlocal sont
des macros fourni par Caml pour enregistrer le variable utilisées pour appeler
Caml. L'appel de la fonction Caml ce fait via callback.
7
GuitarCure
6
6.1
Traitement du son
Recherche de la note
Pour trouver la note qui est jouer, il existe un outil mathématique, la
transformée de Fourier. Si f est une fonction intégrable sur R, sa transformée
de Fourier est la fonction F (f ) = fb donnée par la formule :
Z
+∞
F (f ) : ξ 7→ fb(ξ) =
f (x) e−iξx dx
−∞
Or cette formule n'est valable que pour des fonction continue. Or nous
n'avons qu'un échantillonnage du signal sonore. Il nous fallut donc trouvé un
autre outil mathématique. Nous avons donc utilisé la transformée discrète de
Fourier. Pour un échantillonnage s voici la formule à appliquer :
S(k) =
N
−1
X
n
s(n) · e−2iπk N
n=0
où N est le nombre de point de l'échantillon. Or cette formule a une complexité élevé si l'on veut implémenté directement, il faut donc alors passé par
quelques astuces mathématiques. Ces astuces permettent de réduire cette
complexité, du moment que le nombre de points de l'échantillon soit une
puissance de 2.Voici l'algorithme qui permet de simplier ce calcul.
fft_recursive(a)
n <- longeur[a]
si n = 1 alrs
retourner a
sinon
Wn <- e^(2\pi i / n)
w <-1
a0 <- (a[0],a[2], ..., a[n-2])
a1 <- (a[1],a[3], .. , a[n-1])
y0 <- fft_recursive(a0)
y1 <- fft_recursive(a1)
pour k <- 0 jusqu'a n/2 -1 faire
y[k] <- y0[k] + w * y1[k]
y[k+(n/2)] <- y0[k] - w * y1[k]
w <- w * Wn
fin pour
retourner y
fin si
8
GuitarCure
6.2
Accordeur digital
L'accordeur digital reçoit le résultat de la transformée rapide de Fourier.
Il s'agit donc comme décrit avant d'un tableau de N cases. Diéremment
à l'acquisition du son où chaque case correspond à un instant, les cases du
tableau fourni par Fourier correspondent à une fréquence. La question qui
nous vient tout de suite à l'esprit est comment exploiter ce résultat pour reconnaitre la note jouée. Pour reconnaitre une unique note il sut d'observer
la transformée de Fourier quand on gratte une seule corde sur la guitare. La
fréquence qui correspond à la note jouée est le pic de fréquence le plus élevé.
Les autres pics correspondent aux harmoniques de la note jouée on n'a donc
pas à s'en préoccuper. Il sut alors de faire une recherche du maximum dans
le tableau et retrouver la fréquence qui correspond à la case en fonction de
celle qui correspond à la première et à la dernière case. L'algorithme renvoi
un nombre correspondant à l'écart entre la fréquence eective et la fréquence
correspondant à la note sur laquelle on doit s'accorder. Pour connaitre la fréquence d'une note, il sut de prendre comme base une certaine note (et donc
la fréquence qui lui correspond) et de calculer la fréquence de la note voulue.
Il faut savoir bien sur que pour passer d'une note à la suivante (exemple : du
do au do par exemple) il sut de multiplier la fréquence de la note la plus
grave par 2 exposant 1/12. Entre deux octaves, la fréquence est multipliée
par 2. L'algorithme n'est pas une diculté en soi c'est pourquoi un retard à
ce niveau aurait été dicile (diculté à laquelle on n'a bien sur pas pallié).
6.3
Reconnaissance des notes et des accords
Le but de cette sous-partie est de gérer la reconnaissance de n'importe
quelle combinaison de notes et leur durée. Reconnaitre une unique note il
sut de récupérer la fréquence dominante. Pour reconnaitre un accord c'est
une autre paire de manche. En eet il faut réussi à en ressortir toutes les
notes jouées sans pour autant savoir combien de cordes sont grattées. En
me penchant sur le problème je me suis également rendu compte qu'il fallait
réussir à faire la diérence entre un accord qui vient d'être joué et une série
de notes tenues. La première solution retenue qui consistait à recevoir des
tableaux de même taille à chaque fois mais cela rendait dicile la solution
au problème précédemment cité ainsi qu'à la gestion de la durée des notes.
J'ai donc observé un enregistrement de guitare que j'ai fait sur Audacity. J'ai
constaté que le son gardait le même schéma, avec atténuation du son, à partir
du moment où je ne grattais pas de nouveau les cordes. Il sut donc de regarder la longueur d'un schéma identique pour avoir la longueur d'un accord.
Pour repérer les notes tenues, il sut de regarder le niveau de la fréquence
9
GuitarCure
par rapport à la séquence précédente. Ces solutions seront plus approfondies pour la deuxième soutenance car il reste encore un problème de taille :
cette solution rendrait dicile la détection des slides (quand le(s) doigt(s)
glisse(nt) sur le manche). Pour le moment un algorithme pour séparer les
diérents schémas d'une musique est en cours de conception. L'avancement
de cette partie n'était pas une priorité pour la première soutenance il est
donc satisfaisant d'avoir une avance " papier " sur ce qu'on voulait.
10
GuitarCure
7
Site Web
Le site web du projet GuitarCure est un site web comme on en rencontre
des dizaines tous les jours.
Il a été codé grâce à l'utilisation de xHTML, de CSS ainsi que de php et de
MySQL.
Il propose un index où il est possible de lire les dernières nouvelles à propos
du projet. Une présentation détaillée des activités proposées par le logiciel
GuitarCure telles que l'accordeur digital ou la génération de tablatures à
partir de notes de guitare électrique branchée sur l'entrée micro d'un ordinateur. Le site web propose également un accès vers une partie des informations
et des méthodes qui ont été utilisées pour sa création. On peut également
accéder à une page de présentation des membres.
Dans le futur, il sera également possible d'accéder à des captures du logiciel
ainsi qu'aux pages de téléchargement des sources du projet et des rapports
de soutenance.De plus, l'esthétique n'étant pas le but recherché pour cette
première soutenance, il serait de bon ton de revoir les couleurs et images de
fond du site.
Un petit aperçu du site web
11
GuitarCure
8
Conclusion
Nous avons respecté la répartition des tâches et sommes dans les temps
sur notre avancement. Les problèmes qui nous faisaient face sont résolus et
nous devons donc maintenant trouver des réponses aux questions posées cidessus et rééchir si d'autres problèmes ne se posent pas à notre projet.
12