Sylvain Mahé Le site Web Retour à l'accueil Principes Partager mes idées et mes projets librement et gratuitement. Thématiques Mécatronique du système embarqué, artisanat pluridisciplinaire, bricolage commun, esthétique logicielle et matérielle, minimalisme fonctionnel, conceptualisation alternative, rédaction technique et littéraire, partage pédagogique documenté. Contact ✆ Téléphone : 06.45.49.96.98
✉ E-mail : contact@sylvainmahe.site
✎ Site Web : sylvainmahe.site
Écriture de la page : Sylvain Mahé
Jouer des sons avec la classe SoundWrite Lorsque l'on développe un projet demandant une interface entre l'homme et la machine, il est généralement indispensable de pouvoir communiquer des informations à l'utilisateur à l'aide d'une interface sonore via un buzzer ou un haut-parleur, c'est ce que permet d'effectuer la classe SoundWrite. Avec la classe SoundWrite il est possible très simplement de générer des sons de la fréquence et de la durée souhaitée, ainsi que de créer des mélodies grâce au principe d'ajout séquentiel de notes dans ce qui s'apparente à une partition. Exemple pour jouer un son avec la classe SoundWrite : #include <SoundWrite.h> int main() { SoundWrite::pin (1); SoundWrite::play (440, 1000); while (true) { } return 0; } Dans l'exemple ci-dessus, l'instance de la classe SoundWrite appelle la fonction statique pin, qui prend en paramètre 1, le numéro du port GPIO de l'automate programmable sur lequel est connecté un périphérique audio (buzzer, haut-parleur, etc...). À la suite la fonction statique play est appelée, elle prend un 1er paramètre 440 qui est le choix de la fréquence en Hertz du son qui va être joué (ici un "la" conventionnel à 440Hz), et un 2ème paramètre 1000 qui défini la durée de lecture de cette sonorité exprimée en millisecondes. À noter que la classe SoundWrite calculera le diviseur d'horloge du microcontrôleur le plus adapté en rapport avec la fréquence sonore choisie pour chaque appel à la fonction statique play, add, et modulate, ceci afin de garantir une résolution de 20Hz à 20000Hz la plus élevée possible (soit un nombre de pas ou d'états disponibles le plus important dans toutes les situations). Même si vous n'avez pas besoin d'exécuter des instructions dans la boucle while, cette dernière reste importante car elle permet au microcontrôleur de continuer l'exécution du code qui met en fonctionnement l'oscillateur piloté par la classe SoundWrite. Dans le cas contraire, l'exécution terminerait après return 0;, et le microcontrôleur s'arrêterait là de sorte qu'aucun son n'aurait le temps d'être entendu ! Ports des automates programmables concernés par la génération de sons : Automate programmable MODULABLE 20 :
- Port GPIO 1 (PD0)
- Port GPIO 2 (PD1)
- Port GPIO 3 (PD2)
- Port GPIO 4 (PD3)
- Port GPIO 5 (PD4)
- Port GPIO 6 (PD5)
- Port GPIO 7 (PD6)
- Port GPIO 8 (PD7)
- Port GPIO 9 (PB0)
- Port GPIO 10 (PB1)
- Port GPIO 11 (PB2)
- Port GPIO 12 (PB3)
- Port GPIO 13 (PB4)
- Port GPIO 14 (PB5)
- Port GPIO 15 (PC0)
- Port GPIO 16 (PC1)
- Port GPIO 17 (PC2)
- Port GPIO 18 (PC3)
- Port GPIO 19 (PC4)
- Port GPIO 20 (PC5)

Automate programmable MODULABLE 32 :
- Port GPIO 1 (PB0)
- Port GPIO 2 (PB1)
- Port GPIO 3 (PB2)
- Port GPIO 4 (PB3)
- Port GPIO 5 (PB4)
- Port GPIO 6 (PB5)
- Port GPIO 7 (PB6)
- Port GPIO 8 (PB7)
- Port GPIO 9 (PD0)
- Port GPIO 10 (PD1)
- Port GPIO 11 (PD2)
- Port GPIO 12 (PD3)
- Port GPIO 13 (PD4)
- Port GPIO 14 (PD5)
- Port GPIO 15 (PD6)
- Port GPIO 16 (PD7)
- Port GPIO 17 (PC0)
- Port GPIO 18 (PC1)
- Port GPIO 19 (PC2)
- Port GPIO 20 (PC3)
- Port GPIO 21 (PC4)
- Port GPIO 22 (PC5)
- Port GPIO 23 (PC6)
- Port GPIO 24 (PC7)
- Port GPIO 25 (PA7)
- Port GPIO 26 (PA6)
- Port GPIO 27 (PA5)
- Port GPIO 28 (PA4)
- Port GPIO 29 (PA3)
- Port GPIO 30 (PA2)
- Port GPIO 31 (PA1)
- Port GPIO 32 (PA0)
Jouer une mélodie : Comme évoqué plus haut, il est possible avec la classe SoundWrite de jouer une suite séquentielle de sonorités par le simple ajout de notes à une partition virtuelle. Exemple pour créer et jouer une mélodie avec la classe SoundWrite : #include <SoundWrite.h> int main() { SoundWrite::pin (1); SoundWrite::add (200, 250); SoundWrite::add (400, 250); SoundWrite::add (800, 250); SoundWrite::add (1200, 250); SoundWrite::add (0, 500); SoundWrite::add (800, 500); SoundWrite::add (400, 500); SoundWrite::play (0, 0); while (true) { } return 0; } Dans la même logique que l'exemple précédent, après avoir défini le numéro du port GPIO (à l'aide de la fonction statique pin) qui sera utilisé pour générer des sons, une fonction statique add est appelée autant de fois qu'il est nécessaire d'ajouter des sons (ou notes), et prend les mêmes paramètres que la fonction statique play (fréquence et durée), seul la finalité est différente. En effet avec play le son est immédiatement joué, alors qu'avec add les sons sont stockés les uns à la suite des autres, après quoi la partition ainsi créée sera jouée en appelant la fonction statique play avec en paramètres une fréquence et une durée égales à 0. À noter qu'un maximum de 64 notes consécutives (avant l'appel à la fonction statique play) peuvent être créées, ce qui pourra répondre au besoin de la majorité des projets. Il est possible de créer des blancs (temps morts), c'est-à-dire des moments dans la mélodie où aucune sonorité n'est jouée. Pour se faire il suffit simplement d'indiquer une fréquence égale à 0 lors de l'appel à la fonction statique add. Il existe également une fonction statique modulate, permettant de moduler la fréquence du son en cours de lecture (pour créer un son d'une durée non définie avec la fonction statique play, indiquez une durée égale à 0), et également une fonction statique stop, qui a pour but d'arrêter la lecture des sons immédiatement et de vider la partition virtuelle. Références : Récapitulatif des fonctions de cette classe : static void pin (const unsigned char PIN); static void play (const float FREQUENCY, const unsigned int DURATION); static void add (const float FREQUENCY, const unsigned int DURATION); static void modulate (const float FREQUENCY); static void stop();