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