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

Dernière mise à jour : 01/01/2012

Article non terminé, volontairement non référencé dans les sommaires du site


Présentation

Cette interface MIDI, basée sur un microcontrôleur de type PIC 16F877A, dispose de 8 entrées analogiques, de 64 entrées logiques, d'une sortie MIDI OUT pour l'envoi des évenements MIDI et d'une entrée MIDI In pour permettre à l'utilisateur de spécifier les données MIDI à générer si celles par défaut ne conviennent pas (voir avertissements).

interface_midi_003_pcb_3d_a

Les entrées logiques servent à envoyer de simples notes (évenements NoteOn et NoteOff), et les entrées analogiques servent à envoyer des données contenant un paramètre variable (Control Change, Program Change, Volume, Aftertouch, Panoramique, etc). Je l'ai mise au point un peu pour "m'amuser", n'ayant pas de besoin particulier au moment de sa conception. J'avoue tout de même avoir été un peu influencé par une discussion brêve avec un musicien ayant construit un orgue de barbarie qu'il souhaitait doter d'une interface MIDI, laquelle devait posséder 30 entrées de type logique. Une interface un peu plus simple, dotée de 32 entrées logiques et d'une sortie MIDI Out, sera prochainement présentée à la page Interface MIDI 004. Voir aussi la page relative au Contrôleur MIDI 003 qui possède 128 entrées "touches multiplexées" pour composer un clavier maître simplifié.

Avertissement

La version actuellement mise à disposition est fonctionnelle pour tout ce qui touche à l'élaboration des données MIDI et à leur envoi, mais le paramétrage par l'utilisateur des données à émettre n'est pas implémenté pour les entrées numériques. En d'autres termes les données émises sont des notes dont la valeur est figée en dur dans le programme pour ce qui est des entrées numériques mais sont paramétrables pour les entrées analogiques. Faute à l'espace mémoire du PIC qu'à priori je ne sais pas encore gérer correctement.

Schéma

Le voici dans une version normalement finalisée.

interface_midi_003
Schéma de l'interface - En cours de tests

interface_midi_003_commandes
Circuiterie de commande utilisée pour les tests

Fonctionnement général
Cette interface est de type "MIDI Out" ou "Générateur MIDI" : le logiciel interne au PIC scrute en permanence les entrées analogiques et les entrées logiques, et transmet une information MIDI quand l'état d'une des entrées a changé. Par défaut, les notes générées lors de l'appui sur les boutons poussoirs BP1 à BP64 vont du Do0 (valeur hexa $18) au Re#5 (valeur hexa $57), avec une vélocité de 100. 

Spécification du nombre d'entrées à activer
Les entrées analogiques et les entrées numériques, pour être toutes lues, demandent un certain temps processeur. Afin de ne pas gaspiller des ressources pour des entrées inutilisées, il est possible de spécifier l'activation des entrées analogiques (A1 à A8) par groupes de deux, et l'activation des entrées logiques (D1 à D64) par groupes de 16, selon le tableau suivant.

Position switches
DSW1 a-d (nota 1)
Groupe Ana 1
(A1 et A2)
Groupe Ana 2
(A3 et A4)
Groupe Ana 3
(A5 et A6)
Groupe Ana 4
(A7 et A8)
Groupe Dig 1
(D1 à D16)
Groupe Dig 2
(D17 à D32)
Groupe Dig 3
(D33 à D48)
Groupe Dig 4
(D49 à D64)
0000
Activé Désactivé Désactivé Désactivé Activé Désactivé Désactivé Désactivé
0001
Activé Activé Désactivé Désactivé Activé Désactivé Désactivé Désactivé
0010
Activé Activé Activé Désactivé Activé Désactivé Désactivé Désactivé
0011
Activé Activé Activé Activé Activé Désactivé Désactivé Désactivé
0100
Activé Désactivé Désactivé Désactivé Activé Activé Désactivé Désactivé
0101
Activé Activé Désactivé Désactivé Activé Activé Désactivé Désactivé
0110
Activé Activé Activé Désactivé Activé Activé Désactivé Désactivé
0111
Activé Activé Activé Activé Activé Activé Désactivé Désactivé
1000
Activé Désactivé Désactivé Désactivé Activé Activé Activé Désactivé
1001
Activé Activé Désactivé Désactivé Activé Activé Activé Désactivé
1010
Activé Activé Activé Désactivé Activé Activé Activé Désactivé
1011
Activé Activé Activé Activé Activé Activé Activé Désactivé
1100
Activé Désactivé Désactivé Désactivé Activé Activé Activé Activé
1101
Activé Activé Désactivé Désactivé Activé Activé Activé Activé
1110
Activé Activé Activé Désactivé Activé Activé Activé Activé
1111
Activé Activé Activé Activé Activé Activé Activé Activé
Nota 1 : SDW1a = inter 1-8 (GA0Set), SDW1b = inter 2-7 (GA1Set), SDW1c = inter 3-6 (GD0Set), SDW1c = inter 4-5 (GD1Set). Par exemple, pour la première ligne, 0000 correspond à tous les inters en position OFF. Pour la deuxième ligne, 0001 indique que seul l'inter entre pattes 4 et 5 de DSW1, est en position ON.

Remarques
- Il y a toujours au moins un groupe d'entrées analogiques activé (deux entrées) et un groupe d'entrées logiques activé (16 entrées), quelque soit la position des switches.

Entrées analogiques
Les huit entrées analogiques correspondent aux entrées des huit CAN (Convertisseurs Analogique / Numérique, appelés aussi ADC pour Analog to Digital Convertor) AN0 à AN7 du PIC. Le CAN du PIC a une résolution de 10 bits, ce qui correspond à 1024 valeurs possibles. Les données MIDI qui seront élaborées à partir des valeurs analogiques lues étant codées sur 7 bits, les 3 bits de poids faible sont ignorés, ce qui s'obtient simplement en divisant la valeur lue en sortie du CAN (comprise entre 0 et 1023) par 8 (résultat compris entre 0 et 127). L'avantage principal lié à la troncature des bits de poids faible est que l'on risque beaucoup moins d'avoir des données MIDI générées pour de toutes petites variations de tension sur les entrées analogiques, on reste à l'essentiel (de toute façon, ces trois bits n'auraient servi à rien). La variation de tension minimale requise sur chaque entrée analogique, pour pouvoir être considérée comme ayant évolué par rapport à la mesure précédente, correspond donc à 5 V / 127 = 40 mV environ.

Entrées logiques
Le PIC 16F877A ne dispose pas nativement de 64 entrées logiques, et on est obligé de recourir à du multiplexage pour contourner ce manque. Le principe du multiplexage est très simple, il consiste à "mettre en grille" un certain nombre d'entrées / sorties, de sorte que l'on dispose de plusieurs colonnes et de plusieurs rangées. Avec 8 colonnes et 8 rangées (16 connections physiques d'entrées / sorties), on dispose ainsi de 64 points de croisement possibles. Il suffit en effet de mettre sous tension une seule rangée à la fois, et de regarder si un contact est établi à ce moment entre la rangée active et une ou plusieurs colonnes (on peut travailler dans l'autre sens : rendre active une colonne et regarder s'il y a contact établi avec une ou plusieurs rangées). Cette façon de faire est plus gourmande en temps de travail car les rangées (ou colonnes) doivent être traitées séquentiellement, mais c'est la rançon à payer pour disposer d'un nombre d'entrées important. Il faut bien sûr s'assurer qu'avec cette méthode de travail, le temps de traitement des entrées / sorties (temps d'activation et de scrutation) soit faible par rapport au temps total disponible pour l'ensemble des opérations que doit mener à bien le microcontrôleur.

Modification des notes à jouer (entrées logiques)
Pour spécifier des notes à jouer différentes de celles proposées par défaut, il convient de procéder ainsi :
- Placer l'interrupteur de mode SW1 (Norm/Prog) en position fermée.
- Appuyer une fois sur le bouton poussoir correspondant à l'index de la note à modifier (BP1 à BP64), pendant au moins une seconde. La led D1 s'allume brièvement pour confirmer la prise en compte de l'entrée logique sélectionnée.
- Envoyer la note désirée sur l'entrée MIDI In de l'interface. La led D1 clignote brièvement pour confirmer la bonne prise en compte des données reçues sur l'entrée MIDI In.
C'est tout ! La note reçue par l'interface est désormais stockée dans l'EEPROM du PIC, et sera conservée même après coupure d'alimentation.
Remarque : à cause d'un espace mémoire insuffisant dans le PIC, je ne pouvais permettre à l'utilisateur de spécifier la hauteur, le canal MIDI et la vélocité de façon individuelle pour chaque note. C'est pourquoi seule la hauteur de la note (pitch) peut être modifiée de façon individuelle, le canal MIDI (par défaut à 1) et la vélocité (par défaut à 100) pouvant être modifiées mais pour l'ensemble des notes. Ainsi, si la note reçue par le PIC pour programmer le bouton BP7 est positionnée en canal MIDI 12 avec une vélocité de 110, alors toutes les notes émises lors de l'appui sur les poussoirs BP1 à BP64 seront positionnées sur le canal MIDI 12 et avec une vélocité de 110.

Modification des données MIDI "continues" à envoyer (entrées analogiques)
Pour spécifier le type d'évenement MIDI à transmettre quand une entrée analogique est sollicitée, il convient de procéder ainsi :
- Placer l'interrupteur de mode SW1 (Norm/Prog) en position fermée.
- Modifier la tension arrivant sur l'entrée analogique pour laquelle le type d'évenement MIDI doit être spécifié (s'il s'agit d'un potentiomètre, tournez simplement son curseur dans un sens ou dans l'autre). La led D1 s'allume brièvement pour confirmer la prise en compte de l'entrée analogique sélectionnée.
- Envoyer un évenement MIDI du même type que celui qui devra être généré avec cette entrée analogique, sur l'entrée MIDI In de l'interface. La led D1 clignote brièvement pour confirmer la bonne prise en compte des données reçues sur l'entrée MIDI In.
Le type d'évenement MIDI reçu par l'interface est désormais stocké dans l'EEPROM du PIC, et sera conservé même après coupure d'alimentation.

Sauvegarde des données utilisateurs en EEProm

Les valeurs des notes, vélocités et évenements MIDI à transmettre sur activation / modification des entrées logiques et analogiques, sont stockées dans l'EEProm du PIC selon la table d'adressage qui suit (rappelons en passant que l'espace d'adressage EEProm est de 256 octets pour le 16F877A). Ces détails sont données à titre d'info pour les curieux, nul besoin d'en avoir connaissance pour utiliser l'interface MIDI. Un ou trois octets sont monopolisés pour chaque information MIDI pouvant être émise, qu'il s'agisse d'une note ou d'un message de contrôle tel que Control Change. Pour les 64 entrées logiques on utilise 64 octets d'EEProm et pour les 8 entrées analogiques on utilise 24 octets d'EEProm. 

Entrées
Données
Emplacement mémoire
Analogiques3 octets pour chaque entrée analogiqueentre $00 (000d) et $17 (23d)
Logiques 1 octet pour chaque entrée logique entre $18 (24d) et $57 (87d)
Logique / Canal MIDI1 octet$58 (88d)
Logique / Vélocité1 octet$59 (89d)

Pour les entrées analogiques, le premier octet de chaque triplet d'octets spécifie le type d'information (note ou autre type de message MIDI). Les second et troisième octets correspondent à des valeurs de paramètre qui dépendent du type de message : si le premier octet indique que le message est une note MIDI, alors le second octet indiquera la hauteur de la note à jouer et le troisième octet indiquera la vélocité. Si le premier octet indique que le message est un message de type "contrôleur" (Control Change par exemple), alors le second octet indiquera le numéro du contrôleur et le troisième octet indiquera la valeur du contrôleur.

Remarques
- En ce qui concerne les entrées analogiques, on stocke trois octets en EEProm alors que deux seulement seront réellement utilisés, puisque le troisième sera recréé en temps réel selon valeur de la tension lue sur les entrées analogiques. Disons que cela pourra peut-être servir en cas d'extension à laquelle je ne pense pas spécialement aujourd'hui.
- En ce qui concerne les entrées logiques, on pourrait aussi demander à envoyer des systèmes exclusifs brefs tels que des commandes de transport (Start ou Stop par exemple) qui sont des messages "système temps réel". Dans ce cas un seul octet serait réellement utilisé... puisque ce type de message ne comporte qu'un seul octet. L'envoi de contrôleurs continus via les entrées logiques pourrait à priori sembler incongru puisque c'est toujours la même valeur qui est transmise mais c'est aussi possible (on pourrait à la limite envisager l'envoi d'un contrôleur avec une valeur min via une entrée logique et l'envoi du même contrôleur mais avec une valeur max via une seconde entrée logique).

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.

Etat d'avancement (au 29/05/2011)

Fait
Tout ce qui doit être fait en mode "Normal" :
- Balayage / scrutation / lecture des ports logiques (PORTB / PORTD).
- Lecture / analyse des entrées analogiques (PORTA / PORTE)
- Limitation des entrées réellement analysées, fonction de l'état des entrées RC2 à RC5.
- Routines envoi évenements MIDI implémentées - pour l'instant, les notes envoyées sont figées en dur, du Do0 au Re#5 pour les entrées logiques.
Reste à faire
Tout ce qui doit être fait en mode "Programmation" :
- Programmation par l'utilisateur des évenements MIDI à jouer via réception des notes MIDI pour les entrées analogiques.

Logiciel du PIC

Le logiciel du PIC a été développé sous l'environnement MikroPascal Pro for PIC V4.80, vous trouvez ci-après l'archive contenant les codes source et le fichier binaire compilé (*.hex) prêt à flasher.
Interface MIDI 003 - PIC 16F877A - version du xx/xx/xxxx
(archive non disponible tant que pas fini et testé)

Circuit imprimé

Non réalisé.