Intégration MIDI pour Orgues Numériques : Composants et Guide de Configuration
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino Mega 2560 | 1 | 54 E/S numériques, 16 analogiques - idéal pour matrices clavier |
| Prise DIN MIDI 5 broches | 1 | Sortie MIDI standard |
| Résistance 220 Ω | 1 | Pour sortie MIDI (broche 5 de la DIN) |
| Câble USB-A vers B | 1 | Programmation et alimentation Arduino |
| Câble AWM (multibrins) | 1 | Câblage clavier vers Arduino (longueur selon installation) |
| Connecteur mâle 40 broches 1 rangée (pas 2,54 mm) | 1 | Interface câble/Arduino (ou bornier à vis) |
| Potentiomètre linéaire 10K (curseur) | 1 | Pour pédale d'expression |
| Connecteur IDC (optionnel) | 1 | Alternative au soudage direct sur headers |
| Fils mâle/mâle (optionnel) | 1 jeu | Si utilisation connecteurs IDC |
Outils nécessaires
- Fer à souder
- Fil à souder sans plomb
- Flux à souder
- Dénudeur / pince à bec effilé
- Pince coupante latérale
- Pince à bec plat
Applications et services en ligne
- Arduino IDE
À propos de ce projet
Ce projet montre comment convertir une console d'orgue ancien pour qu'elle puisse envoyer des messages MIDI matériels depuis les claviers (manuels) et le pédalier en utilisant un unique Arduino Mega.
Le projet a débuté comme une tentative d'envoi de messages MIDI tout en conservant la génération sonore d'origine, mais les circuits originaux se sont révélés difficiles à rétro-ingénier. Après du temps passé sur le code, j'ai développé des versions pour les deux types de claviers : matricés (matrice lignes/colonnes avec diodes) et bussés (bus commun + fils individuels par touche).
⚠ Avertissements importants
- Modification irréversible : Ce projet modifie l'orgue de sorte que le commutateur de clavier d'origine ne fonctionne plus.
- Danger électrique : À l'intérieur d'un vieil orgue, des composants peuvent être dangereux. Travaillez toujours avec l'orgue débranché, et assurez-vous d'avoir l'expérience et les compétences pour travailler en sécurité. En cas de doute, consultez un technicien électronique qualifié local.
- Composants vieillissants : Les composants internes des vieux orgues sont souvent au bord de la défaillance ; toute modification peut endommager l'orgue. Suivre ces instructions se fait à vos propres risques ; l'auteur décline toute responsabilité pour tout dommage à l'orgue, équipement ou personnes.
Étape 1 : Examiner l'orgue
- Le code initial supposait un clavier matricé avec interrupteurs discrets et diodes déjà en place. J'ai depuis développé du code pour claviers bussés. Suivez les instructions et utilisez le code correspondant à votre type (Matricé vs Bussé). Pour les deux designs, des diodes sont nécessaires sur chaque interrupteur. Elles s'achètent à bas coût. Le code diffère selon le type.
- L'orgue modifié ici a des interrupteurs normalement ouverts (NO) pour les claviers, et normalement fermés (NF) pour le pédalier. Utilisez un multimètre pour vérifier le type de vos interrupteurs. Si différent, adaptez le code (exemples fournis dans le code).
- Déterminez comment ouvrir l'orgue pour accéder aux contacts des claviers et du pédalier, et trouvez un emplacement pour fixer l'Arduino à l'intérieur. Vous devrez peut-être percer des trous ou installer des connecteurs pour l'alimentation de l'Arduino et le montage de la prise MIDI. Dans cet exemple, une prise secteur 3 broches a été câblée vers un petit boîtier d'alimentation interne, et un trou percé pour la prise DIN MIDI.
- L'orgue exemple possède deux claviers 61 touches en matrice 6×11, et un pédalier 6×7. Si vous choisissez la voie matricielle et que votre orgue a une matrice 8×8, il faudra adapter le code/câblage ou recâbler pour du 6×11.
Étape 2 : Fixer l'Arduino
Mon Arduino Mega était fourni avec une petite plaque plastique pour le monter sur le bois de l'orgue. Je l'ai fixé avec de petites vis à bois #4 et vis machine #4 pour l'Arduino sur la plaque. Placez l'Arduino d'abord pour estimer les longueurs de câbles. Prévoyez aussi l'alimentation (USB ou 5V externe).
Étape 3 : Préparer les câbles
Clavier matricé :
Chaque clavier a 61 interrupteurs. Dans l'exemple, 6 rangées (lignes) : un fil relie la première borne de chaque interrupteur à celle de l'interrupteur 6 positions plus loin. La seconde borne va à une diode, puis aux colonnes (11 colonnes pour les manuels, 7 pour le pédalier). Pour chaque manuel et pédalier, coupez deux longueurs de câble AWM atteignant de chaque division à l'Arduino, en suivant un chemin ordonné et en prévoyant de la marge. Pour les colonnes, préférez que le câble parcoure la longueur du clavier avant d'aller à l'Arduino. Mesurez, coupez, séparez les brins aux extrémités, dénudrez.
Clavier bussé :
Le clavier peut être divisé en 6 câbles AWM (10 fils chacun = 60 contacts) + 1 fil ordinaire pour le 61ème contact. Séparez les brins aux extrémités, dénudrez.
Étape 4 : Souder les extrémités des câbles sur connecteurs mâles
Matricé et Bussé : Soudez les fils aux broches du connecteur mâle, ou utilisez un bornier à vis.

Étape 5 : Souder l'autre extrémité aux interrupteurs
Clavier matricé :
Si l'orgue a déjà ses contacts câblés, il faut dessouder ou couper les fils d'origine. Pour une matrice 6×11, conservez les fils de rangée (chaque interrupteur au suivant 6 positions plus loin). Retirez les fils de rangée du premier groupe de 6 vers l'ancien ordinateur, soudez vos 6 fils de rangée à leur place. Pour les colonnes : si diodes déjà en place, coupez/dessoudez le fil de l'autre côté des diodes vers l'ancien ordinateur, soudez votre fil de colonne à la place. Organisez les câbles avec des colliers le long du cheminement existant. Pour le pédalier, le panneau avant contenant les contacts à lames a dû être déposé (vis) et les câbles passés par le trou central.
Clavier bussé :
Soudez une diode sur le côté non-bussé de chaque interrupteur (pôle négatif vers l'interrupteur), puis soudez à l'un des 10 fils du câble. Répétez pour les 6 câbles, puis pour le 61ème fil.
Étape 6 : Souder la résistance sur la prise MIDI et connecter à l'Arduino

La résistance 220 Ω se soude sur la broche 5 de la prise DIN MIDI (sortie TX). Les autres connexions : broche 4 (VCC) → 5V Arduino, broche 2 (GND) → GND Arduino. La broche 1 et 3 ne sont pas utilisées (standard MIDI OUT uniquement).
Étape 7 : Connecter les connecteurs à l'Arduino
Branchez tous les connecteurs sur l'Arduino selon le schéma.
Alternative : Achetez des connecteurs IDC 10 broches, connectez-les aux bouts des câbles AWM, puis utilisez des fils mâle/mâle vers l'Arduino. Moins permanent que le soudage, mais conseillé si vous prévoyez de modifier le code et potentiellement recâbler.
Étape 8 : Téléverser le logiciel sur l'Arduino
- Connectez l'Arduino en USB à l'ordinateur, assurez-vous que l'IDE Arduino est installé.
- Sélectionnez la version du code adaptée (Matricé vs Bussé).
- Ouvrez l'IDE, copiez-collez le code dans un nouveau sketch.
- Vérifiez la connexion série USB, cliquez sur "Téléverser" (Upload).
Étape 9 : Tester
- Connectez votre interface MIDI à l'ordinateur, et la sortie MIDI de l'orgue à l'interface.
- Avec un logiciel de monitoring MIDI (ex: MIDI-OX, Hairless MIDI, ou DAW), vérifiez que chaque touche et pédale envoie le bon message MIDI Note On/Off à l'appui et au relâchement.
- Pour utilisation autonome : alimentez l'Arduino via une petite alim 5V sur le port d'alimentation, ou un adaptateur USB secteur au bout du câble USB.
Notes importantes
- Le code pour claviers bussés n'a pas encore été testé, mais devrait fonctionner. Signalez tout problème dans les commentaires.
- Pour le design bussé, les diodes sont indispensables. Pôle négatif de la diode vers l'interrupteur. Pour le design matricé, pôle négatif loin de l'interrupteur (vers la colonne).
- J'ai aussi mis à jour le design original pour inclure des potentiomètres (pédales d'expression).
- Pour le design bussé sur la broche 13, il faut désactiver la LED intégrée de l'Arduino : soit la dessouder (deux fers), soit l'écraser délicatement avec une pince fine.
- Le design bussé fonctionne pour beaucoup d'orgues à bus, mais peut être peu fiable si le bus est en "bronze phosphorique". Câbler tous les bus d'un manuel ensemble et tous les contacts d'une même touche ensemble aide, mais pour bus en bronze phosphorique, le keying 12V est recommandé (non supporté par ce projet).
Matériel pour pédale d'expression (potentiomètre)

Je détaillerai plus tard, mais voici brièvement le design : La connexion à la pédale d'expression utilise une équerre "L" peu coûteuse (quincaillerie). Elle se connecte à un support existant, ou une seconde équerre fixée directement sur la pédale. Articulation sur une vis machine légèrement desserrée avec contre-écrou et deux rondelles. Tige métallique : œil boulon (eye bolt) collé au JB Weld à une extrémité, vis machine à l'autre pour l'équerre "L".
Support du potentiomètre : feuilles acrylique transparente, découpées au cutter, cassées à l'étau. Pièce acrylique plus petite pour surélever le potentiomètre, surfaces poncées, collées au JB Weld, serrées au petit étau 24h. Trous percés à la perceuse.
Base de la grande pièce acrylique fixée sur petite charnière meuble (vis machine #4), autre bout de la charnière sur le plancher de l'orgue (vis à bois #4 courtes). Équerre acrylique pour décaler la charnière du sol (selon design).
Bloc blanc = bloc PTFE (Téflon) fournisseur pièces robot. Découpé à la scie à métaux, 3 trous percés. Fixé sur l'équerre acrylique par vis machine.
Instructions détaillées pour support pédale d'expression (MàJ 9 déc. 2021)
Matériel :
- Feuille acrylique 8×10 pouces
- Bloc Téflon (PTFE)
- Tige aluminium 1/4 pouce (quincaillerie/métallerie)
- JB Weld (colle époxy bicomposant)
- Potentiomètre linéaire (curseur)
- Petite charnière meuble
- Petite équerre meuble
- Œil boulon (eye bolt) petit
- Vis à bois #4 courtes
- Quincaillerie assortie :
- Rondelle frein (préférablement téflon) ×1 + vis machine assortie pour fixation sur pédale (diamètre/longueur selon trou existant)
- Vis machine ×2, rondelles ×4, écrous ×2 pour fixer téflon sur acrylique
- Vis machine pour fixer équerre sur tige alu 1/4
- Vis machine ×2, rondelles ×4, écrous ×2 pour fixer charnière sous acrylique
Outils :
- Cutter / couteau de modélisme
- Règle métallique
- Tournevis (horloger pour petites vis)
- Clé à molette
- Pinces
- Perceuse électrique + forets
- Scie à métaux (pour PTFE)
- Étau d'établi
- Petit serre-joint bois
- Papier de verre grain fin
- Bâtonnets glace + carton récup
- Chiffon humide
Procédure :
- Examinez la pédale actuelle. Si trou libre sur support, utilisez-le ; sinon utilisez un trou existant avec une vis machine plus longue.
- Dégagez la base en bois de l'orgue de tout composant/électronique.
- Déballer l'acrylique, tracer au cutter + règle un rectangle 3″×4,5″ (recto/verso), casser à l'étau + pinces (lunettes protection !). Couper aussi 3″×0,5″ et 2,4″×0,3″.
- Scier le bloc téflon ~2 cm du bout pour créer bloc 3×1,5×2 cm.
- Percez 2 trous sur bord bas grande plaque acrylique (alignés charnière), 2 trous sur face 3×1,5 cm du téflon (hors chemin tige alu). 2 trous correspondants sur grande plaque en face du téflon (bord haut). 2 trous sur pièce 2,4×0,3″ alignés autre côté charnière.
- Poncez délicatement une face du potentiomètre, zone de collage sur grande plaque, et les deux faces de la pièce 3×0,5″. Essuyez chiffon humide.
- Mélangez JB Weld sur carton avec bâtonnet, appliquez sur grande plaque, ajoutez pièce 3×0,5″, plus JB Weld, puis potentiomètre (surface poncée). Serrez petit serre-joint, laissez durcir 24h.
- Percez trou légèrement >1/4″ (foret 1/4″ en élargissant) traversant le bloc téflon d'une face 2×3 cm à l'autre. Alignez avec course du potentiomètre.
- Coupez tige alu 1/4″ longueur approximative : bas potentiomètre → pédale enfoncée à fond.
- Une fois JB Weld durci, fixez charnière et bloc téflon sur grande plaque (vis, rondelles, écrous). Mettez œil boulon sur partie mobile potentiomètre, insérez dans tige alu traversant téflon. Si jeu, coller œil boulon à la tige au JB Weld (alors : œil boulon sur potar → dans téflon → fixer téflon sur plaque).
- Tenez œil boulon à la pince, fixez équerre meuble sur l'autre bout de tige alu (vis machine adaptée). Vérifiez orientation œil boulon / équerre avant serrage.
- Si trou libre sur support pédale : nouvelle vis machine + rondelle frein téflon, serrez jusqu'à mouvement libre équerre. Si trou occupé : retirez vieille vis, mettez vis plus longue, fixez comme avant, puis sur longueur excédentaire ajoutez équerre + rondelle frein téflon.
- Faites coulisser base charnière sur plancher intérieur orgue jusqu'à alignement parfait tige alu, et avec petite plaque acrylique en place, le mouvement pédale ≈ mouvement potentiomètre. Fixez base support au plancher (2 vis à bois #4 courtes), plaque acrylique ENTRE charnière et bois (assure course correcte charnière).
Note finale
L'Arduino Project Hub ne semble pas notifier les posts/questions ici. Pour une réponse plus rapide, postez sur ce forum Arduino qui me notifiera.
Code
Deux versions selon votre type de clavier :
Code pour clavier matricé (Matrixed Keyboard)
// Name: Arduino Mega Midi Controller v21
// Created: Feb 4, 2021
// Author: Larason2
// Acknowledgements: Bald Engineer, Amanda Ghassaei, jeffb42, GrumpyMike
byte keysA[11][6]; // Clavier A (manuel 1) - 11 colonnes x 6 lignes
byte keysB[11][6]; // Clavier B (manuel 2)
byte keysC[7][6]; // Clavier C (pédalier) - 7 colonnes x 6 lignes
byte lastA[11][6];
byte lastB[11][6];
byte lastC[7][6];
// Canaux MIDI : 144=NoteOn Ch1, 128=NoteOff Ch1, etc.
int noteOn1 = 144, noteOff1 = 128; // Clavier A - Canal 1
int noteOn2 = 145, noteOff2 = 129; // Clavier B - Canal 2
int noteOn3 = 146, noteOff3 = 130; // Clavier C - Canal 3
int velocity = 100;
// Canaux contrôleurs pour pédales d'expression
int chan6 = 181; // Control Change Canal 6
int chan7 = 182; // Control Change Canal 7
int Exp = 11; // Controller #11 (Expression)
int LastPot6 = 1, LastPot7 = 1;
void setup() {
Serial.begin(31250); // Baudrate MIDI standard
// Initialisation broches Clavier A (lignes = entrées, colonnes = sorties)
// Lignes : 2, 22, 24, 26, 28, 30
// Colonnes : 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52
pinMode(2, INPUT); pinMode(22, INPUT); pinMode(24, INPUT);
pinMode(26, INPUT); pinMode(28, INPUT); pinMode(30, INPUT);
pinMode(32, INPUT); pinMode(34, INPUT); pinMode(36, INPUT);
pinMode(38, INPUT); pinMode(40, INPUT); pinMode(42, INPUT);
pinMode(44, INPUT); pinMode(46, INPUT); pinMode(48, INPUT);
pinMode(50, INPUT); pinMode(52, INPUT);
// Clavier B
pinMode(3, INPUT); pinMode(23, INPUT); pinMode(25, INPUT);
pinMode(27, INPUT); pinMode(29, INPUT); pinMode(31, INPUT);
pinMode(33, INPUT); pinMode(35, INPUT); pinMode(37, INPUT);
pinMode(39, INPUT); pinMode(41, INPUT); pinMode(43, INPUT);
pinMode(45, INPUT); pinMode(47, INPUT); pinMode(49, INPUT);
pinMode(51, INPUT); pinMode(53, INPUT);
// Clavier C (pédalier) - broches analogiques utilisées en digitales
pinMode(A2, INPUT); pinMode(A3, INPUT); pinMode(A4, INPUT);
pinMode(A5, INPUT); pinMode(A6, INPUT); pinMode(A7, INPUT);
pinMode(A8, INPUT); pinMode(A9, INPUT); pinMode(A10, INPUT);
pinMode(A11, INPUT); pinMode(A12, INPUT); pinMode(A13, INPUT);
pinMode(A14, INPUT);
}
void loop() {
// --- LECTURE CLAVIER A (Matrice 6x11) ---
// Mise en pull-up des 6 lignes
pinMode(22, INPUT_PULLUP); pinMode(24, INPUT_PULLUP);
pinMode(26, INPUT_PULLUP); pinMode(28, INPUT_PULLUP);
pinMode(30, INPUT_PULLUP); pinMode(2, INPUT_PULLUP);
// Balayage des 11 colonnes (sortie LOW séquentielle)
pinMode(32, OUTPUT); digitalWrite(32, LOW);
keysA[0][0] = digitalRead(2); // Col 0, Ligne 0
pinMode(32, INPUT);
pinMode(34, OUTPUT); digitalWrite(34, LOW);
keysA[1][0] = digitalRead(22); keysA[1][1] = digitalRead(24);
keysA[1][2] = digitalRead(26); keysA[1][3] = digitalRead(28);
keysA[1][4] = digitalRead(30); keysA[1][5] = digitalRead(2);
pinMode(34, INPUT);
pinMode(36, OUTPUT); digitalWrite(36, LOW);
keysA[2][0] = digitalRead(22); keysA[2][1] = digitalRead(24);
keysA[2][2] = digitalRead(26); keysA[2][3] = digitalRead(28);
keysA[2][4] = digitalRead(30); keysA[2][5] = digitalRead(2);
pinMode(36, INPUT);
pinMode(38, OUTPUT); digitalWrite(38, LOW);
keysA[3][0] = digitalRead(22); keysA[3][1] = digitalRead(24);
keysA[3][2] = digitalRead(26); keysA[3][3] = digitalRead(28);
keysA[3][4] = digitalRead(30); keysA[3][5] = digitalRead(2);
pinMode(38, INPUT);
pinMode(40, OUTPUT); digitalWrite(40, LOW);
keysA[4][0] = digitalRead(22); keysA[4][1] = digitalRead(24);
keysA[4][2] = digitalRead(26); keysA[4][3] = digitalRead(28);
keysA[4][4] = digitalRead(30); keysA[4][5] = digitalRead(2);
pinMode(40, INPUT);
pinMode(42, OUTPUT); digitalWrite(42, LOW);
keysA[5][0] = digitalRead(22); keysA[5][1] = digitalRead(24);
keysA[5][2] = digitalRead(26); keysA[5][3] = digitalRead(28);
keysA[5][4] = digitalRead(30); keysA[5][5] = digitalRead(2);
pinMode(42, INPUT);
pinMode(44, OUTPUT); digitalWrite(44, LOW);
keysA[6][0] = digitalRead(22); keysA[6][1] = digitalRead(24);
keysA[6][2] = digitalRead(26); keysA[6][3] = digitalRead(28);
keysA[6][4] = digitalRead(30); keysA[6][5] = digitalRead(2);
pinMode(44, INPUT);
pinMode(46, OUTPUT); digitalWrite(46, LOW);
keysA[7][0] = digitalRead(22); keysA[7][1] = digitalRead(24);
keysA[7][2] = digitalRead(26); keysA[7][3] = digitalRead(28);
keysA[7][4] = digitalRead(30); keysA[7][5] = digitalRead(2);
pinMode(46, INPUT);
pinMode(48, OUTPUT); digitalWrite(48, LOW);
keysA[8][0] = digitalRead(22); keysA[8][1] = digitalRead(24);
keysA[8][2] = digitalRead(26); keysA[8][3] = digitalRead(28);
keysA[8][4] = digitalRead(30); keysA[8][5] = digitalRead(2);
pinMode(48, INPUT);
pinMode(50, OUTPUT); digitalWrite(50, LOW);
keysA[9][0] = digitalRead(22); keysA[9][1] = digitalRead(24);
keysA[9][2] = digitalRead(26); keysA[9][3] = digitalRead(28);
keysA[9][4] = digitalRead(30); keysA[9][5] = digitalRead(2);
pinMode(50, INPUT);
pinMode(52, OUTPUT); digitalWrite(52, LOW);
keysA[10][0] = digitalRead(22); keysA[10][1] = digitalRead(24);
keysA[10][2] = digitalRead(26); keysA[10][3] = digitalRead(28);
keysA[10][4] = digitalRead(30); keysA[10][5] = digitalRead(2);
pinMode(52, INPUT);
// Remise lignes en entrée simple
pinMode(22, INPUT); pinMode(24, INPUT); pinMode(26, INPUT);
pinMode(28, INPUT); pinMode(30, INPUT); pinMode(2, INPUT);
// --- LECTURE CLAVIER B (identique, décalage broches colonnes 33,35,37,39,41,43,45,47,49,51,53) ---
pinMode(23, INPUT_PULLUP); pinMode(25, INPUT_PULLUP);
pinMode(27, INPUT_PULLUP); pinMode(29, INPUT_PULLUP);
pinMode(31, INPUT_PULLUP); pinMode(3, INPUT_PULLUP);
pinMode(33, OUTPUT); digitalWrite(33, LOW);
keysB[0][0] = digitalRead(3);
pinMode(33, INPUT);
pinMode(35, OUTPUT); digitalWrite(35, LOW);
keysB[1][0] = digitalRead(23); keysB[1][1] = digitalRead(25);
keysB[1][2] = digitalRead(27); keysB[1][3] = digitalRead(29);
keysB[1][4] = digitalRead(31); keysB[1][5] = digitalRead(3);
pinMode(35, INPUT);
pinMode(37, OUTPUT); digitalWrite(37, LOW);
keysB[2][0] = digitalRead(23); keysB[2][1] = digitalRead(25);
keysB[2][2] = digitalRead(27); keysB[2][3] = digitalRead(29);
keysB[2][4] = digitalRead(31); keysB[2][5] = digitalRead(3);
pinMode(37, INPUT);
pinMode(39, OUTPUT); digitalWrite(39, LOW);
keysB[3][0] = digitalRead(23); keysB[3][1] = digitalRead(25);
keysB[3][2] = digitalRead(27); keysB[3][3] = digitalRead(29);
keysB[3][4] = digitalRead(31); keysB[3][5] = digitalRead(3);
pinMode(39, INPUT);
pinMode(41, OUTPUT); digitalWrite(41, LOW);
keysB[4][0] = digitalRead(23); keysB[4][1] = digitalRead(25);
keysB[4][2] = digitalRead(27); keysB[4][3] = digitalRead(29);
keysB[4][4] = digitalRead(31); keysB[4][5] = digitalRead(3);
pinMode(41, INPUT);
pinMode(43, OUTPUT); digitalWrite(43, LOW);
keysB[5][0] = digitalRead(23); keysB[5][1] = digitalRead(25);
keysB[5][2] = digitalRead(27); keysB[5][3] = digitalRead(29);
keysB[5][4] = digitalRead(31); keysB[5][5] = digitalRead(3);
pinMode(43, INPUT);
pinMode(45, OUTPUT); digitalWrite(45, LOW);
keysB[6][0] = digitalRead(23); keysB[6][1] = digitalRead(25);
keysB[6][2] = digitalRead(27); keysB[6][3] = digitalRead(29);
keysB[6][4] = digitalRead(31); keysB[6][5] = digitalRead(3);
pinMode(45, INPUT);
pinMode(47, OUTPUT); digitalWrite(47, LOW);
keysB[7][0] = digitalRead(23); keysB[7][1] = digitalRead(25);
keysB[7][2] = digitalRead(27); keysB[7][3] = digitalRead(29);
keysB[7][4] = digitalRead(31); keysB[7][5] = digitalRead(3);
pinMode(47, INPUT);
pinMode(49, OUTPUT); digitalWrite(49, LOW);
keysB[8][0] = digitalRead(23); keysB[8][1] = digitalRead(25);
keysB[8][2] = digitalRead(27); keysB[8][3] = digitalRead(29);
keysB[8][4] = digitalRead(31); keysB[8][5] = digitalRead(3);
pinMode(49, INPUT);
pinMode(51, OUTPUT); digitalWrite(51, LOW);
keysB[9][0] = digitalRead(23); keysB[9][1] = digitalRead(25);
keysB[9][2] = digitalRead(27); keysB[9][3] = digitalRead(29);
keysB[9][4] = digitalRead(31); keysB[9][5] = digitalRead(3);
pinMode(51, INPUT);
pinMode(53, OUTPUT); digitalWrite(53, LOW);
keysB[10][0] = digitalRead(23); keysB[10][1] = digitalRead(25);
keysB[10][2] = digitalRead(27); keysB[10][3] = digitalRead(29);
keysB[10][4] = digitalRead(31); keysB[10][5] = digitalRead(3);
pinMode(53, INPUT);
pinMode(23, INPUT); pinMode(25, INPUT); pinMode(27, INPUT);
pinMode(29, INPUT); pinMode(31, INPUT); pinMode(3, INPUT);
// --- LECTURE CLAVIER C (Pédalier, matrice 6x7, interrupteurs NF = inversion logique) ---
pinMode(A3, INPUT_PULLUP); pinMode(A4, INPUT_PULLUP);
pinMode(A5, INPUT_PULLUP); pinMode(A6, INPUT_PULLUP);
pinMode(A7, INPUT_PULLUP); pinMode(A2, INPUT_PULLUP);
pinMode(A8, OUTPUT); digitalWrite(A8, LOW);
keysC[0][0] = digitalRead(A2);
pinMode(A8, INPUT);
pinMode(A9, OUTPUT); digitalWrite(A9, LOW);
keysC[1][0] = digitalRead(A3); keysC[1][1] = digitalRead(A4);
keysC[1][2] = digitalRead(A5); keysC[1][3] = digitalRead(A6);
keysC[1][4] = digitalRead(A7); keysC[1][5] = digitalRead(A2);
pinMode(A9, INPUT);
pinMode(A10, OUTPUT); digitalWrite(A10, LOW);
keysC[2][0] = digitalRead(A3); keysC[2][1] = digitalRead(A4);
keysC[2][2] = digitalRead(A5); keysC[2][3] = digitalRead(A6);
keysC[2][4] = digitalRead(A7); keysC[2][5] = digitalRead(A2);
pinMode(A10, INPUT);
pinMode(A11, OUTPUT); digitalWrite(A11, LOW);
keysC[3][0] = digitalRead(A3); keysC[3][1] = digitalRead(A4);
keysC[3][2] = digitalRead(A5); keysC[3][3] = digitalRead(A6);
keysC[3][4] = digitalRead(A7); keysC[3][5] = digitalRead(A2);
pinMode(A11, INPUT);
pinMode(A12, OUTPUT); digitalWrite(A12, LOW);
keysC[4][0] = digitalRead(A3); keysC[4][1] = digitalRead(A4);
keysC[4][2] = digitalRead(A5); keysC[4][3] = digitalRead(A6);
keysC[4][4] = digitalRead(A7); keysC[4][5] = digitalRead(A2);
pinMode(A12, INPUT);
pinMode(A13, OUTPUT); digitalWrite(A13, LOW);
keysC[5][0] = digitalRead(A3); keysC[5][1] = digitalRead(A4);
keysC[5][2] = digitalRead(A5); keysC[5][3] = digitalRead(A6);
keysC[5][4] = digitalRead(A7); keysC[5][5] = digitalRead(A2);
pinMode(A13, INPUT);
pinMode(A14, OUTPUT); digitalWrite(A14, LOW);
keysC[6][0] = digitalRead(A3);
pinMode(A14, INPUT);
pinMode(A3, INPUT); pinMode(A4, INPUT); pinMode(A5, INPUT);
pinMode(A6, INPUT); pinMode(A7, INPUT); pinMode(A2, INPUT);
// Inversion logique pour interrupteurs NF (Normalement Fermés)
// 0 (appuyé) devient 1, 1 (relâché) devient 0
for (int col = 0; col < 7; col++) {
for (int row = 0; row < 6; row++) {
if (col == 0 && row > 0) continue; // Col 0 n'a que ligne 0
if (col == 6 && row > 0) continue; // Col 6 n'a que ligne 0
if (keysC[col][row] == 0) keysC[col][row] = 1;
else keysC[col][row] = 0;
}
}
// Cas colonnes 0 et 6 (1 seule touche)
if (keysC[0][0] == 0) keysC[0][0] = 1; else keysC[0][0] = 0;
if (keysC[6][0] == 0) keysC[6][0] = 1; else keysC[6][0] = 0;
// --- ENVOI MIDI CLAVIER A (Notes 36-96) ---
// Boucle optimisée pour 61 touches (36 à 96)
for (int col = 0; col < 11; col++) {
for (int row = 0; row < 6; row++) {
int note = 36 + col * 6 + row;
if (note > 96) continue;
if (keysA[col][row] == 0 && lastA[col][row] == 0) {
MidiSend(noteOn1, note, velocity); lastA[col][row] = 7;
}
if (keysA[col][row] == 1 && lastA[col][row] == 7) {
MidiSend(noteOff1, note, velocity); lastA[col][row] = 0;
}
}
}
// --- ENVOI MIDI CLAVIER B (Notes 36-96, Canal 2) ---
for (int col = 0; col < 11; col++) {
for (int row = 0; row < 6; row++) {
int note = 36 + col * 6 + row;
if (note > 96) continue;
if (keysB[col][row] == 0 && lastB[col][row] == 0) {
MidiSend(noteOn2, note, velocity); lastB[col][row] = 7;
}
if (keysB[col][row] == 1 && lastB[col][row] == 7) {
MidiSend(noteOff2, note, velocity); lastB[col][row] = 0;
}
}
}
// --- ENVOI MIDI CLAVIER C / Pédalier (Notes 36-67, Canal 3, logique inversée) ---
for (int col = 0; col < 7; col++) {
for (int row = 0; row < 6; row++) {
int note = 36 + col * 6 + row;
if (note > 67) continue; // Pédalier généralement 32 notes (36-67)
// Logique inversée : keysC==0 = appuyé (NoteOn), keysC==1 = relâché (NoteOff)
if (keysC[col][row] == 0 && lastC[col][row] == 0) {
MidiSend(noteOn3, note, velocity); lastC[col][row] = 7;
}
if (keysC[col][row] == 1 && lastC[col][row] == 7) {
MidiSend(noteOff3, note, velocity); lastC[col][row] = 0;
}
}
}
// --- PÉDALES D'EXPRESSION (Entrées analogiques A0, A1) ---
// Pédale 1 → Canal 6 (CC#11)
int Cur6 = analogRead(0);
int Map6 = map(Cur6, 0, 1023, 0, 127);
if (abs(Cur6 - LastPot6) >= 8) {
MidiSend(chan6, Exp, Map6);
LastPot6 = Cur6;
}
// Pédale 2 → Canal 7 (CC#11)
int Cur7 = analogRead(1);
int Map7 = map(Cur7, 0, 1023, 0, 127);
if (abs(Cur7 - LastPot7) >= 8) {
MidiSend(chan7, Exp, Map7);
LastPot7 = Cur7;
}
}
void MidiSend(int status, int data1, int data2) {
Serial.write(status);
Serial.write(data1);
Serial.write(data2);
}
Code pour clavier bussé (Bussed Keyboard)
// Name: Arduino Mega Midi Controller 61x4 + 3 potentiometers
// Version 1.0 - Created: April 12, 2021 - Author: Larason2
// Acknowledgements: Bald Engineer, Amanda Ghassaei, jeffb42, GrumpyMike
// 4 claviers bussés x 61 touches = 244 touches max
byte keysA[11][6], keysB[11][6], keysC[11][6], keysD[11][6];
byte lastA[11][6], lastB[11][6], lastC[11][6], lastD[11][6];
// MIDI Messages
int noteOn1=144, noteOff1=128; // Clavier A - Ch1
int noteOn2=145, noteOff2=129; // Clavier B - Ch2
int noteOn3=146, noteOff3=130; // Clavier C - Ch3
int noteOn4=147, noteOff4=131; // Clavier D - Ch4
int velocity = 100;
// Expression pedals (Control Change)
int chan6=181, chan7=182, chan8=183; // Canaux 6,7,8
int Exp = 11; // Controller #11 Expression
int LastPot6=1, LastPot7=1, LastPot8=1;
void setup() {
Serial.begin(31250);
// Initialisation 61 entrées (broches 2-53, A0-A8) + 4 colonnes (A9-A12) + 3 pots (A13-A15)
for (int i = 2; i <= 53; i++) pinMode(i, INPUT);
pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT);
pinMode(A3, INPUT); pinMode(A4, INPUT); pinMode(A5, INPUT);
pinMode(A6, INPUT); pinMode(A7, INPUT); pinMode(A8, INPUT);
pinMode(A9, INPUT); pinMode(A10, INPUT); pinMode(A11, INPUT);
pinMode(A12, INPUT); pinMode(A13, INPUT); pinMode(A14, INPUT);
pinMode(A15, INPUT);
}
void loop() {
// Mise en INPUT_PULLUP des 61 entrées
for (int i = 2; i <= 53; i++) pinMode(i, INPUT_PULLUP);
pinMode(A0, INPUT_PULLUP); pinMode(A1, INPUT_PULLUP);
pinMode(A2, INPUT_PULLUP); pinMode(A3, INPUT_PULLUP);
pinMode(A4, INPUT_PULLUP); pinMode(A5, INPUT_PULLUP);
pinMode(A6, INPUT_PULLUP); pinMode(A7, INPUT_PULLUP);
pinMode(A8, INPUT_PULLUP);
// --- LECTURE 4 CLAVIERS (même bus, colonnes séquentielles A9-A12) ---
// Clavier A - Colonne A9
pinMode(A9, OUTPUT); digitalWrite(A9, LOW);
readBusKeys(keysA);
pinMode(A9, INPUT);
// Clavier B - Colonne A10
pinMode(A10, OUTPUT); digitalWrite(A10, LOW);
readBusKeys(keysB);
pinMode(A10, INPUT);
// Clavier C - Colonne A11
pinMode(A11, OUTPUT); digitalWrite(A11, LOW);
readBusKeys(keysC);
pinMode(A11, INPUT);
// Clavier D - Colonne A12
pinMode(A12, OUTPUT); digitalWrite(A12, LOW);
readBusKeys(keysD);
pinMode(A12, INPUT);
// Remise entrées standard
for (int i = 2; i <= 53; i++) pinMode(i, INPUT);
pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT);
pinMode(A3, INPUT); pinMode(A4, INPUT); pinMode(A5, INPUT);
pinMode(A6, INPUT); pinMode(A7, INPUT); pinMode(A8, INPUT);
pinMode(A9, INPUT); pinMode(A10, INPUT); pinMode(A11, INPUT);
pinMode(A12, INPUT); pinMode(A13, INPUT); pinMode(A14, INPUT);
pinMode(A15, INPUT);
// --- ENVOI MIDI 4 CLAVIERS ---
sendKeyboardMidi(keysA, lastA, noteOn1, noteOff1);
sendKeyboardMidi(keysB, lastB, noteOn2, noteOff2);
sendKeyboardMidi(keysC, lastC, noteOn3, noteOff3);
sendKeyboardMidi(keysD, lastD, noteOn4, noteOff4);
// --- PÉDALES D'EXPRESSION (A13, A14, A15) ---
int Cur6 = analogRead(13); int Map6 = map(Cur6, 0, 1023, 0, 127);
if (abs(Cur6 - LastPot6) >= 8) { MidiSend(chan6, Exp, Map6); LastPot6 = Cur6; }
int Cur7 = analogRead(14); int Map7 = map(Cur7, 0, 1023, 0, 127);
if (abs(Cur7 - LastPot7) >= 8) { MidiSend(chan7, Exp, Map7); LastPot7 = Cur7; }
int Cur8 = analogRead(15); int Map8 = map(Cur8, 0, 1023, 0, 127);
if (abs(Cur8 - LastPot8) >= 8) { MidiSend(chan8, Exp, Map8); LastPot8 = Cur8; }
}
// Fonction lecture bus 61 touches → tableau [11][6]
void readBusKeys(byte keys[11][6]) {
// Mapping broches → notes (61 touches = 11×6 - 5)
// Ordre : broches 2-53, A0-A8 (61 entrées)
int pins[61] = {2,3,4,5,6,7,8,9,10,11, 12,13,14,15,16,17,18,19,20,21,
22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,
42,43,44,45,46,47,48,49,50,51, 52,53,A0,A1,A2,A3,A4,A5,A6,A7,A8};
for (int i = 0; i < 61; i++) {
int col = i / 6;
int row = i % 6;
if (col < 11 && row < 6) keys[col][row] = digitalRead(pins[i]);
}
}
// Fonction envoi MIDI pour un clavier
void sendKeyboardMidi(byte keys[11][6], byte last[11][6], int noteOn, int noteOff) {
for (int col = 0; col < 11; col++) {
for (int row = 0; row < 6; row++) {
int note = 36 + col * 6 + row;
if (note > 96) continue;
if (keys[col][row] == 0 && last[col][row] == 0) {
MidiSend(noteOn, note, velocity); last[col][row] = 7;
}
if (keys[col][row] == 1 && last[col][row] == 7) {
MidiSend(noteOff, note, velocity); last[col][row] = 0;
}
}
}
}
void MidiSend(int one, int two, int three) {
Serial.write(one); Serial.write(two); Serial.write(three);
}
Schémas de câblage
- Schéma 1 : Claviers matricés 6×11 (2 manuels + pédalier) avec entrées potentiomètres
- Schéma 2 : Claviers bussés (4×61 touches) avec entrées potentiomètres
Les schémas détaillés montrent le câblage complet : diodes sur interrupteurs, connexion prise MIDI (résistance 220Ω sur TX), brochage Arduino Mega, et montage pédale d'expression.
Résumé des différences Matricé vs Bussé
| Caractéristique | Matricé (Matrixed) | Bussé (Bussed) |
|---|---|---|
| Câblage interrupteurs | Matrice lignes/colonnes + diodes | Bus commun + 1 fil par touche + diodes |
| Diodes | Côté colonne (anode vers switch) | Côté non-bussé (cathode vers switch) |
| Broches Arduino utilisées | 6 lignes + 11 colonnes par clavier | 61 entrées partagées + 4 colonnes |
| Nombre claviers supportés | 3 (2 manuels 6×11 + 1 pédalier 6×7) | 4 claviers 61 touches complets |
| Complexité câblage | Modérée (diodes sur chaque switch) | Plus simple par touche, mais 61 fils |
| Code testé | Oui | Non (théorique) |
Processus de fabrication
- Obtenir la certification ISO 26262 pour les composants logiciels automobiles
- Eclipse Ditto 1.0 — La plateforme Device-as-a-Service pour le développement de Jumeaux Numériques
- Mises à jour logicielles cloud robustes pour dispositifs IoT
- Solutions de découpe numérique pour l'industrie du tapis – OMNI CNC
- Maîtriser la gestion des actifs numériques : une stratégie complète pour l'excellence des actifs pilotée par les données
- PET chargé verre avancé pour pièces extérieures automobiles supérieures
- Top 3 des tendances de la fabrication numérique façonnant 2020
- Plan stratégique pour réussir sa transformation digitale
- Composants Invar 36 : matériaux, propriétés et achat de confiance