Electronique > Réalisations > Interfaces > Interfaces MIDI > Interface MIDI 007

Dernière mise à jour : 22/05/2011

Présentation

Cette interface MIDI dispose de 128 sorties logiques dont l'état de chacune est commandée individuellement par des évènements MIDI de type NOTE ON ou NOTE OFF.

interface_midi_007_pcb_3d_a

Deux modes de fonctionnement sont disponibles :
Mode On/Off : la réception d'une NOTE ON active la sortie qui lui correspond, et la réception d'une NOTE OFF désactive la sortie qui lui correspond.
- Mode Pulse : la réception d'une NOTE ON active la sortie qui lui correspond, pendant une durée de 1 ms seulement (valeur qui peut être modifiée au niveau logiciel, recompilation nécessaire). Les évenements NOTE OFF sont ignorés.
Cette interface est en quelque sorte une extention de l'interface Interface MIDI 002b qui ne dispose que de huit sorties. Depuis le 24/04/2011, il est possible de spécifier le canal MIDI de réception (auparavant, il était fixé en dur à la valeur 1). L'interface MIDI 019 dispose elle aussi de 128 sorties mais possède en plus des paramètres de configuration pratiques pour "midifier" de vieux synthés de musique.

Avertissements

En l'état, voici quelques limitations qui ne vous gêneront peut-être pas du tout, mais que je tiens à signaler. Voir paragraphe Améliorations / modifications possibles pour pistes possibles d'amélioration.

Limitations générales (en modes On/Off et Pulse)
Du fait de l'utilisation d'une liaison de type série entre le microcontrôleur et les registres de sortie, il existe un temps mort pendant lequel l'analyse des données MIDI reçues est impossible quand une note (ON ou OFF) vient juste d'être reçue. Ce temps est d'approximativement 5 ms (en fait proche de 4 ms) avec un quartz 8 MHz et est inférieur à 2 ms avec un quartz 20 MHz. Cela signifie que les notes MIDI reçues ne doivent pas être trop rapprochées. Ceci dit ça laisse tout de même la possibilité d'envoyer environ 500 commandes différentes en une seconde avec quartz 20 MHz. Ca peut sembler rapide à première vue et ça l'est en effet pour des commandes manuelles (jeu via un clavier maître MIDI), mais cela peut éventuellement poser problème si usage avec un séquenceur MIDI destiné à une application "spectacle lumière avancé". A noter que depuis le 15/05/2011, la mise en place d'un buffer circulaire dans le traitement des données reçues permet en cas d'arrivée massive de données, de les prendre en compte avec un léger retard et non plus simplement de les ignorer. On peut désormais plaquer un accord de 8 notes sans perte d'info et quasiment en temps réel. Nettement plus plaisant !

Limitations en mode Pulse
La durée des impulsions délivrées sur les sorties lors de la réception d'évenements NOTE ON est assurée par un retard logiciel simple. Durant le délai d'attente qui précède la désactivation d'une sortie qui vient de s'activer (durée d'impulsion), les évenements NOTE ON et NOTE OFF parvenant à l'entrée MIDI sont toujours reçus mais ne sont pas traités. Au temps mort global de 5 ms (mise à jour des sorties sur réception NOTE ON) s'ajoute donc un temps mort supplémentaire de 1 ms (durée de l'impulsion) ce qui porte le temps mort global à 6 ms. Pour dire ça clairement, de deux évenements NoteOn qui se suivent avec un écart de temps de 4 ms, le premier sera pris en compte immédiatement et le second sera traité avec un peu de retard. Au début la durée de l'impulsion était fixée à 100 ms et je l'ai réduite à cause de ce comportement qui pouvait finalement s'avérer plus gênant, surtout pour ceux qui plaquent souvent des accords... Si vous souhaitez utiliser cette interface pour déclancher des lampes sur de la rythmique informatique ou électronique, il faut tenir compte de cela (bien que bien moins gênant avec la nouvelle valeur de durée d'impulsion de 1 ms).

Schéma

Pour plus de clarté, le schéma a été scindé en deux parties. La première est le coeur du montage avec son microcontrôleur PIC 16F628A, et la seconde est l'interface série / parallèle mettant à disposition les 128 sorties indépendantes. Une alimentation +5 V doit être prévue pour faire fonctionner l'ensemble.

interface_midi_007a
Coeur du montage à base de PIC 16F628A

interface_midi_007b
Convertisseur série / parallèle 128 voies

Fonctionnement général
Le circuit est basé sur un PIC 16F628A dont on exploite l'interface matérielle UART pour la reconnaissance des évenements MIDI reçus. Le logiciel du PIC attend en permanence la réception de données MIDI sur son entrée RB1/RX, et dès qu'une donnée est réceptionnée, elle est placée dans une case mémoire, puis analysée. Si une suite de données reçues (octets) correspond à un évenement MIDI de type NoteOn, la valeur de la note est analysée et la sortie qui lui correspond est activée. La même chose est faite avec les évenements MIDI de type NoteOff , mais cette fois avec pour finalité de désactiver la sortie correspondante. Ceci pour le mode On/Off. En mode Pulse, les sorties sont activées sur réception d'un évenement MIDI de type NoteOn et restent activées pendant 1 ms (ou moins ou plus si vous modifiez et recompilez le code logiciel). La sélection du mode On/Off ou Pulse se fait grâce au cavalier JP2.
- JP2 en place (entrée RB7 du PIC à la masse) : mode On/Off
- JP2 retiré (entrée RB7 du PIC au +5 V via pullup interne) : mode Pulse

Correspondance entre notes MIDI et sorties logiques
Les notes servant à piloter les sorties logiques sont définies par la norme MIDI et sont rappelées ci-après.
DO-2 = 0d = $00 => activation sortie N° 001
....
SOL3 = 67d = $43 => activation sortie N° 068
SOL#3 = 68d = $44 => activation sortie N° 069
LA3 = 69d = $45 => activation sortie N° 070
LA#3 = 70d = $46 => activation sortie N° 071
SI3 = 71d = $47 => activation sortie N° 072
...
SOL8 = 127d = $7F => activation sortie N° 128

Circuit d'horloge / base de temps
Les lignes RA7/OSC1 et RA6/OSC2 du PIC sont utilisées pour y connecter un quartz de 20 MHz avec ses deux inséparables condensateurs de pieds. 

Entrée MIDI
L'entrée MIDI est classique, elle est composée de l'optocoupleur U2 raccordé sur la prise DIN 5 broche J1, via une résistance de limitation de courant (R1) et une diode (D1) protégeant l'optocoupleur en cas d'inversion des deux fils d'entrée de la prise DIN (broches 4 et 5). La sortie de l'optocoupleur, de type NPN, permet de récupérer le signal MIDI au format TTL, grâce à la présence de la résistance R2 reliée au +5 V. Les données MIDI ainsi mises en forme aboutissent à l'entrée RB1/RX du PIC.

Choix du canal MIDI de réception
L'interface réagit si les notes MIDI reçues sont réglées sur un numéro de canal identique à celui spécifié au moyen des quatre microswitches DSW1 / MIDI Channel, qui relient ou non les entrées RB3 à RB6 du PIC à la masse. Quand les interrupteurs sont ouverts, les entrées RB3 à RB6 se retrouvent en l'air et prennent l'état logique haut grâce aux "résistances" de rappel intégrée dans le PIC (pullup activé). Le choix du canal MIDI de réception s'opère selon tableau suivant, la valeur 0 correspond à un interrupteur fermé (broche PIC à la masse) et la valeur 1 correspond à un interrupteur ouvert (broche PIC en l'air et donc à l'état logique haut).

Canal MIDIRB6RB5RB4RB3
10000
20001
30010
40011
50100
60101
70110
80111
91000
101001
111010
121011
131100
141101
151110
161111

Si vous savez d'avance que les données MIDI seront toujours envoyées sur le même numéro de canal, vous pouvez vous passer du quadruple microswitches DSW1 et souder directement les broches RB3 à RB6 au pôle d'alimentation qui convient (masse ou +5 V). Par exemple si les notes reçues le sont toutes sur le canal MIDI N°1, alors les quatre broches du PIC RB3 à RB6 peuvent être raccordées directement à la masse. Et si les notes reçues le sont toutes sur le canal MIDI N°16, alors les quatre broches du PIC RB3 à RB6 peuvent être raccordées directement au +5 V.
Remarque : le numéro de canal MIDI spécifié par l'utilisateur via les interrupteurs DSW1 est lu uniquement lors de la mise sous tension du système. Tout changement opéré pendant que le système est en fonctionnement normal est ignoré. On pourrait fort bien lire la valeur des interrupteurs en boucle durant le fonctionnement normal mais cela réduirait un peu le temps de réaction de l'interface.

Sortie MIDI
La sortie MIDI est optionnelle, et n'est là que pour permettre de vérifier le bon fonctionnement de l'interface en cas de doute. Cette dernière délivre en effet brièvement une note MIDI C3 (Do3) lors de son initialisation, ce qui permet dès la mise sous tension de savoir si tout démarre bien côté logiciel. Cette sortie permet aussi de confirmer la bonne prise en compte des notes reçues, par simple écho de l'entrée vers la sortie (ce n'est pas du MIDI THRU car ça passe par du traitement logiciel). Pour que le mode echo soit activé, le cavalier JP1 doit être positionné de telle sorte que la broche RA3 du PIC soit porté au +5 V. Si l'entrée RA3 est reliée à la masse, le mode echo n'est pas activé et le seul moment où des données MIDI sont émises est celui de l'initialisation générale (mise sous tension ou appui sur le bouton de reset). Le mode echo est très pratique pour tester les limites de l'interface quand on envoie des données très rapprochées avec un séquenceur. La sortie MIDI de l'interface peut en effet être rebouclée sur le séquenceur qui envoie les notes. En même temps que le séquenceur joue ses notes, il peut enregistrer celles qu'il reçoit. La comparaison entre données émises et données reçues par le séquenceur est alors assez aisée et permet de voir s'il y a des ratées. Le temps de traitement pris par le PIC pour renvoyer les notes reçues n'est évidement pas nul, mais il est assez court (environ 1 ms pour chaque note ré-émise) pour considérer qu'il ne perturbera pas trop un diagnostic éventuel.
Remarque : la fonction Echo spécifiée par la position de JP1 est lue uniquement lors de la mise sous tension du système. Tout changement opéré pendant que le système est en fonctionnement normal est ignoré.

Exploitation des sorties du PIC
Les sorties 1 à 128 sont mises à disposition au travers de registres à décallage de type CD4094, qui sont des circuits intégrés de type CMOS et donc peu enclins à délivrer des centaines d'ampères (comptez quelques mA au mieux par sortie). Vous devrez donc passer par une interface plus costaud pour commander vos appareils. Pour l'étape de test et simplement pour vérifier les changements d'état des sorties, vous pourrez vous contenter de simples LED avec résistance série d'au moins 1 kO. Un point de départ pourrait bien se trouver à la page Afficheur LED sept segments 005, pour des commandes en basse tension (petites lampes ou petits moteurs). Pour des commandes sur secteur 230 V, vous devrez passer par des triacs ou mieux encore par des opto-triacs (plus de sécurité). Exemple en page Interface port parallèle 003.

Une seule sortie logique pour plusieurs notes MIDI ?
Vous aimeriez bien que l'arrivée de plusieurs notes MIDI activent une seule et même sortie logique. Dans l'état actuel des choses, on ne peut pas le faire au niveau du PIC. Mais cela est très simple en externe, avec des diodes montées en OU logique, comme le montre l'extrait de schéma suivant.

interface_midi_007_out_ext

Le nombre de sorties qui peuvent être combinées en OU logique n'est pas limité.

Améliorations / modifications possibles

En ce qui concerne les limitations liées aux temps de traitement des sorties, il existe plusieurs façons d'améliorer les choses. Actuellement, le logiciel traite les données MIDI au fur et à mesure de leur arrivée et les place dans un buffer circulaire, ce qui limite considérablement le risque de perdre des données reçues. Pour un usage avec des contraintes de temps particulières, on pourrait envisager que les notes MIDI reçues soient prises en compte "à l'avance" dans le PIC et qu'une note MIDI particulière (note MIDI la plus haute par exemple) provoque la mise à jour globale des sorties. Cela permettrait de préparer l'interface à l'avance et de ne pas mettre à jour l'ensemble des sorties à chaque fois qu'une nouvelle note (ON ou OFF) est reçue. Ce type de fonctionnement peut être envisagé si on fait usage d'un séquenceur logiciel mais serait sans doute moins pratique pour un jeu temps réel d'un musicien ou d'un opérateur. Comme il reste des broches d'entrée / sortie disponibles sur le PIC, le mode de fonctionnement pourrait tout à fait être choisi par l'utilisateur. Bien entendu dans ce cas on ne disposerait pas de 128 sorties utiles mais de "seulement" 126 ou 127. Pour ce qui est du temps entre chaque instruction (changement d'état) des lignes Data, Clock et Strobe qui font le lien entre le PIC et les registres CD4094, je me suis fixé une valeur voisine de 1 us, ce qui correspond à une fréquence max de 1 MHz. D'après le datasheet du CD4094, le circuit est supposé pouvoir travailler jusqu'à 5 MHz sous une tension d'alim de +5 V et je préfère ne pas le pousser à bout.
Pour l'usage en mode Pulse, on peut utiliser des monostables externes aux PIC (par exemple des CD4528 ou CD4538) pour augmenter la durée des impulsions. Mais alors côté matériel ça commence à faire un peu lourd : il y a deux monostables dans un même boîtier CD4538 et ça porterait le nombre de bêtes multipattes additionnelles à 64. Le code source du programme étant livré, vous pouvez faire ce que vous voulez de ce côté. Dans ce cas on peut ajuster les durées d'impulsion de façon individuelle pour chaque sortie. Par exemple 200 ms pour un coup de grosse caisse et 100 ms pour une caisse claire.

Alimentation

L'alimentation du montage doit impérativement être de +5 V et vous pouvez vous contenter d'une alim simple basée sur un régulateur de tension de type LM7805 comme celle décrite à la page Alim simple 001. La consommation globale est relativement faible (moins de 50 mA), mais attention si l'alimentation doit aussi assurer la partie interface puissance... 128 malheureuses LED consommant chacune 4 mA et allumées simultanément, et vous atteignez déjà 500 mA en global !

Choix d'autres optocoupleurs

Il est possible d'utiliser d'autres optocoupleurs pour l'entrée MIDI, voir page Interfaces MIDI pour plus de détails. 

Brochage des prises MIDI

Câblage valable pour les prises MIDI IN, MIDI OUT et MIDI THRU.

midi_din_cablage_001

La borne 2 est reliée à la masse au niveau des sorties mais pas au niveau des entrées, pour éviter toute boucle de masse entre équipements.

Logiciel du PIC

Les fichiers de code source (MikroPascal V3.80 Pro) et binaire compilé (*.hex) sont disponibles dans les archives dont les liens suivent. Pour ceux qui se contentent de la version canal MIDI fixe (canal réception fixé à 1), inutile de s'encombrer avec des microswitches et inutile de configurer les broches RB3 à RB6 du PIC. C'est pourquoi je laisse les deux versions à disposition. 
Interface MIDI 007 - PIC 16F628A - Version avec réglage canal MIDI - Quartz externe 20 MHz - Version du 22/05/2011
Important : dans l'archive "20 MHz" (la plus récente) vous trouverez deux ensembles de fichiers :
- fichiers *_007b.* : version fonctionnelle avec buffer circulaire, à essayer en priorité.
- fichiers *_007.* : version fonctionnelle sans buffer circulaire, uniquement conservée pour historique.
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Archive
Plutôt laissé à titre d'info et d'analyse du code source plutôt que pour du 100% fonctionnel. Mode On/Off OK mais mode pulse non opérationnel. Attention donc à cette plus ancienne version dont le bug bug en mode pulse n'a pas été corrigé et que je ne maintiendrai pas !
Interface MIDI 007 - PIC 16F628A - Version avec canal MIDI réglé à 1 - Quartz externe 8 MHz - Version du 20/03/2011

Prototype (le mien)

Pas encore fini. Il me manque encore quelques ULN2803 mais cela ne m'empêchera pas d'entamer les tests dès que tous les fils seront soudés, les petites LED sont là pour ça.

interface_midi_007_proto_001a interface_midi_007_proto_001b interface_midi_007_proto_001c interface_midi_007_proto_001d

J'ai prévu des ULN2803 pour l'interfaçage avec des relais, bien que ces derniers ne sont absolument pas indispensables pour le test de l'interface. Le câblage entre CD4094 et ULN2803 est direct, sans résistance intermédiaire. Les LED employées sont de type miniatures, je n'avais pas la place ici pour mettre des LED de 3 mm, l'espace entre chacune étant de 2,54 mm. Les sorties des ULN2803 attaquent donc les LED au travers de résistances de 1,2 kO (j'ai vérifié avant qu'elles s'éclairaient bien avec cette valeur de résistance et avec une tension d'alim de 12 V) et en même temps sont disponibles pour les relais grâce aux borniers à picots surélevés. Le haut du circuit imprimé sera comblé par les prises MIDI et l'alimentation secteur.

Prototype de Xavier B.

Je tiens à remercier chaleureusement Xavier, qui m'a bien aidé dans les tests de cette interface (c'est lui qui m'a fait part des bugs qui ont été corrigés par la suite). Les photos qui suivent viennent de chez lui.

interface_midi_007a_proto_xb_001a interface_midi_007a_proto_xb_001b

Le premier quart gauche du circuit comporte des composants servant de générateur MIDI, ce qui a évité à Xavier de s'encombrer de son clavier musical pour l'ensemble des tests. Cette partie ne fait pas partie de mon interface. Les trois quarts de droite du circuit constituent l'interface MIDI 007 en elle-même, chargée du logiciel version 007b. D'après Xavier, le fonctionnement est parfaitement fluide, sans les petits défauts de fin de notes qui apparaissaient parfois quand il jouait vite, avec la version précédente (celle d'avant le 15/05/2011).

Prototype de Philippe

Philippe a également réalisé cette interface et avait rencontré les mêmes petits problèmes de relachement de note non reconnus quand il jouait vite. Il a installé la dernière version et en est désormais pleinement satisfait.

Circuit imprimé

Non réalisé. Vue 3D uniquement là pour donner un aperçu des composants utilisés.

Corrections et remarques

22/05/2011
- Correction bug : certaines sorties des CD4094 pouvaient s'activer de façon aléatoire lors de la mise sous tension, le problème disparaissant à la première note MIDI reçue. Désormais, toutes les sorties sont initialisées à l'état bas dès la mise en route.
15/05/2011
- Correction bug majeur : les sorties logiques étaient correctement activées sur réception d'évenements NoteOn mais n'étaient pas désactivées lors de la réception des évenements NoteOff correspondant, quand le canal MIDI spécifié était différent de 1. Pour être plus précis, cela fonctionnait si le relachement de la note sur le clavier était constitué d'un NoteOn avec vélocité de valeur 0, mais ne fonctionnait pas avec un "vrai" NoteOff. Donc OK ou non-OK selon clavier utilisé.
- Correction bug majeur : en mode Pulse, les sorties logiques étaient correctement activées sur réception d'évenements NoteOn mais ne se désactivaient pas au terme du délai fixé (par défaut 1 ms) - sauf pour la sortie 001 qui fonctionnait bien. Ca m'apprendra à ne faire les tests qu'avec une seule sortie...
- Afin de conserver un temps de réaction de l'interface assez rapide en mode pulse (temps mort de durée moindre), la durée des impulsions a été réduite à 1 ms (initialement à 100 ms). Bien entendu, si la durée de 100 ms vous convient, vous pouvez toujours l'adopter, sachant que lors de la réception de nombreux évenements en un temps réduit, les plus récents seront traités rapidement et les suivants seront traités avec du retard s'ils arrivent avant la fin de l'impulsion correspondant à la note précédente.
- Vitesse UC augmentée, quartz externe 8 MHz remplacé par quartz 20 MHz.
- Mise en place d'un buffer circulaire dans la logique de traitement des données MIDI reçues, pour limiter le risque de perdre des infos quand ça se bouscule au portillon.

Important : la correction des bugs indiqués ci-avant ne concerne que la version logicielle avec réglage canal MIDI, l'ancienne version mono-canal MIDI ne sera pas maintenue. Je conseille donc désormais d'utiliser la version la plus récente avec quartz 20 MHz et buffer circulaire.