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é
Le pilotage des instruments de musique avec la classe UsartMidi Séquenceurs MIDI, boucleurs, pédales d'effets, claviers maîtres, tout ceci est réalisable avec la classe UsartMidi. La classe UsartMidi automatise la réception et l'émission de commandes MIDI vers des instruments de musique standards. C'est le protocole USART (pour "Universal Synchronous Asynchronous Receiver Transmitter" ou émetteur récepteur synchrone asynchrone universel) qui est utilisé afin d'effectuer les communications bidirectionnelles à la vitesse de 31250 bauds / seconde prenant la forme de messages MIDI d'une largeur de 24 bits chacun (8 bits de statut, 8 bits de donnée, et 8 bits de description). Ports des automates programmables concernés par l'USART : Automate programmable MODULABLE 20 :
- Port GPIO 1 (PD0) = RXD (receive data)
- Port GPIO 2 (PD1) = TXD (transmit data)

Automate programmable MODULABLE 32 :
- Port GPIO 9 (PD0) = RXD (receive data)
- Port GPIO 10 (PD1) = TXD (transmit data)
Exemple d'envoi de commandes à un instrument de musique : #include <UsartMidi.h> int main() { UsartMidi::start (void); UsartMidi::transmit (144, 69, 127); return 0; } Dans l'exemple ci-dessus, la fonction statique start est appelée prenant en seul paramètre une fonction à appeler lorsque des commandes sont reçues. Ici ce paramètre est indiqué void (vide) ce qui signifie qu'aucune fonction ne sera appelée lors de la réception de commandes (une interruption interviendra mais n'appellera pas de fonction). Puis la fonction statique transmit est utilisée afin d'envoyer des commandes à un instrument de musique :
- Le 1er paramètre 144 est le statut. Ici il correspond à la commande "note ON" afin de jouer une note de musique.
- Le 2ème paramètre 69 est la donnée. Dans ce cas elle correspond à une note de musique, soit un "la" conventionnel à 440Hz.
- Le 3ème paramètre 127 est la description. Cette valeur indique une vélocité maximale (ce qui correspond à un appui fort sur la touche de l'instrument).
Cet exemple est simple mais permet de comprendre facilement l'utilisation de la classe UsartMidi. Un instrument de musique relié à l'automate programmable émetteur des commandes ci-dessus jouerait la note indiquée. Exemple de réception de commandes provenant d'un instrument de musique : #include <UsartMidi.h> void myReceiving() { //les commandes de statut, donnée, et description ont été reçues UsartMidi::receive(); //UsartMidi::status est le statut reçu //UsartMidi::data est la donnée reçue //UsartMidi::description est la description reçue } int main() { UsartMidi::start (myReceiving); while (true) { } return 0; } L'exemple ci-dessus montre que dans la fonction principale main, la communication MIDI est démarrée en appelant la fonction statique start, son seul paramètre est renseigné avec la fonction myReceiving qui sera appelée lorsque des commandes seront reçues (une série de 3 commandes exactement). Lors de la réception, la fonction statique receive est appelée permettant de stocker les commandes reçues respectivement dans les variables statiques status, data, et description que vous pouvez utiliser n'importe où dans votre programme. Bien que cela soit moins pratique et moins optimisé d'un point de vue exécution du programme, il n'est pas forcément nécessaire d'utiliser une fonction dédiée à la réception des commandes. Exemple de réception de commandes sans utiliser de fonction dédiée : #include <UsartMidi.h> int main() { UsartMidi::start (void); while (true) { UsartMidi::receive(); //UsartMidi::status est le statut reçu //UsartMidi::data est la donnée reçue //UsartMidi::description est la description reçue } return 0; } À l'instar du premier exemple énoncé, le seul paramètre de la fonction statique start est indiqué void (vide) ce qui signifie qu'aucune fonction ne sera appelée lors de la réception de commandes, ceci étant effectué directement dans la boucle while (ce qui à chaque tour de boucle consomme plus d'instructions que l'exemple précédent, de fait plus optimisé). Dans ce dernier exemple la réception de commandes peut être plus difficilement anticipée et détectée. Autre fonctionnalité disponible : Si besoin la classe UsartMidi dispose d'une fonction statique stop ce qui permet d'arrêter les communications MIDI, un nouvel appel à la fonction statique start permet de redémarrer les communications MIDI. Câblages et priorités : Il convient dans l'utilisation de la classe UsartMidi de prendre note de quelques considérations techniques importantes pour le bon fonctionnement : Si vous n'utilisez pas la partie réception du montage et que vous n'appelez pas la fonction statique receive, il est important de quand même connecter un câble sur le port RXD de l'automate programmable allant vers un port TXD du périphérique, car dans le cas contraire les fonctions matérielles USART capteraient tous les bruits électromagnétiques environnants sur la broche laissée en l'air du microcontrôleur, et générerait des interruptions intempestives, ce qui n'est pas souhaité. La classe UsartMidi utilise le protocole USART tout comme les classes UsartNetwork et UsartRs232, mais les vitesses de communication et les algorithmes mis en œuvre ne sont pas compatibles les uns avec les autres. Pour éviter tout problème de compatibilité, la classe utilisant l'USART déclarée en premier dans votre projet sera la seule activée et fonctionnelle. Références : Récapitulatif des fonctions et variables de cette classe : static unsigned char status; static unsigned char data; static unsigned char description; static void start (void functionJump()); static void receive(); static void transmit (const unsigned char STATUS, const unsigned char DATA, const unsigned char DESCRIPTION); static void stop();