Electronique > Réalisations > InterfacesInterfaces MIDI > Contrôleur MIDI 003 - Pro 

Dernière mise à jour : 02/11/2025

Présentation

Ce contrôleur MIDI dispose de 128 entrées de commandes prenant la forme d'un clavier matricé de 8 colonnes / 16 rangées, chaque touche permet de déclancher un évenement MIDI de type Note On (appui sur une touche) ou Note Off (relâchement touche).

controleur_midi_003a_pcb_3d_front  controleur_midi_003ab_pcb_3d_front

La norme MIDI définissant 128 notes possibles, on exploite ici le maximum de ce qui peut être fait. La première touche (#001) déclanche la note la plus grave de la gamme MIDI (Do-2) et la dernière touche (#128) déclanche la note la plus aigue (Sol8). Le circuit est basé sur un PIC 16F628A ou 16F1827 associé à un circuit intégré TTL décodeur / démultiplexeur "4 vers 16" de type 74154 (74HC154 ou 74LS154) ou à deux circuits intégrés TTL décodeur / démultiplexeur "3 vers 8" de type 74138 (74HC138 ou 74LS138).
- Schéma 003 : version avec PIC 16F628A et 1x74154 (74HC154 ou 74LS154)
- Schéma 003a : version avec PIC 16F1827 et 1x74154 (74HC154 ou 74LS154)
- Schéma 003b : version avec PIC 16F628A et 2x74138 (74HC138 ou 74LS138).

La version 003a avec PIC 16F1827 est une actualisation de la version 003 avec PIC 16F628A et offre les mêmes fonctionnalités.


Avertissements


Schéma 003 - avec PIC 16F628A et 1xSN74154

La partie électronique est relativement allégée et simple, comme en atteste le schéma suivant. Si on retire tous les fils de liaison, il ne reste en effet que bien peu de composants.

controleur_midi_003
Section principale

La partie la plus touffue réside finalement dans le câblage des 128 boutons poussoirs, car même s'ils sont matricés (multiplexés) pour réduire le nombre de liaisons entre le microcontrôleur et le clavier, ça fait tout de même un bon paquet de fils à souder.

controleur_midi_003_clavier
Section clavier

Principe général
Il repose sur l'emploi d'un clavier matricé en 8 colonnes de 16 rangées, ce qui au total conduit bien au nombre de 128 touches. L'état de chaque touche est analysé à tour de rôle, il n'est pas possible avec un PIC 16F628A d'analyser la totalité des touches en une fois (d'ailleurs peu de PIC le permettraient). A chaque fois qu'une touche est pressée ou relâchée, le PIC produit un événement de type Note On ou Note Off dont la valeur (hauteur de note, pitch) dépend justement de la touche concernée.

Coeur du montage
Vous l'avez deviné, c'est le PIC 16F628A qui mène la danse. Cadencé par un quartz de 8 MHz (horloge interne de 2 MHz), il envoie ce qu'il faut au clavier et analyse ce qui lui revient. Les données envoyées correspondent aux états logiques que l'on trouve sur les fils de rangée du clavier (Row1 à Row16), alors que les données qui viennent en retour correspondent aux colonnes (Col1 à Col8). Il aurait été aussi possible de faire dans le sens contraire au prix de quelques petites variations matérielles. Si on s'en tient strictement au nombre de rangées et de colonnes, on s'apperçoit qu'il nous faut 16 + 8 soit 24 lignes d'entrée/sortie au niveau du PIC. Or le microcontrôleur choisi ici ne possède pas assez de broches pour faire l'affaire à lui seul. C'est pourquoi le second circuit intégré U2 a été ajouté. Il s'agit d'un décodeur démultiplexeur 4 vers 16 (4 entrées codées en binaire et 16 sorties en décimal) qui moyennant 4 fils de commande permet de piloter 16 sorties. Voilà pourquoi les 16 sorties de ce circuit U2 sont reliées sur les branches de rangées du clavier 128 touches et que 4 fils seulement aboutissent au PIC pour la gestion des rangées. L'état logique des rangées est conditionné par l'état des sorties du circuit U2, dont une seule sortie peut être à l'état bas à un instant donné. La sortie active dépend de l'état des entrées A, B, C et D (points marqués R0 à R3 sur le schéma) : si toutes les entrées A à D de U2/74154 sont à l'état bas, c'est la sortie #0 (broche 1 du 74154, Row1) qui est active et donc à l'état bas. Si toutes les entrées A à D de U2/74154 sont à l'état haut, c'est la sortie #15 (broche 17 du 74154, Row16) qui est active et donc à l'état bas. Pour ce qui est des colonnes, l'accès au PIC est direct et se fait sur quelques lignes du PORTA et quelques lignes du PORTB. Le temps mis pour sélectionner une rangée active et pour lire les huit colonnes est voisin de 46 us. Il faut donc environ 736 us (46 us * 16 rangées) pour faire le tour complet des 128 touches du clavier.

Traitement de la polyphonie
Lors de l'analyse d'une rangée, l'état de ses huit boutons poussoir est analysé de façon séquentielle (un bouton à la fois). Si deux boutons poussoir ont été enfoncés "simultanément mais pas tout à fait en même temps", deux cas peuvent se produire :
- soit le changement d'état est constaté pour les deux boutons lors de l'analyse de la rangée;
- soit le changement d'état est constaté pour un seul bouton car l'autre a été enfoncé quelques microsecondes ou millisecondes plus tard. Dans ce cas, le changement d'état du second bouton sera constaté lors d'une analyse suivante de la même rangée, c'est à dire très peu de temps après.
Dans la pratique, le temps de réaction est quasi-immédiat et même si deux changements d'état de touches ne sont pas détectées exactement en même temps, le "rendu" côté notes jouées sera celui de deux notes jouées en même temps. Souvenez-vous que de toute façon les données MIDI sont toujours transmises de façon séquentielle...

Clavier 128 notes
Comme vu précédement, le clavier est de type matricé / multiplexé pour limiter le nombre de fils de liaison entre lui-même et le circuit électronique de commande. Les lignes Col1 à Col8 sont placées à l'état logique haut au repos grâce aux résistances de rappel R1 à R8 de 10 kO, c'est à dire quand aucune touche du clavier n'est enfoncée. Quand une touche est enfoncée, deux cas peuvent se produire :
- soit la rangée sur laquelle cette touche se trouve est à l'état logique haut (rangée inactive) et dans ce cas on transmet un état logique haut et de fait rien ne change côté réception (colonne);
- soit la rangée sur laquelle cette touche se trouve est à l'état logique bas (rangée active) et dans ce cas on transmet un état logique bas et de fait on détecte une activité côté colonne.
Comme vu auparavant, l'état logique des rangées est conditionné par l'état des sorties du circuit U2, dont une seule sortie peut être à l'état bas à un instant donné. Toutes les diodes reliées sur les touches du clavier sont de type 1N4148, les plus classiques et les moins coûteuses je pense qu'on puisse trouver à ce jour. Elles assurent un rôle de protection envers les deux circuits intégrés en cas d'appui simultané sur plusieurs touches (ce qui arrive tout de même assez fréquement avec un jeu polyphonique).

Remarque : le logiciel du PIC scrute toujours les 128 touches, même si vous en utilisez moins. Une optimisation logicielle serait bien entendu possible pour raccourcir le temps de scrutation dans le cas d'une utilisation avec un clavier 49 ou 88 touches, mais ce n'était pas l'objectif initial de cette réalisation. 


Sortie MIDI
Les messages MIDI Note On ou Note Off issus du PIC aboutissent sur une prise DIN 5 points dont seuls 3 broches sont raccordées : données, +5 V (via résistance) et masse. Rien de spécial à ajouter, vous m'en voyez bien désolé.

   

Schéma 003a - avec PIC 16F1827 et 1xSN74154

Même système, après remplacement du microcontrôleur PIC 16F628A par un PIC 16F1827 plus récent et moins coûteux.

controleur_midi_003a
 
Le câblage entre le coeur du système et la matrice de diodes/interrupteurs reste identique à celui précédement décrit.

Remarque : les ressources du PIC 16F1827 étant (un peu) supérieures à celles du PIC 16F628A, j'ai tenté d'optimiser la fonction d'analyse du clavier en vue de rendre plus actif le système lors du plaquage d'accords. Avec les modifications apportées, le temps d'anti-rebonds (debounce) a pu être réduit sans perdre en efficacité en cas de jeu de notes simultanées avec des notes non incluses dans un même groupe (même rangée). Auparavant, la première note détectée engendrait systématiquement un temps d'anti-rebond pendant lequel la lecture et l'analyse des touches suivantes était momentanément suspendues.

La copie d'écran qui suit montre que le système réagit correctement dans le cas de notes jouées simultanément.

controleur_midi_003a_graph_001a   

  

Schéma 003b - avec PIC 16F628A et remplacement du 1xSN74154 par 2xSN74138

Pour une raison ou pour une autre (coût, approvisionnement, convictions personnelles), vous pourriez avoir envie de remplacer le SN74154 par deux SN74138 qui sont des décodeurs démultiplexeur 3 vers 8 (3 entrées codées en binaire et 8 sorties en décimal). Il suffit en effet de coupler les deux SN74138 pour obtenir la fonction décodage démultiplexage 4 vers 16, un décodeur 74138 travaillant pendant que l'autre se repose. Le schéma suivant montre comment procéder.
 
controleur_midi_003b
 
A un instant donné, un seul SN74138 est actif, c'est celui dont l'entrée E1 (broche 6, appelée aussi G1 dans certains documents constructeur) est à l'état haut. Comme ici on veut que ce soit celui du haut sur le schéma (U2A) quand la commande R3 est à l'état bas, il convient d'inverser l'état logique de commande qui arrive sur cette fameuse broche E1. Cette fonction est assurée par le transistor Q1 monté en commutateur inverseur. En résumé, voici ce qui se passe :
- quand la commande R3 (broche RB7 du PIC) est à l'état bas, le transistor Q1 est bloqué et on trouve sur son collecteur une tension de +5 V grâce à la présence de la résistance de charge collecteur R11. La broche E1 de U2A est donc à l'état logique haut et le circuit est activé. La sortie active de ce circuit dépend de l'état des commandes R0 à R2 (broches RB4 à RB6 du PIC). Pendant ce temps, la broche E1 du second circuit SN74138 (U2B) étant à l'état bas, toutes ses sorties sont à l'état haut, quelque soit l'état des commandes R0 à R2.
- quand la commande R3 (broche RB7 du PIC) est à l'état haut, le transistor Q1 est saturé et on trouve sur son collecteur une tension proche de 0 V. La broche E1 de U2A est dont à l'état logique bas et le circuit est désactivé. C'est au tour du circuit U2A de voir toutes ses sorties passer à l'état logique haut, sans exception. Pendant ce temps, la broche E1 du second circuit SN74138 (U2B) étant à l'état haut, la sortie active de ce circuit dépend de l'état des commandes R0 à R2 (broches RB4 à RB6 du PIC).
Au final, on a donc bien toujours une seule sortie active (à l'état bas pour rappel) parmi les lignes Row1 à Row16, quelque soit l'état logique des commandes R0 à R3 (broches RB4 à RB7 du PIC).

   

Logiciel du PIC

Les seize fichiers binaires compilés (un fichier *.hex par canal MIDI) disponibles dans l'archive dont le lien suit conviennent pour les deux schémas 003 et 003b. La version "de base" pour PIC16F1827 incluse dans l'archive travaille de la même façon que celle pour PIC16F628A (la version plus évoluée actuellement en cours de tests n'est pas incluse dans l'archive).
Contrôleur MIDI 003x - PIC 16F628A ou 16F1827 - Versions du 24/10/2025
Pour ce projet à l'origine développé dans un cadre semi-professionnel, le code source n'est pas disponible.
Voir page Logiciel PIC - Sources pour plus de détails.

  

Prototype

En cours de réalisation dans une version équipée pour 32 notes, pour vérification globale avec PIC16F628A et PIC16F1827.

controleur_midi_003ab_pcb_components_top

Bien que ce circuit soit équipé pour un jeu avec 32 touches simultanées (avec diodes D33 à D64), il est tout à fait capable de gérer les 128 notes, mais de façon non simultanée pour les entrées non équipées des diodes "anti-retour". C'est la raison d'être des deux connecteurs multipoints J2 (rangées 1 à16) et J3 (colonnes 1 à 8).

   

Circuit imprimé (PCB)

Non réalisé, vues 2D/3D uniquement là pour aperçu des composants utilisés (versions 003 et 003a).

controleur_midi_003a_pcb_components_top

Bien entendu, il est possible de n'utiliser qu'une partie des 128 touches, par exemple pour travailler sur un clavier à 49 ou 88 touches. Dans ce cas, les diodes associées aux touches non utilisées peuvent être omises.

   

Historique

02/11/2025
- Mise à jour du logiciel pour remplacement PIC 16F628A par un PIC 16F1827 (plus récent et moins coûteux).
- Création d'un prototype équipé pour 32 notes et destiné aux tests généraux avec PIC16F628A ou PIC16F1827.

20/05/2012
- Ajout d'un fichier compilé (*.hex) pour chaque canal MIDI 1 à 16 (seize fichiers compilés en tout).
- Augmentation du temps d'anti-rebond, le précédent de 2 ms était suffisant pour des touches de très bonne qualité mais insuffisant pour des touches standard. Je l'ai donc passé à 5 ms, ce qui suffit pour des poussoirs classiques et ne réduit pas trop la réactivité de l'ensemble, même en plaquant des accords.

21/08/2011
- Première mise à disposition, avec un fichier compilé (*.hex) uniquement pour canal MIDI 1.