dimanche 4 avril 2021

VS1003 / VS1053 en mode MIDI (Arduino, ESP32, ESP8266)

Au cours des dernières semaines, j'ai utilisé mon module VS1003 / VS1053 pour jouer des fichiers mp3 ainsi que des émissions de webradio. Mais ce module peut également être utilisé comme synthétiseur MIDI: il génère des sons qui correspondent aux commandes MIDI que vous lui transmettez (ces messages peuvent être générés par un contrôleur MIDI ou par votre sketch Arduino).

En principe, la méthode recommandée pour mettre le VS1053 en mode "MIDI temps réel" consiste à faire un reset en soumettant sa broche GPIO 0 à une signal logique bas, et sa broche GPIO 1 à un signal logique haut. On peut ensuite lui acheminer les messages MIDI par son entrée RX.

Tout ça est bien joli si les broches GPIO et RX sont accessibles sur le module que vous utilisez. C'est le cas, par exemple, pour les modules mis en marché par Sparkfun et par Adafruit, mais ce n'est pas le cas pour le module "LCSoft Studio" que j'utilise.

Il existe heureusement une autre solution qui, elle, est applicable à mon module: grâce à des patches logicielles fournies par VLSI, le module peut exécuter les commandes MIDI reçues sur le bus SPI. Cette méthode nécessite des programmes un tout petit peu plus compliqués, d'autant plus que le VS1003 et le VS1053 requièrent un traitement légèrement différent (les deux modèles sont généralement interchangeables, à un point tel que je croyais être propriétaire d'un VS1053, alors qu'il s'agit finalement d'un VS1003).

Heureusement, Kevin, l'auteur de l'excellent blog Simple DIY Electronic Music Projects a écrit un sketch Arduino qui permet de contrôler un VS1003 ou un VS1053 au moyen d'un contrôleur MIDI (un clavier musical, par exemple). Un potentiomètre branché à l'Arduino permet de modifier le timbre de l'instrument (piano, vibraphone, flûte, etc.). Ses travaux sont présentés dans trois articles: 

J'ai testé avec succès le sketch de Kevin sur un Arduino Uno, sur un ESP8266 et sur un ESP32.

Le sketch

Vous trouverez sur Github le sketch ArduinoMIDIVS10xxSynth ainsi que les 4 fichiers qui doivent être placés dans le même dossier.


Le sketch fonctionne pour le VS1003 et pour le VS1053, mais vous devez indiquer de quel module il s'agit en commentant la ligne 63 ou la ligne 64. 


Si vous branchez un potentiomètre à l'entrée A0 de l'Arduino pour sélectionner le timbre de l'instrument, prenez soin de décommenter la ligne 87. Vous pouvez aussi ajouter un contrôle de volume à l'entrée A1, mais je ne le recommande pas lors des premiers essais (le son était inaudible pour la plupart des positions du potentiomètre).


Si vous préservez la ligne 53, une suite de notes sera jouée au démarrage du programme, ce qui constitue une excellente façon de vérifier que tout fonctionne correctement.

Circuit: Arduno Uno

Le circuit intégré VS1053 est conçu pour fonctionner à un niveau logique de 3,3 V, c'est pourquoi j'ai utilisé un circuit intégré 4050 pour abaisser les signaux de 5 V générés par l'Arduino (au besoin, vous pouvez consulter cet article pour plus d'informations sur l'utilisation d'un 4050).

Voici donc les connexions du module VS1003 avec l'Arduino:

  • Broche 5 V du VS1003 - Broche 5 V de l'Arduino Uno
  • Broche XGND du VS1003 - Broche GND de l'Arduino Uno
  • Broche MISO du VS1003 - Broche 12 de l'Arduino Uno*
  • Broche MOSI du VS1003 - 4050 - Broche 11 de l'Arduino Uno
  • Broche SCK du VS1003 - 4050 - Broche 13 de l'Arduino Uno
  • Broche DREQ du VS1003 - Broche 2 de l'Arduino Uno*
  • Broche XRST du VS1003 - 4050 - Broche 8 de l'Arduino Uno
  • Broche XCS du VS1003 - 4050 - Broche 6 de l'Arduino Uno
  • Broche XDCS du VS1003 - 4050 - Broche 7 de l'Arduino Uno
* Les broches MISO et DREQ sont des sorties du VS1003 et leur signal ne doit donc pas être abaissé par le 4050.

Pour la réception des messages MIDI, la sortie MIDI d'un clavier musical était branchée à la broche 0 (RX) de l'Arduino Uno par l'entremise d'un optocoupleur 4N35 (plus de détails dans cet article). 

Finalement, un potentiomètre est branché à l'entrée A0 de l'Arduino: il permet de sélectionner le timbre ("sound bank") du son généré par le VS1003.


J'ai dû apporter des modifications aux lignes 102 à 105 du sketch pour qu'elles concordent avec mes connexions:

Circuit: ESP8266

Le programme fonctionne également avec un ESP8266. Presque toutes les broches GPIO de l'ESP8266 sont utilisées, mais il n'est pas nécessaire d'adapter les niveaux logiques. Cette fois, l'optocoupleur 4N35 doit être branché à 3,3 V plutôt qu'à 5 V.

  • Broche 5 V du VS1003 - Broche 5 V de l'ESP8266
  • Broche XGND du VS1003 - Broche GND de l'ESP8266
  • Broche MISO du VS1003 - Broche GPIO12 de l'ESP8266
  • Broche MOSI du VS1003 - Broche GPIO13 de l'ESP8266
  • Broche SCK du VS1003 - Broche GPIO14 de l'ESP8266
  • Broche DREQ du VS1003 - Broche GPIO4 de l'ESP8266
  • Broche XRST du VS1003 - Broche GPIO5 de l'ESP8266
  • Broche XCS du VS1003 - Broche GPIO16 de l'ESP8266
  • Broche XDCS du VS1003 - Broche GPIO2 de l'ESP8266

Pour la réception des signaux MIDI,  l'optocoupleur 4N35 est branché à la broche RX de l'ESP8266.

Finalement, un potentiomètre est branché à l'entrée A0 de l'ESP8266.

(Le schéma montre mon Wemo D1 Mini)



Pour l'ESP8266, j'ai aussi modifié les lignes 102 à 105 du sketch de la façon suivante:


Circuit: ESP32

Ça fontionne aussi avec l'ESP32.

J'ai utilisé ces connexions:

  • Broche 5 V du VS1003 - Broche VIN de l'ESP32
  • Broche XGND du VS1003 - Broche GND de l'ESP32
  • Broche MISO du VS1003 - Broche D19 de l'ESP32
  • Broche MOSI du VS1003 - Broche D23 de l'ESP32
  • Broche SCK du VS1003 - Broche D18 de l'ESP32
  • Broche DREQ du VS1003 - Broche D4 de l'ESP32
  • Broche XRST du VS1003 - Broche D21 de l'ESP32
  • Broche XCS du VS1003 - Broche D5 de l'ESP32
  • Broche XDCS du VS1003 - Broche D16 de l'ESP32

Pour la réception des signaux MIDI,  l'optocoupleur 4N35 est branché à la broche RX de l'ESP8266.

Finalement, un potentiomètre est branché à l'entrée A0 de l'ESP8266.


... et j'ai modifié les lignes 102 à 105 du sketch de cette façon:


À lire également


Yves Pelletier (TwitterFacebook)

    

Aucun commentaire:

Enregistrer un commentaire