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.
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.
Coeur du montage à base de PIC 16F628AConvertisseur 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 MIDI | RB6 | RB5 | RB4 | RB3 |
1 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 1 |
3 | 0 | 0 | 1 | 0 |
4 | 0 | 0 | 1 | 1 |
5 | 0 | 1 | 0 | 0 |
6 | 0 | 1 | 0 | 1 |
7 | 0 | 1 | 1 | 0 |
8 | 0 | 1 | 1 | 1 |
9 | 1 | 0 | 0 | 0 |
10 | 1 | 0 | 0 | 1 |
11 | 1 | 0 | 1 | 0 |
12 | 1 | 0 | 1 | 1 |
13 | 1 | 1 | 0 | 0 |
14 | 1 | 1 | 0 | 1 |
15 | 1 | 1 | 1 | 0 |
16 | 1 | 1 | 1 | 1 |
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.
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.
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.
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.
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.