Dernière mise à jour :
28/08/2016
Présentation
Ce système MIDI basé sur un microcontrôleur PIC
18F47J13
dispose de 16 entrées analogiques, de 96 entrées logiques (extensible à 128),
d'une
sortie MIDI OUT pour l'envoi des
évenements MIDI
et d'une
entrée MIDI In pour la configuration (spécification par l'utilisateur des données MIDI à délivrer).
Les entrées logiques #0 à #87 sont utilisées pour envoyer des
événements de type "Note" et les entrées #88 à #95 (ou #88 à #127) sont
utilisées pour configurer certains paramètres (transposition,
canal MIDI, running status, etc). Les entrées
analogiques servent quant à elle à envoyer des données variables
(Control Change, Volume,
PitchBend, Aftertouch, Panoramique, etc). J'ai développé cette
interface en tant "qu'extension naturelle" de mon
contrôleur MIDI 003
et j'ai tout à fait conscience que pour ce genre de projet il
aurait été préférable de mettre de côté mes PIC18 et d'opter
définitivement
pour un PIC24 ou un PIC32. Mais cela viendra ;-)
Avertissement
A ce jour le prototype est
fonctionnel, mais le paramétrage par l'utilisateur des données
"analogiques" à envoyer
n'est pas encore implémenté (les données transmises sont toujours des
ControlChange). La partie clavier (notes et configuration) fonctionne
intégralement.
Schéma
Le
système est scindé en deux parties, carte UC et carte d'entrée.
Carte processeur (UC)
Carte d'entrées (analogiques et numériques)
Fonctionnement général
Le logiciel interne au PIC lit en
boucle les entrées analogiques et les entrées
logiques, et délivre un événement MIDI quand l'état d'une des entrées a
changé. Pour les entrées analogiques, on utilise un CAN (Convertisseur
Analogique/Numérique) associé à des multiplexeurs analogiques, et pour
les entrées logique on utilise un clavier matricé 12*8 avec diodes de
protection, avec là aussi des multiplexeurs analogiques (mais cette
fois utilisés avec des signaux logiques).
Entrées analogiques
Les
seize entrées analogiques sont lues grâce au CAN du PIC, via sa broche
RA0/AN0. Le multiplexage des 16 entrées s'effectue en externe avec des
commutateurs analogiques CD4051. La résolution de la conversion peut se
faire en 10 ou 12 bits avec ce PIC, je suis resté sous 10 bits puisque
les valeurs "analogiques" transmises seront toujours codées sur 7 bits.
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 à 5
V / 127 = 40 mV environ. Le temps de lecture et d'analyse d'une entrée
analogique est d'environ 110 us (environ 1,8 ms pour la lecture des 16 entrées). Une petite astuce logicielle
permet d'éviter l'envoi de données à répétition quand la source de
tension (issue d'un potentiomètre par exemple) se trouve "à cheval" sur
deux pas de quantification du CAN et qu'à cause du bruit on bascule sans arrêt entre deux valeurs adjacentes.
Entrées logiques
Toutes les entrées logiques sont scannées de la même façon mais sont séparées en deux groupes :
- entrées #0 à #87 pour les notes (88 notes max)
- entrées #88 à #95 (ou #88 à #127 si extension) pour les paramètres de configuration
Le
PIC 18F47J13 ne possède pas assez de broches pour traiter directement
96 (ou 128) voies, c'est la raison d'être du clavier multiplexé. Les deux
multiplexeurs U5 et U6 (CD4051) permettent de travailler sur 16
lignes (16*8 = 128 entrées) ou sur 12 lignes seulement comme c'est le cas ici (12*8 = 96 entrées). Ca, c'est pour
l'envoi des données de
multiplexage. Pour la réception des données (décodage des touches
enfoncées) cela se passe directement sur le PORTD du PIC (retour des infos en 8 bits). Le temps de
balayage et d'analyse de 96 touches est d'environ 1,2 ms (ce temps est
réduit si l'étendue des notes à prendre en compte est réduite). La
fonction d'anti-rebond (
debounce) est assurée de façon purement logicielle.
Entrées logiques utilisées pour la configuration du contrôleur- Entrées #88 et D#89 : transposition +1/2 ton et -1/2 ton (par défaut, aucune transposition)
- Entrées #90 et D#91 : réglage canal MIDI (par défaut, canal MIDI 1)
- Entrées #92 et D#93 : réglage vélocité (par défaut, valeur de 110)
- Entrée #94
: activation/désactivation fonction "Auto-Panic" (envoi reset MIDI
si NoteOn > 10 secondes). A noter que le bouton SW2/Panic joue un
rôle immédiat, contrairement au mode Auto-Panic qui n'agit qu'au bout
d'un certain temps.
- Entrée #95 : activation/désactivation fonction "Running Status"
(compression données lors des accords, désactivé par défaut)
Lors
de la modification des paramètres numériques (transposition, vélocité,
etc) la LED clignote deux fois quand on incrémente la valeur, elle
clignote une fois si on la décrémente. Pour les paramètres On/Off
(Running Status et Auto-Panic) la LED clignote deux fois quand le
paramètre est activé, elle clignote une fois quand il est désactivé.
Les entrées additionnelles disponibles avec l'extension vers 128 voies
(entrées logiques #96 à #127) n'ont pour l'heure aucune fonction
précise.
Spécification des entrées à activer
La lecture des entrées analogiques et numériques demande un "certain
temps" processeur. Ce "certain temps" diffère de celui requis pour le
refroidissement d'un fût de canon (je ne pense pas que Fernand me
contredirait) puisqu'il est de l'ordre de 3 ms quand on lit les 16
entrées analogiques et les 96 entrées logiques.
Afin de ne pas gaspiller des ressources inutiles pour les entrées
non utilisées, il est possible de spécifier quelle sont les
entrées analogiques (A1 à A16) à prendre en compte. Pour les entrées
numériques, il est possible de spécifier la plage des notes à traiter,
par exemple début de plage à C3 et fin de plage à A6. Le paramétrage
s'effectue par messages MIDI de type "SysEx" appliqués sur l'entrée MIDI IN.
- Message à envoyer pour activer ou désactiver une entrée analogique :
[$F0] [$06] [$01] [$xx] [$yy] [$F7]
où $xx correspond au numéro de l'entrée analogique à activer ou désactiver (de 0 à 15)
et où $yy correspond à la valeur requis pour activer ($7F) ou désactiver ($00) l'entrée concernée
Par défault, toutes les entrées analogiques sont activées.
- Message à envoyer pour paramétrer le type de donnée à envoyer avec les entrées analogiques :
[$F0] [$06] [$02] [$xx] [$yy] [$F7]
où $xx correspond au numéro de l'entrée analogique à configurer
et où $yy correspond au type de donnée à envoyer (numéro de contrôleur par exemple)
- Message à envoyer pour définir la première note MIDI à traiter :
[$F0] [$05] [$08] [$xx] [$F7]
où $xx correspond au numéro de la note de début de plage (de 0 à 127) - valeur par défaut = 0
- Message à envoyer pour définir la dernière note MIDI à traiter :
[$F0] [$05] [$09] [$xx] [$F7]
où $xx correspond au numéro de la note de fin de plage (de 0 à 127) - valeur par défaut = 127
Remarque
: les données de configuration reçues sur l'entrée MIDI IN sont
toujours prises en comptes (placées dans un buffer/tampon) mais ne sont
traitées que lorsque l'interrupteur SW1/MODE est fermé. Certains des
paramètres ajustés via l'entrée MIDI IN et messages SysEx auraient pu
l'être avec quelques entrées logiques additionnelles (parmi les entrées
#96 à #127). Il fallait faire un choix entre un nouveau groupe de
boutons/diodes et un connecteur MIDI avec son optocoupleur. La deuxième
solution a été retenu pour les possibilités d'évolution.
Bus I2C ?
Prévu
(broches RC3 et RC4 du PIC) mais actuellement inutilisé. Il pourra
servir pour la sauvegarde éventuelle de paramètres sur une EEPROM
externe, ou l'affichage de données sur un écran LCD.
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.
Prototype
Réalisé avec un PIC 18F47J13 CMS soudé sur module DIP40, et mon petit module d'
interface MIDI 011.
Photo prise avant assemblage et test du "clavier" C'est plus simple comme cela ;-)
Logiciel du PIC
Logiciel non disponible sur ce site.
Circuit imprimé
Non réalisé, vue 3D seulement pour aperçu.
Historique
28/08/2016
- Première mise à disposition.