Dernière mise à jour :
09/10/2016
Présentation
Ce merger MIDI dispose de deux entrées MIDI et de deux sorties MIDI, et il est plus "intelligent" que mes deux précédents
MIDI merger 001
et
MIDI merger 002.
Il permet le traitement simultané de données sur les deux entrées MIDI
et
n'en perd pas une goutte tant que le débit des données restent
raisonnable (les Sysex étendus de plus de 4 millions d'octets par
micro-seconde ne sont pas tolérés).

Caractéristiques principales
- Mémoire tampon de 1 KO pour chaque entrée.
- Routage In1/In2 vers Out1/Out2 selon souhait utilisateur (sans décâblage des cordons MIDI).
- Premier
arrivé, premier servi : l'évenement qui arrive en premier est dirigé en
priorité vers la sortie sélectionnée. Les données arrivant sur l'autre entrée sont
traitées une fois l'évenement précédent entièrement transmis (on ne
mélange évidement pas les évenements de type Note avec les évenements
de type MMC ou autres).
- Timeout de sécurité : dans le cas où un
évenement n'arrive pas dans son intégralité (problème de liaison ou
câble débranché pendant la transmission de données) durant un temps
déterminé (par exemple 150 ms), le système peut refuser son envoi sur la
sortie sélectionnée.
- Filtrage de messages tels que Pitch-Wheel ou Sysex.
- Décodage/codage de Running Status.
Bien
sûr on peut faire un MIDI-merger avec un PIC plus simple tel que le 16F628A, mais dans ce cas
il faut se contenter d'une mémoire tampon fortement limitée (de quelques dizaines d'octets pour chaque
entrée MIDI) ce qui suffit peut-être pour des évenements de type Note mais pas vraiment pour des sysex.
Avertissements
Ce projet n'est pas terminé et n'a été testé qu'avec les événements de type Notes, ControlChange, ProgramChange et Sysex.
- Le running status est déjà implémenté pour les données entrantes, mais pas encore pour les données sortantes.
- Les Sysex sont gérées, mais les tests se sont limités à des messages de faible longueur (68 octets).
Schéma
Le PIC 18F46K22 utilisé est plus gros qu'un 16F628A, et
il
est vrai que ses 40 pattes peuvent impressionner. Soyons forts.

-
Entrées MIDI
Chacune des deux entrées MIDI (MIDI IN 1 et MIDI IN 2)
aboutit à un optocoupleur PC900, chargé d'isoler galvaniquement
la sortie de l'instrument que l'on y connecte. Les
résistances R1 et R1' sont chargées de limiter le courant
dans
la LED contenue dans les optocoupleurs, et les diodes D1 et D1'
protègent ces mêmes LED en cas d'inversion de
polarité des fils des câbles MIDI. Ces diodes ne sont pas absolument
indispensables mais je vous conseille tout de même de les mettre. La
sortie des optocoupleurs est chargée par une résistance de 220 ohms (R2
et R2'), au repos nous disposons bien d'un état logique haut sur les
entrées Rx des modules UART du PIC.
Gestion des données MIDI
Les données MIDI qui arrivent sur
chacune des entrées MIDI aboutissent au microcontrôleur dont la
première tâche est de les placer dans une mémoire tampon (buffer
circulaire). Les données reçues transitent ensuite vers la sortie MIDI
Out sélectionnée, dès
que le composant a le temps de les traiter, c'est à dire presque tout
le temps. Le routage des données MIDI (vers la sortie 1 ou 2) est
effectué selon les souhaits de l'utilisateur, qui dispose pour cela des
deux interrupteurs SW1 et SW2 :
- SW1 ouvert et SW2 ouvert (RB4 = 1 et RB5 = 1) : Direct Normal
Les données MIDI qui arrivent sur l'entrée MIDI_In_1 sont routées vers la sortie MIDI_Out_1
Les données MIDI qui arrivent sur l'entrée MIDI_In_2 sont routées vers la sortie MIDI_Out_2 - SW1 fermé et SW2 ouvert (RB4 = 0 et RB5 = 1) : Merging vers MIDI_Out_2
Les données MIDI qui arrivent sur l'entrée MIDI_In_1 sont routées vers la sortie MIDI_Out_2
Les données MIDI qui arrivent sur l'entrée MIDI_In_2 sont routées vers la sortie MIDI_Out_2 - SW1 ouvert et SW2 fermé (RB4 = 1 et RB5 = 0) : Merging vers MIDI_Out_1
Les données MIDI qui arrivent sur l'entrée MIDI_In_1 sont routées vers la sortie MIDI_Out_1
Les données MIDI qui arrivent sur l'entrée MIDI_In_2 sont routées vers la sortie MIDI_Out_1 - SW1 fermé et SW2 fermé (RB4 = 0 et RB5 = 0) : Direct Inverse
Les données MIDI qui arrivent sur l'entrée MIDI_In_1 sont routées vers la sortie MIDI_Out_2
Les données MIDI qui arrivent sur l'entrée MIDI_In_2 sont routées vers la sortie MIDI_Out_1
Bien
entendu, les octets des données MIDI reçues sur les deux entrées ne
peuvent être transmis (routés) directement vers la ou les sorties, sans un minimum d'intelligence. Ces données sont
stockées en attente de leur identification, et c'est seulement
quand cette dernière est assurée qu'elles sont transmises
"en bloc" sur la sortie choisie, sans "croisement" des données
reçues sur les deux entrées. Il va de soi que la gestion la plus
délicate concerne le traitement d'un grand nombre de données reçues en
même temps sur les deux entrées (sysex sur entrées In1 et In2 en même
temps).
Sorties MIDI
Rien de particulier, on retrouve notre broche 4 de la
prise
DIN reliée au +5 V au travers d'une résistance de 220 ohms (R3 et R3'),
la broche 5 de cette même prise DIN recevant les données MIDI venant du
PIC via les résistances R4 et
R4'.
Fonctions annexes
Fonctions actuellement non implémentées, que j'incluerai dans la prochaine version :
- Timeout
Tout message qui ne se termine pas au bout d'un certain laps de temps
après réception de l'entête, peut être éliminé de la liste d'attente
des messages à envoyer sur les sorties. - Filtrage
Les lignes RA0 à RA3 (Filter_A à
Filter_D) permettent de spécifier les messages à filtrer :
- Filter_A (RA0) : filtrage des messages Active Sensign
- Filter_B (RA1) : filtrage des messages Sysex
- Filter_C (RA2) : filtrage des messages PitchWheel
- Filter_D (RA3) : filtrage des messages Aftertouch
Ces lignes de configuartion ne sont actuellement pas exploitées. - Running
Status
Le
Midi Merger 003 reconnait le Running Status. Dans la version actuelle, il accèpte les messages
standards (sans running status) et compactés (avec running status). Les données émises sur les sorties MIDI peuvent
être en mode Standard (sans running status) ou compactée (avec running
status). Ce merger peut donc aussi agir en tant que "convertisseur",
pour passer de "running status" à "non running status" (décompactage),
ou pour passer de "non running status" à "running status" (compactage).
Dans le premier cas cela permet de s'adapter à des machines qui ne
reconnaissent pas le running status, dans le second cas on profite
d'une réduction de débit binaire. Les lignes RA4 et RA5 (RunStat1 et
RunStat2) permettent de spécifier si les données émises sur les sorties
MIDI OUT sont ou non en mode running status. Ces lignes de
configuration ne sont actuellement pas exploitées.
Procédure de tests
J'ai procédé en deux étapes :
- envoi de données simples (notes, CC et PC) et sysex sur les deux entrées MIDI, en alternance rapprochée;
- envoi de données simples (notes, CC et PC) et sysex sur les deux entrées MIDI, en simultané.
La seconde méthode est bien entendu moins sympathique pour le microcontrôleur.
Envoi de données en alternance (moins contraignant pour le PIC)
Envoi de données en simultané (un peu plus stressant pour le PIC)Dans les deux cas, les données en sorties MIDI ont été correctement restituées.
Vue de détail de deux flux courts mergés vers la sortie Midi Out 2
Alimentation
L'alimentation est assurée localement par un petit régulateur de
tension tripode 5 V. Une évolution future consistera à rendre le
système totalement autonome, sans alim externe.
Câblages des prises MIDI
Le câblage est le suivant, attention au sens de la vue (de devant ou de
derrière)
La broche 2 n'est reliée à la masse qu'au niveau des
sorties et non au niveau des entrées, pour éviter toute
boucle de masse entre équipements.
Circuit imprimé
Non réalisé, vue 3D uniquement là pour donner un aperçu des composants
utilisés.
Logiciel du PIC
Fichier compilé (hex) disponible dans l'archive suivante :
MIDI Merger 003 - PIC 18F46K22 - 09/10/2016
Si
vous souhaitez recevoir par la poste un PIC préprogrammé
et prêt à utiliser, merci de consulter la page
PIC - Sources.
Historique
09/10/2016
- Première mise à disposition.