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/DspSynthesizer
Et ensuite...?
Dans les prochains épisodes, comme je l'ai déjà dit, nous améliorerons ce projet, notamment avec ceci:
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