mercredi 22 août 2012

Fabrication d'un module MIDI (IN et OUT) pour Arduino

Cet article a été mis à jour le 3 avril 2021.

J'ai finalement mis la main sur quelques octocoupleurs 4N35 afin d'expérimenter le "MIDI input", c'est à dire l'entrée de signaux MIDI dans l'Arduino.

Voici donc le schéma d'un circuit qui a bien fonctionné pour moi.  Certaines personnes ont plus de succès avec une résistance plus petite à la sortie de l'octocoupleur (ce qui n'était pas mon cas), d'autres utilisent une résistance plus élevée (ce que j'aurais pu faire:  ça continuait de fonctionner quand même).

On confond parfois la broche 4 et la broche 5 du connecteur MIDI: le schéma ci-dessus montre le connecteur femelle vu de face, mais on trouve souvent des schémas qui présentent le connecteur mâle ou le verso du connecteur femelle­, ce qui peut donner l'impression que certains schémas se contredisent. Le potentiel de la broche 4 (+) est plus élevé que celui de la broche 5 (-).

Connecteur femelle, vu de face

Verso du connecteur femelle

Connecteur mâle (câble)
Connecteur mâle (câble MIDI)



Ma seule perte de temps se situait au niveau logiciel (mais je croyais que c'était un problème de circuit, d'où la perte de temps...).  Lorsqu'on effectue une recherche des mots clés "Arduino MIDI in" dans Google, le premier résultat est une vieille discussion du forum Arduino datant de 2007.  D'une part le schéma du circuit qui y est présenté est un peu controversé (avec cette résistance de 100 kΩ à la broche 6 de l'octocoupleur, que la plupart des gens trouvent inutile), mais surtout le sketch qui y est proposé ne tient pas compte des "running status", une caractéristique du protocole MIDI que je ne connaissais pas.

En principe, chaque fois que vous appuyez sur une touche d'un clavier MIDI, celui-ci émet un message "Note On" constitué de 3 octets:  l'identification de la commande "Note On", suivie du numéro de la note jouée et de sa vélocité.  Supposons maintenant que vous appuyez sur plusieurs notes consécutives assez rapidement (bref:  vous jouez de la musique):  pour ne pas surcharger la bande passante, la norme MIDI permet aux instruments d'envoyer un seul octet "Note On" suivi de plusieurs numéros de notes / vélocité.  À l'autre bout, l'instrument qui reçoit les messages est responsable d'interpréter ça comme une succession de plusieurs notes.

Mais voilà:  le sketch que j'utilisais pour vérifier l'arrivée de messages MIDI prenait pour acquis que toutes les notes jouées étaient précédées d'un octet "Note On", ce qui n'était pas le cas.  Une LED supposée s'allumer chaque fois que j'appuyais sur une touche ne s'allumait qu'à la condition que je laisse une bonne dizaine de secondes s'écouler avant l'exécution d'une nouvelle note...

La solution:  la bibliothèque MIDI, que je ne m'étais jamais donné la peine d'utiliser pour faire du "MIDI OUT", mais qui se révèle drôlement utile pour faire du "MIDI IN".  Un sketch très simple trouvé ici allume une LED chaque fois que j'appuie sur une touche du clavier.  La LED s'éteint aussitôt que je relâche la note.

J'en ai profité pour bricoler sur une carte perforée un module comportant à la fois une entrée et une sortie MIDI, qu'il ne reste plus qu'à brancher à l'Arduino:  quelque chose d'à peu près équivalent au "MIDI shield" de Sparkfun, mais pour une minuscule fraction du prix (surtout que les deux jacks MIDI ont été récupérés sur une interface MIDI "MacMan" désuète, je dirais que ça m'a coûté environ 5% de ce que demande Sparkfun).


Je n'ai plus tellement tendance à produire mes propres shields empilables, préférant des cartes qui se branchent à l'Arduino au moyen de quelques fils.  Les avantages que j'y vois: beaucoup moins de soudures lors de la fabrication, et plus de flexibilité lors de l'utilisation (on peu plus facilement modifier l'endroit où les fils se branchent sur l'Arduino, remplacer l'Arduino par un Launchpad, etc.).

Puisque la librairie MIDI, par défaut, transmet à la sortie de l'Arduino tous les messages reçu à l'entrée (MIDI THROUGH) j'ai rapidement pu vérifier que l'Arduino retransmettait efficacement (et sans délai de latence perceptible) la totalité des messages MIDI reçus (pour les tests, ces messages étaient relayés au logiciel MIDI-Ox par l'entremise d'une interface MIDI-USB.

À partir d'ici, la création commence:  l'Arduino pourra dorénavant modifier les messages reçus avant de les retransmettre...

Yves Pelletier (Twitter: @ElectroAmateur)

5 commentaires:

  1. Merci pour ce site, plein de bon tuyaux!.
    Et donc dans le détail quelles modifs. avez vous fait à votre programme midi sans fil à base de nrf24l0?
    C'est par ce que j'ai fabriqué des petits véhicules qui jouent de la flute à piston, de la derbuca ou du butadrum à base de servomoteurs et de solénoïdes. Je suis presque arrivé au bout du projet: j'arrive à les contrôler en midi en les branchant sur un clavier, mais alors pour me débarrasser du fil je sèche..
    merci d'avance!

    RépondreSupprimer
  2. en vidéo pour donner une idée du projet en cours..
    https://www.youtube.com/watch?v=OSud_ftKwJE&feature=youtu.be

    RépondreSupprimer
  3. Bonsoir,

    Le message envoyé depuis un clavier maître sur le MIDI IN est retransmit par l'USB de l'arduino au séquenceur j'imagine ?
    Si oui, le programe écrit dans la sous partie "Example Input Program" de cette page (https://www.pjrc.com/teensy/td_libs_MIDI.html) fonctionne pour que l'info MIDI soit traité par l'arduino et envoyé par USB au PC ?

    RépondreSupprimer
  4. Bonjour, sur ton schéma tu à une diode zener 1n4748 ce qui n'est pas logique, ne fait tu pas erreur avec une diode 1n4148 ?

    RépondreSupprimer