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).
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.
Schéma de l'interface - En cours de
tests
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
|
Analogiques | 3 octets pour chaque entrée analogique | entre $00 (000d) et $17 (23d) |
Logiques
|
1 octet pour chaque entrée logique |
entre $18 (24d) et $57 (87d) |
Logique / Canal MIDI | 1 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.
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)
FaitTout 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 à faireTout 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é.