🛠 Contrôleur MIDI complet : encodeurs, multiplexage 74HC4051 et MIDIx16

Teensy 3.2 · avance · Schéma : IMG-teensy-32-avance-8-teensy32-controleur-midi-diy.svg — boîtier DIY ouvert : Teensy 3.2 au centre, 8 encodeurs rotatifs et 16 potentiomètres multiplexés via deux puces 74HC4051 (broches A/B/S annotées), nappe USB partant vers un ordinateur affichant une DAW avec 16 câbles MIDI ; en médaillon, le délai de stabilisation ≥ 50 µs après changement de canal du multiplexeur.

Objectifs

Passer des 3 boutons du tutoriel débutant à un vrai contrôleur MIDI DIY — la spécialité historique de la Teensy 3.2 : boutons, encodeurs rotatifs et rangées de potentiomètrès, multiplexés pour économiser les broches, publiés sur les 16 câbles MIDI virtuels (MIDIx16). Vous utiliserez la bibliothèque MIDIcontroller (Josh Nishikawa), publiée pour ce cas d'usage, et vous traiterez les deux pièges documentés : le crosstalk des potentiomètrès multiplexés et le bourrage des buffers USB.

Matériel

Architecture

Le piège du 74HC4051 : laisser le signal se stabiliser

Quand on change le canal sélectionné d'un multiplexeur 74HC4051, l'entrée analogique a besoin d'un délai d'établissement (settling) d'au moins 50 µs — davantage si des condensateurs sont présents — sinon le canal précédent continue d'influencer la lecture : les potentiomètrès « se lisent entre eux » (thread forum PJRC « Potentiometers affecting each others when connected to 74HC4051 »).

// Squelette de lecture multiplexee avec settling time.
const int ADDR[] = {A0, A1, A2};   // adresses du 4051

void selectCanal(uint8_t n) {
  for (int i = 0; i < 3; i++) digitalWrite(ADDR[i], (n >> i) & 1);
  delayMicroseconds(60);            // >= 50 us de stabilisation (forum PJRC)
}

uint16_t lirePot(uint8_t canal) {
  selectCanal(canal);
  return analogRead(A3);            // sortie commune du 4051 -> A3
}

Envoi des messages

#include <MIDIcontroller.h>
// Exemple de declaration (voir README de la biblio pour la signature exacte) :
// MIDIcontroller ctl = MIDIcontroller(NUM_BUTTONS, NUM_SLIDERS, ...);
// A chaque tour de loop :
//   ctl.encode(encodeurPin, canal, numeroCC);
//   ctl.button(boutonPin, canal, numeroNote);
//   ctl.slider(canalMux, canal, numeroCC);
// puis TOUJOURS :
void loop {
  // ... scan des entrées, envois CC/Note ...
  while (usbMIDI.read) { }   // draine les messages entrants
}

Ruptures de compatibilité à connaître (Teensyduino ≥ 1.41)

Vérification attendue

Dans la DAW : la Teensy apparaît avec 16 câbles MIDI ; tournez l'encodeur 1 → le CC correspondant bouge sur le câble choisi ; bougez un potentiomètre multiplexé → sa valeur suit proprement, sans que les voisins sautent (preuve que le settling time de 60 µs fait son travail). Laissez la DAW renvoyer de l'horloge MIDI pendant 10 minutes : sans le drain usbMIDI.read, le contrôleur se fige — avec, il tient.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels