Il y a
quelques semaines, nous te parlions d'une carte électronique programmable, fabriquée par
Texas instrument, la
TMS320C5535 eZdsp.

Mais cette carte n'était pas une carte ordinaire, c'était une carte DSP, pour
Digital Signal Processing.
Comme
nous le disions, les possibilités offerte par cette carte étaient
nombreuses. Aujourd'hui, après la théorie,
passons à la pratique! Je vous propose de réaliser un premier projet tout au long de cet série d'articles: un
synthétiseur au clavier.
Il s'agit en quelque sorte d'un piano virtuel. Vous appuyez sur des touches de votre clavier, et la carte DSP joue un son, différent pour chaque touche.
Tous les synthétiseurs utilisent ce principe! Une circuit détecte l'appui d'une touche
(par exemple, d'une touche au clavier s'il s'agit d'un piano électrique), et un autre circuit basé sur un ou plusieurs DSP se chargent de
générer le signal.
Intéressant non? Si vous êtes prêts, nous pouvons commencer.
Tout d'abord, il est important de définir notre
cahier des charges, qui, dans un premier temps, vas être très simple! Nous serons peut-être amené à l'améliorer au fur et à mesure des épisodes de cette série. Aujourd'hui, nous ne nous imposons que très peu de limites!
En effet, nous voulons juste générer un son audible, à chaque appui d'une touche au clavier. Le programme devra tourner
en boucle, pour pouvoir saisir autant de notes souhaitées. Nous pourrons ainsi créer une mélodie si nous sommes inspirés!
Nous voyons donc qu'il y a
2 parties majeures dans ce projet:
- Générer un signal audible
- Détecter l'appui d'une touche au clavier
Je vais détailler chaque partie, et vous allez voir que même si cela semble peut-être un poil complexe, ce n'est en réalité par le cas!
Commençons par
la génération du son.Un son, c'est quoi? C'est tout simplement
une vibration de l'air. Ces vibrations se propagent un certain nombre de fois par seconde, c'est ce qu'on appelle
la fréquence. Cela, vous savez ce que c'est. C'est en quelque sorte la "hauteur" du son: un son haute fréquence sera perçu aiguë, un son basse fréquence sera grave. Quand vous écoutez de la musique sur une enceinte, celle-ci va faire vibrer une
membrane sous l'action d'une tension électrique, qui va faire vibrer les molécules d'air. Ces vibrations vont arriver jusqu'à
vos tympans qui vont recevoir ces vibrations, et vous allez entendre quelque chose.
Enfin, normalement.Mais comment la source
(votre téléphone, votre ordinateur...) génère t-elle la tension qui arrive à faire bouger la membrane? En fait, rien de secret, c'est très simple! Lorsque la source envoie une
tension positive, la membrane est poussée dans un sens, et lorsque la
tension est négative, elle est poussée
dans l'autre sens. La répétition de cette tension positive, puis négative, puis positive, etc. va alors faire
vibrer les molécules d'air: c'est le but recherché. Notez que le temps entre ces répétitions est la période, soit l'inverse de la fréquence (
Pour être plus pointilleux, il s'agit de la demi-période! La période complète étant la temps entre 2 tensions de même signe!).
Autrement dit, pour un son plus aiguë,
il va falloir être rapide!Maintenant, quelle
fonction mathématique possède des
alternances négatives et positive au cours du temps? Il s'agit des fonction périodiques de valeur moyenne nulle. La plus simple d'entre-elle, est le
sinus. OK, maintenant nous savons que notre carte doit générer un
signal sinusoïdal d'une certaine fréquence.
Mais comment faire ça? Notre carte ne traite que
les signaux binaires, à priori.
Sauf que nous sommes sur une circuit DSP, et que le traitement des signaux, c'est son job.
Encore une fois, le principe va être simple. Nous allons lui donner en entrée un nombre, par exemple 42. Puis un petit composant va se charger de convertir ce nombre en
impulsion électrique. Ce petit composant s'appelle un
Convertisseur Digital Analogique, ou
DAC en anglais.
Son but? Convertir un valeur en un signal électrique.
Ici, le DAC sur notre carte est un
AIC TI-3204, qui échantillonne les signaux à
192kHz. Il ne reste plus qu'à calculer les valeurs d'un sinus pour pouvoir ensuite les envoyer au DAC.
En réalité, c'est un peu plus complexe. Pour des raisons de
gestion de la mémoire, il serait problématique de calculer à chaque fois tous les points du
signal sinusoïdal. Il est préférable de le pré-calculer au lancement du programme, puis de s'en servir après. N'oubliez que pas que nous sommes sur un circuit DSP!
J'ai donc au préalable généré une sinusoïde sur
16bits signés (capacité du DAC), c'est à dire qu'en sortie il y aura $mathjax$2^{16}$mathjax$
niveaux de tension.
La configuration du DAC est un peu complexe, car il faut paramètrer beaucoup de choses sur l'AIC et les ports. Il est vivement recommandé de se baser sur la documentation de la carte!
Il ne reste plus qu'à envoyer le signal! Mais le problème est ici que nous ne pouvons pas jouer sur le fréquence, étant donné que nous avons pré-généré le sinus! J'ai donc bidouillé un peu le code pour que quand la variable fréquence varie, le son change. Par la suite, nous essayerons de faire quelque chose de plus propre! Mais pour le moment, ce n'est pas grave. Remarquez aussi que j'ai copié le signal 2 fois, car nous sommes sur un port stéréo.
Cela fonctionne très bien. Dans un prochain épisode, nous verrons comment générer un signal plus propre, certes, mais aussi différent d'un signal sinusoïdal. Chaque forme de signal a sa tonalité bien particulière. Par exemple, un signal carré fait beaucoup pensé aux synthétiseurs dans les musiques des années 80

Il sera également possible d'appliquer des
filtres, des effets au signal pour le rendre
beaucoup, beaucoup plus cool. Mais pour l'instant, occupons-nous de notre petit piano électrique!
Voilà la fin de la première partie!
Maintenant, il ne reste plus qu'a détecter les touches du clavier.
Vous savez peut-être que lorsque vous appuyez sur une touche, votre ordinateur reçoit une donnée correspondante à la touche envoyée. On appelle ça le code ascii. Et bien, grâce à un petit programme installé de base sous windows,
Hyperterminal, il est possible d'envoyer cette donnée non pas à Windows, mais plutôt sur un port spécifique. Un port est globalement une entrée/sortie de l'ordinateur qui communique au moyen d'un liaison série: un fil sert pour émettre des données, et un autre pour les recevoir.
Et, ça tombe bien, notre carte TMSezDSPC5535 est connecté sur l'un de ces
ports séries de notre ordinateur! I suffit donc de connecter
(virtuellement bien sûr! ) le fil d
'émission de l'ordinateur sur le fil de
réception de la carte , pour assurer une liaison entre les 2 deux. Ainsi, quand vous appuierez sur
"E", le carte DSP recevra
"E".
Mais cela n'est pas magique. Sur la carte, le composant qui réalise cela et un UART. Il fonctionne aussi bien en émission, qu'en réception. Ici, nous travaillons avec une fréquence de transmission de
115200 bits par seconde. Il faut donc que Hyperterminal reçoive aussi les données à cette fréquence, sinon il y a aura un gros problème!
Comme vous pouvez le voir à gauche, le code final est très simple. Dans une boucle infinie, je regarde en continu si je reçois un caractère. Si c'est le cas, alors je génère un signal pendant
1 seconde, et je réinitialise tout. On peut remarque que la je passe en paramètre de ma fonction qui génère le signal la touche appuyée. En effet, je m'en sert pour que, à chaque touche soit associée un son différent!
Notez que le programme pourrait être bien plus optimisé, notamment en travaillant avec les interruptions! Nous verrons ça un peu plus tard.Bon, en réalité, avec mes bidouillages, le signal est en sortie n'est pas très beau. Il est même assez loin du signal sinusoïdal. Voyez par vous-même


En effet, si vous regardez mon code, vous voyez que je n'envois pas la totalité du sinus à chaque fois. Pour faire varier la fréquence, je n'envoie qu'une partie à chaque fois, et je répète cette partie. Le signal n'est donc pas sinusoïdal en sortie. D'ailleurs, c'est également bien visible sur le spectre, qui comporte quelques harmoniques.
Attention donc les oreilles
Nous sommes encore loin d'un beau synthétiseur, mais on s'approche

Voici une courte vidéo vous montrant le résultat

Le code source du projet est disponible gratuitement sur GitHub:
https://github.com/Wistaro/DspSynthesizerEt ensuite...?
Dans les prochains épisodes, comme je l'ai déjà dit, nous améliorerons ce projet, notamment avec ceci:
- Génération de signaux plus propre
- Génération de différents types de signaux
- Ajout d'effet et filtres
- Lecture d'une musique
- Affichage d'un vu-mètre
- Transformateur de voix
- Reconnaissance vocale
Et bien plus encore! N'hésitez pas à me donner vos avis!
A bientôt! Épisode précédant - Épisode suivant