Cartes-filles MIDI-ITO-HAT pour Raspberry Pi (Partie 1/2)

Explorons la conception de trois cartes-filles MIDI – ITO – HAT (Hardware Attached on Top) pour les Raspberry Pi 3B+ / 4B / 400 et leur utilisation avec des applications de MAO installées sur Raspberry Pi OS 32-bit (Debian 10 Buster)

⇒ Dernière mise à jour – 1/10/2021 : Overlay midi-uart0 et ttyMIDI Original Bridge

  • Nota bene : Le contenu de cet article a constamment évolué, avec des modifications – des ajouts et des suppressions, au fur et à mesure de l’avancement des travaux sur mon projet.

• Mon Projet libre DIY est opérationnel (matériel + logiciel) :  😎
Carte-fille MIDI-ITO-HAT I/F + Overlays disable-bt & midi-uart0 + ttyMIDI Original Bridge + ALSA = Un Quintet musical gagnant pour les Raspberry Pi !

◊ Sommaire

♦ Introduction

• C’est quoi mon projet de cartes-filles « MIDI-ITO-HAT » ?

  • MIDI = Musical Instrument Digital Interface
  • ITO = Input / Throughput / Output (MIDI-DIN)
  • HAT = Hardware Attached on Top (Raspberry Pi)

Au départ mon projet MIDI-ITO-HAT ciblait uniquement le Raspberry Pi 400, mini-ordinateur ARM sorti fin 2020 que je possède depuis quelques mois. Puis, je me suis dit qu’il pourrait aussi être adapté aux nano-cartes Raspberry Pi 3B+ et Raspberry Pi 4B, voire d’autres, tous sous Raspberry Pi OS 32-bit (base Debian 10 Buster) le système d’exploitation libre de la Fondation Raspberry Pi.
Ce projet libre DIY (Do It Yourself) permet donc de connecter des équipements MIDI-DIN (de musique, d’éclairage, de lumière voire multimédia) au travers de câbles/prises DIN 5 broches (à 180°) au port GPIO (Header à 40 broches – 2×20 pin) des nano-cartes et mini-ordinateurs Raspberry Pi.
Il supporte tous les messages MIDI incluant les System Exclusive (SysEx). Ce projet est un mix de matériel et de logiciel. Une fois l’équipement MIDI-DIN connecté au RPi au travers d’une des cartes-filles MIDI-ITO-HAT correctement configurée, il sera en mesure de dialoguer avec toutes les applications et tous les utilitaires utilisant le MIDI ALSA, voire le MIDI JACK (avec des utilitaires spécifiques).

MIDI-ITO-HAT

  • C’est un schéma électronique commun,
  • avec une implémentation sur 3 cartes-filles différentes :
    • une Multi-cible Midi In/Thru/Out (PCB standard 80 x 60 mm) pour les RPi 3B+/4B/400 avec un GPIO Header adapté à chaque utilisation,
    • une HAT In/Out format standard (PCB spécifique 65 x 56 mm) pour les RPi 3B+/4B avec un GPIO Header standard, et
    • une autre HAT In/Thru/Out grand format (PCB spécifique 85 x 56 mm) pour les RPi 3B+/4B avec un GPIO Header standard.

Faisons maintenant un petit rappel concernant la musique électronique, ses champs d’application et les moyens de les mettre en œuvre.

MAO – Musique assistée par ordinateur

La MAO regroupe l’ensemble des utilisations de l’informatique comme outil associé à la chaîne de création musicale depuis la composition musicale jusqu’à la diffusion des œuvres, en passant par la formation pédagogique au solfège et la pratique d’instruments.

MIDI – Musical Instrument Digital Interface

Le MIDI est un protocole de communication -et- un format de fichier dédiés à la musique, et utilisés pour la communication entre instruments électroniques, contrôleurs, séquenceurs, et logiciels de musique.
Il est apparu dans les années 1980, issu d’une volonté de l’industrie de normaliser les échanges entre différents instruments de différentes marques. Ce protocole est devenu aujourd’hui un standard très répandu dans le matériel électronique de musique et dans d’autres domaines.

• The MIDI Association

La MIDI Manufacturers Association (Association de constructeurs MIDI) ou MMA est une organisation professionnelle sans but lucratif, composée principalement de développeurs de solutions matérielles et logicielles, et travaillant sur les standards liés à la norme MIDI. Elle a été fondée en 1985 aux États-Unis par Jeff Rona, deux ans après l’apparition de la norme MIDI 1.0, en 1983.

♦ MIDI-DIN Electrical Specification

• Original Electrical Specification 1.0 [1985]

La description de la spécification électrique MIDI 1.0 et l’exemple de circuit (ci-dessous) donnés dans le document 1.0 original (1983) utilisaient une électronique 5 volts comme c’était courant à l’époque.

MMA – MIDI-DIN Electrical Circuit as of 1985

Electrical Specification Update 1.1 [2014]

La spécification 1.0 a été mise à jour en 2014 en version 1.1 pour refléter les exigences de conception actuelles tels que les circuits électroniques 3,3 volts et la réduction des interférences RF (Radio Frequency).
Cette mise à jour ajoute des filtres RF à billes de ferrite en option aux broches de signal et des dispositions de mise à la terre en option pour les connecteurs de blindage de mise à la terre sur les prises MIDI.

• Les recommandations v.1.1 de la MIDI Association [2014]

– MIDI-OUT

Comme nous pouvons le constater, cette version 1.1 n’est pas fondamentalement différente de la v.1.0 mais elle introduit la compatibilité avec la logique CMOS à 3,3V pour les équipement MIDI les plus récents. De plus, un soin particulier doit être maintenant porté aux interférences électromagnétiques. Elles sont également appelées interférences de radiofréquences qui sont des perturbations générées par une source externe qui affectent un circuit électrique par induction électromagnétique, couplage électrostatique ou conduction.

MIDI-OUT Circuit as recommanded by the MIDI Association (MIDI Specification Rev.1.1 as of 2014)

Le schéma ci-dessus résume ces nouvelles recommandations v.1.1 de la MIDI Association pour le circuit MIDI-OUT (DIN).

– MIDI-IN / MIDI-THRU

Il en va des MIDI-IN et MIDI-THRU en version 1.1 comme du MIDI-OUT en v.1.1 : ajout de la compatibilité CMOS 3,3V et des protections contre les RFI / EMI (interférences électromagnétiques).

MIDI-IN-THRU Circuit as recommanded by the MIDI Association (MIDI Specification Rev.1.1 as of 2014)

Le schéma ci-dessus résume ces nouvelles recommandations v.1.1 de la MIDI Association pour les circuits MIDI-IN et MIDI-THRU (DIN).

– MIDI-Cable

Rien de vraiment nouveau mis à part un rappel que le câble MIDI doit être blindé. Voir plus haut pour la connexion à la masse des broches n°2 des prises DIN 5 broches à 180° et du blindage des câbles, sauf pour le MIDI-IN.

MIDI-Cable as recommanded by the MIDI Association (MIDI Specification Rev.1.1 as of 2014)

Si vous voulez utiliser le Power-over-MIDI, le câble devra être à 4+1 fils (au lieu de 2+1) afin de pouvoir faire passer le courant entre les broches n°1 et 3. En fonction du courant électrique à fournir à l’équipement MIDI, il sera peut-être nécessaire d’utiliser une alimentation électrique additionnelle.

♦ Spécifications électriques GPIO / UARTs des RPis

Une caractéristique puissante des Raspberry Pi est l’ouverture sur le monde physique avec la rangée de broches GPIO (General Purpose Inputs/Outputs ou Entrées/sorties à usage général) le long du bord supérieur des nano-cartes RPi et à l’arrière des mini-ordinateurs RPi 400. Une en-tête (header) GPIO à 40 broches (2 x 20) se trouve sur toutes les nano-cartes Raspberry Pi actuelles (mais pas sur les Pi Zero et Pi Zero W). Avant le RPi 1 Model B+ (2014), les cartes comprenaient une en-tête plus courte à 26 broches.

Les broches du GPIO peuvent être configurées comme entrée à usage général, sortie à usage général ou comme l’un des six autres paramètres spéciaux, dont les fonctions dépendent des broches utilisées.
En plus d’être de simples périphériques d’entrée et de sortie, les broches du GPIO peuvent être utilisées avec une variété de fonctions intégrées alternatives, certaines sont disponibles sur toutes les broches, d’autres sur des broches spécifiques telles que PWM (SW or HW Pulse-Width Modulation), SPI (Serial Peripheral Interface), I2C (Inter-Integrated Circuit) et Serial (UART) qui nous intéresse ici. Voir cet article sur le GPIO and the 40-pin Header.

Pour mon projet de cartes-filles MIDI-ITO-HAT, je vais utiliser la fonction Serial (TXD et RDX), c’est à dire les UART (Universal Asynchronous Receiver/Transmitter) du RPi. Un UART est un émetteur-récepteur asynchrone universel cadencé à une certaine vitesse de transmission, ici pour le MIDI v.1.0 et v.1.1 c’est du 31.250 baud (1 baud = +/- 1 bit/s !), voir les spécifications de la norme MIDI-DIN.

NOTE : Depuis peu la Fondation Raspberry Pi a changé l’organisation de son site web et de ses documents. En conséquence les liens URL vers ceux-ci ont aussi bougé. J’ai mis à jour mes liens vers les nouveaux URLs RPi autant que faire se peut. La nouvelle Documentation officielle des ordinateurs et microcontrôleurs Raspberry Pi se trouve maintenant ICI.

Raspberry Pi Hardware
GPIO / UART – Universal Asynchronous Receiver/Transmitter
  • UART pins in BCM mode are: #14 & #15
  • UART pins in WiringPi are: #15 & #16
  • Configuring UARTs

Mais comme nous le verrons plus loin dans les tests, l’utilisation de l’UART avec un baud rate « fixe » (obligatoire) peut nous amener à désactiver certaines fonctions (non essentielles ?) du Raspberry Pi !

♦ 1ère Étape : Schéma électrique du MIDI-ITO-HAT

Ce schéma électronique commun aux 3x cartes-filles a été conçu avec la suite libre KiCad EDA sous GNU/Linux. Il est en conformité avec les Spécifications électriques MIDI-DIN v.1.1 de 2014 ainsi que celles du port GPIO des Raspberry Pi 3B+/4B/400. Il est pour l’instant compatible qu’avec les équipements MIDI-DIN « vintage » 5V (« legacy »).
Dans une future version, il pourrait être configurable 5V ou 3,3V pour être compatible avec des équipements MIDI plus récents (3,3V) et pourrait aussi supporter le Power-over-MIDI (DIN).

MIDI-ITO-HAT I/F for Raspberry Pi | Electrical diagram – Rev. A-1d

– L’utilisation des 2x switches SW-OFF/ON (commutateur d’alimentation Arrêt/Marche) et SW-TXD/RXD (commutateur de dé/connexion des broches du GPIO) n’est pas obligatoire mais cela apporte de la flexibilité pendant la phase de prototypage du projet -et- permet aussi en utilisation courante la déconnexion électrique totale de la carte-fille sans avoir besoin de la retirer physiquement du port GPIO des Raspberry Pi.
Si l’un ou l’autre ou les 2 switches ne sont pas utilisés, nous établirons une connexion électrique entre les broches 2/3 et 5/6 du·des commutateur·s concerné·s.
– L’utilisation des L1/L2/L3/L4/L5/L6 n’est pas obligatoire, dans ce cas à remplacer par des connexions directes, mais cela dégrade fortement les performances EMI/EMC de la carte-fille.
– La paire de composants D4/R10 pourrait être reliée au +5V en lieu et place du +3,3V.

• Notices techniques (datasheets) des 2 Circuits intégrés (IC)

  • 6N138M Datasheet: Single-Channel Darlington Optocoupler, 8-Pin DIP, Low Input Current High Gain Split.
  • 6N138 Application Notes: OnSemi and BroadCom
  • 74HCT245N Datasheet: Octal Bus Transceiver with 3-state outputs, 20-Pin DIP, is designed for asynchronous 2-way communication between data buses. The control-function implementation minimizes external timing requirements. This device allows data transmission from the A-bus to the B-bus or from the B-bus to the A-bus (like here in this MIDI-ITO-HAT project) depending upon the logic level at the direction-control (DIR) input (pin #1). The output-enable (OE\) input (pin #19) can be used to disable the device so that the buses are effectively isolated.
    HCT‘ stands for High Speed CMOS with TTL compatibility (both power supply voltages and logic input levels). It’s needed for legacy MIDI-DIN electrical compatibility (5 Volts). See also 7400-series integrated circuits.

♦ 2ème Étape : Réalisation des prototypes

Cette platine d’essai (2x cartes d’expérimentation MB102 de 830 points chacune sans soudure) a été facilement réalisée sous GNU/Linux avec Fritzing, un logiciel libre de conception de circuit imprimé qui permet de concevoir de façon entièrement graphique le circuit d’essai sans aucune soudure.

MIDI-ITO-HAT I/F for Raspberry Pi | Preliminary Test Breadboard – v.1.1

Puis, toujours avec Fritzing, d’en imprimer le typon. Pour un résultat sans aucune erreur, il faudra obligatoirement passer par le Routage manuel car son Autoroutage n’est vraiment pas satisfaisant, même comme ici pour un circuit relativement simple !

Pour gagner de la place sur la version finale de la carte-fille MIDI-ITO-HAT I/F, le J1 – GPIO Breakout 40 pin sera remplacé par un connecteur simple à 40 broches (2×20), Mâle si utilisation avec une nappe ou Femelle si directement branchée au Raspberry Pi. Il faudra aussi tenir compte des différences physiques (positionnement et orientation) entre les Headers GPIO des RPi 3B+/4B et RPi 400.

MIDI-ITO-HAT I/F for Raspberry Pi | Preliminary Test Daughter Board – Model 1.1

Je préfère utiliser KiCad EDA, qui est beaucoup plus performant que Fritzing, pour la réalisation de schémas électriques avec Eeschema et de circuits imprimés avec Pcbnew. Mais Fritzing est une très bonne solution pour effectuer les premières étapes d’un projet voire la totalité pour des circuits imprimés qui ne sont pas trop complexes, comme ici pour MIDI-ITO-HAT.

• 31/07/2021

Tous mes composants électroniques n’étant pas encore arrivés avec des livraisons maintenant prévues durant la 2ème quinzaine d’août, j’ai continué à avancer sur mon projet.

Pour la réalisation de mes prototypes, j’ai décidé de sauter l’étape de la Platine d’essai sans soudure MB102 avec l’Adaptateur T-Cobbler Plus (Modèle 1) et de passer directement à la conception des circuits imprimés d’essai, si possible en simple face.
Dans un premier temps ceux-ci seront réalisés en utilisant des circuits imprimés standards de prototypage en fibre de verre double-face de 6×8 cm / 2.36×3.14 inches (taille approximative d’un RPi 4) – épaisseur 1,6 mm avec environ 600 trous + pastilles pré-étamées (espacement horizontal / vertical de 2,54 mm). Achetés par 10, ces PCB m’ont coûté 0,70 € / pièce frais de livraison, droit de douane et TVA compris.

RPi-ITO-HAT Interface — Modèle 2 Multi-cible

Cette carte-fille MIDI-ITO-HAT — Modèle 2 Multi-cible universel pourra être branchée au port GPIO (mâle à 40 broches – 2x 20) des Raspberry Pi 3B+/4B/400 de plusieurs manières différentes en utilisant un Header J1 adapté et convenablement positionné sur la carte-fille (image ci-dessous).

L’ensemble de la quarantaine de composants actifs et passifs de cette carte-fille Modèle 2, y compris le PCB standard de prototypage et la nappe IDC Arc-en-ciel avec détrompeurs, revient à environ 6 € (six euros) tous frais compris, dans toute bonne boutique asiatique en ligne. L’idéal est de choisir, si possible, un seul fournisseur afin de minimiser au maximum les frais de livraison. Pour arriver à ce coût de revient compétitif, il faut commander chaque article avec un multiple d’au moins x10 voire plus pour les articles très peu coûteux. Ils pourront être utilisés dans d’autres projets.

MIDI-ITO-HAT I/F for Raspberry Pi | Test Daughter Board – Model 2.0e

Multi-cible de la carte-fille RPi MIDI-ITO-HAT — Modèle 2 avec les 3x Headers J1 possibles et les composants toujours visibles par l’utilisateur
  • Raspberry Pi 3B+/4B et 400
    • J1 = Male Shrouded IDC Header – « Straight » 2×20 pins (écartement 2,54 mm) positionné sur la face supérieure de la carte-fille (côté composants)
      => PCB simple face OK
      + Câble plat IDC Arc-en-ciel avec 2 embouts femelles à 2×20 broches et détrompeur des 2 côtés pour une utilisation flexible de la carte-fille quel que soit le RPi utilisé.
    • J1 = Female Header Socket Strip – « RIGHT Angle » 2×20 pins (écartement 2,54 mm) positionné sur la face inférieure de la carte-fille (côté soudures)
      => PCB double-face obligatoire pour soudures des broches J1 côté composants.
      – RPi 3B+/4B : Pour une connexion directe de la carte-fille à la Verticale au port GPIO du RPi. L’inconvénient de cette solution est l’effet levier de celle-ci sur le RPi.
      – RPi 400 : Pour une connexion directe de la carte-fille à l’Horizontale au port GPIO ici à l’arrière du RPi.
      Note : Il faut couper proprement la carte-fille de prototypage de 5 mm du côté du Header J1 afin qu’elle s’insère correctement et complètement dans le logement GPIO du RPi 400 -ou- utiliser un adaptateur femelle/mâle 2×20 broches entre le RPi 400 et cette carte-fille (ma préférence).
  • Raspberry Pi 3B+/4B
    • J1 = Female Header Socket Strip – « Straight » 2×20 pins (écartement 2,54 mm) positionné sur la face inférieure de la carte-fille (coté soudures)
      => PCB double-face obligatoire pour soudures des broches J1 côté composants.
      Pour une connexion directe de la carte à l’Horizontale au port GPIO du RPi. L’inconvénient de cette solution est le très grand débordement et l’effet levier de celle-ci sur le RPi.

10/08/2021

Les composants comment enfin à arriver : circuits imprimés de prototypage double-face, connecteurs / headers, nappes IDC Arc-en-ciel, prises DIN-5 180°, supports de CI, circuits intégrés, diodes, diodes électroluminescentes et interrupteurs. Il ne manque plus que ceux passifs : les résistances, condensateurs et perles de ferrite.

En attendant, je n’ai pas pu résister à monter les composants disponibles sur le PCB de prototypage du Modèle 2 Multi-cible universel (image ci-dessous).

MIDI-ITO-HAT I/F for Raspberry Pi | Preliminary Prototype PCB – Model 2.0

Comme écrit plus haut, le J1 – GPIO Header sera choisi en fonction du modèle Raspberry Pi (RPi 3B+/4B/400) sur lequel le MIDI-ITO-HAT sera connecté. Pour ma part possédant un Raspberry Pi 400, je testerai cette carte-fille avec les deux J1 – Headers : Male Shrouded Straight + Câble plat IDC Arc-en-ciel (côté composants) -et- Female Socket Right Angle + Adaptateur femelle/mâle (côté soudures).

5/09/2021

Ça y est. Les derniers composants passifs sont enfin (presque) arrivés (sauf les perles de ferrite et l’adaptateur Femelle / Mâle 40 broches). J’ai pu finaliser la réalisation du circuit imprimé de prototypage ici avec l’IDC Header Male Shrouded Straight + le Câble plat IDC Arc-en-ciel (avec détrompeurs des deux côtés).

MIDI-ITO-HAT I/F for Raspberry Pi | Preliminary Prototype PCB – Model 2.0c

Pour l’instant, j’ai remplacé les 6x perles de ferrite par de simples cavaliers gainés (fils gris).
Je vais maintenant pouvoir continuer avec les tests de ma Carte-fille de prototypage du Modèle 2 Multi-cible universel connectée à mon Raspberry Pi 400 (voir plus bas).

RPi-ITO-HAT Interface — Modèle 3 à l’étude

La carte-fille MIDI-ITO-HAT — Modèle 3 est conçue pour être branchée à l’horizontale directement au port GPIO (mâle à 40 broches – 2 x 20) des Raspberry Pi 3B+/4B (image ci-dessous). Ce Modèle 3 pour les RPi 3B+/4B s’utilise comme un « vrai » HAT (format standard et grand format), c’est-à-dire physiquement au dessus des RPi qu’elle recouvre complètement. Si nécessaire, on peut prévoir les 2x découpes du circuit imprimé pour le passage des nappes plates Caméra et Écran mais après le repositionnement d’un certain nombre de composants et les pistes de cuivre associées.

MIDI-ITO-HAT I/F for Raspberry Pi | Test Daughter Board – Model 3.0e

Par rapport au Modèle 3.0d, le Modèle 3.0e intègre maintenant les deux commutateurs Power ON/OFF (+3,3V et +5V) et TXD/RXD ON/OFF. Leur utilisation n’est pas obligatoire mais cela apporte de la flexibilité pendant la phase de prototypage du projet -et- permet aussi en utilisation courante la déconnexion électrique totale de la carte-fille sans avoir besoin de la retirer physiquement du port GPIO des Raspberry Pi 3B+/4B.
Si l’un ou l’autre ou les 2 switches ne sont pas utilisés, nous établirons une connexion électrique entre les broches 2/3 et 5/6 du·des commutateur·s concerné·s (voir le schéma électrique plus haut).

Raspberry Pi 3B+/4B  « uniquement »
  • MIDI-ITO-HAT – Carte Format « Standard » (65 x 56 mm) – MIDI-IN/OUT
    • J1 (GPIO Header) = ‘Normal’ Female Header Socket Strip – Straight 2×20 pin (comme sur un HAT classique) positionné sur la face inférieure de cette carte-fille (côté soudures)
      => PCB double-face obligatoire pour soudures des broches J1 côté composants.
  • MIDI-ITO-HAT – Carte « Grand » Format (85 x 56 mm) – MIDI-IN/OUT/THRU
    • J1 (GPIO Header) = ‘TALL’ Female Header Socket Strip – Straight 2×20 pin (comme sur un HAT classique) positionné sur la face inférieure de cette carte-fille (côté soudures)
      => PCB double-face obligatoire pour soudures des broches J1 côté composants.
      Ce ‘Tall’ Header permet à la carte-fille de passer au-dessus des 3 blocs de prises USB et Ethernet des RPi 3B+/4B.
  • Références Raspberry Pi : Add-On Boards and HATs, HAT Board Mechanical, Mechanical drawings Raspberry Pi 4B et Raspberry Pi 3B+.

♦ 3ème Étape : Configuration et tests UARTs des RPi

RAPPEL : Les réglages et configurations logiciels qui suivent sont valables pour Raspberry Pi OS 32-bit (base Debian 10 Buster 32-bit) ! Si un autre système d’exploitation libre et compatible avec les Raspberry Pi 3B+/4B/400 est utilisé, il faudra peut-être « adapter » les paramètres (si c’est possible) à la distribution GNU/Linux choisie. Consultez, par exemple, cet article pour voir les différences entre Raspberry Pi OS Buster 32-bit, Manjaro-ARM 21.04 MATE & Xfce 64-bit et Ubuntu-ARM 20.10 / 21.04 MATE 64-bit.

Comme nous l’avons vu plus haut, les cartes-filles MIDI-ITO-HAT utilisent l’un des UART des Raspberry Pi 3B+/4B/400. Avant de pouvoir utiliser MIDI-ITO-HAT, il faut convenablement configurer l’UART (Universal Asynchronous Receiver/Transmitter) choisi sur le Raspberry Pi puis le tester.

Il existe deux types d’UART disponibles sur les Raspberry Pi 3B+/4B/400 : le PL011 et le mini-UART. Le PL011 est un UART performant et largement compatible avec le 16550 UART, tandis que le mini-UART a un ensemble de fonctionnalités réduit. Mon projet MIDI-ITO-HAT utilise le PL011 car c’est l’UART qui permet en particulier d’avoir un contrôle total sur la fréquence (débit) de son Baud Rate et cela indépendamment de celle du cœur du VPU.

Note : D’après les spécifications du MIDI-DIN v.1.0/1.1, nous devons paramétrer les transmissions avec un Baud Rate = 31.250 baud ± 1% pour des trames UART constituées des bits suivants : 1x Start bit, 8x Data bits, No Parity, 1x Stop bit = 10 bits/trame. Il faut régler la fréquence de l’horloge de l’UART0 en conséquence, voir plus loin.

Tableau récapitulatif des UARTs des Raspberry Pi
MODÈLE
UART #1 #2 #3 #4 #5 #6
RPi3B+ Nom UART0 UART1
  Type PL011 mini-UART        
  Affectation 2ème (BT) 1er        
RPi OS Périphérique
Linux
/dev/ttyAMA0
/dev/serial1
/dev/ttyS0
/dev/serial0
       
RPi4B
RPi400
Nom UART0 UART1 UART2 UART3 UART4 UART5
  Type PL011 mini-UART PL011 PL011 PL011 PL011
  Affectation 2ème (BT) 1er 4xUART additionnels désactivés par défaut
RPi OS Périphérique
Linux
/dev/ttyAMA0
/dev/serial1
/dev/ttyS0
/dev/serial0
       

* Références officielles à consulter : Configuring UARTs et GPIO and the 40-pin Header

• 1ère Configuration et Test de TXD ⇒ RXD avec « /dev/ttyS0 »

Sous Raspberry Pi OS 32-bit (base Debian 10 Buster) pour me faire la main, j’ai d’abord testé le mini-UART qui est sur /dev/serial0 -> /dev/ttyS0 car /dev/serial1 -> /dev/AMA0 est par défaut utilisé par le modem Bluetooth (BT), voir le tableau ci-dessus.
Avec le RPi complètement éteint et déconnecté du secteur, pour réaliser facilement et en toute sécurité une boucle physique TXD ⇒ RXD, j’ai connecté une résistance d’~ 680 Ω (à enlever après les tests) entre les pin-8 TXD et pin-10 RXD du GPIO Header.
Jamais de liaison directe entre les broches pour éviter les courts-circuits avec destruction potentielle du SoC du RPi !

  • Désactiver la Console série Linux en tapant sudo raspi-config dans un Terminal :
    Dans la fenêtre Raspberry Pi Software Configuration Tool -> 3- Interface Options -> P6- Serial Port -> Would you like a login shell to be accessible over serial  -> <Non> -> Would you like the serial port hardware to be enable -> <Oui> -> The serial login shell is disabled / The serial interface is enabled -> <OK>.
    Redémarrer le RPi afin que les changements  prennent effet.
  • Puis, tester la boucle physique TXD ⇒ RXD avec l’utilitaire Minicom ou CuteCom, ici avec un Baud Rate standard de 115.200 baud (image ci-dessous).

MIDI-ITO-HAT I/F for Raspberry Pi | TXD ⇒ RXD Test with Device /dev/ttyS0

Note : Si nous testons avec l’utilitaire stty (installé par défaut) le périphérique /dev/ttyS0 dans un Terminal avec ce petit bout de script :

for baud in $( sed -r 's/^#define\s+B([1-9][0-9]+)\s+.*/\1/p;d' < /usr/include/asm-generic/termbits.h ); do echo $baud; stty -F /dev/ttyS0 $baud && echo Baudrate OK; done 2>&1 | pr -s" ... " -Jat2

nous constatons que le Baud Rate de 31.250 baud (celui du MIDI-DIN v.1.0 et 1.1) n’est toujours pas supporté par défaut. Les débits supportés par défaut sont compris entre 1.200 et 4.000.000 baud (22 valeurs de débit). Le plus proche du 31.250 baud est le 38.400 baud (…19.200…38.400…). Voir la 2ème Configuration ci-dessous pour plus de détails.

• 2ème Configuration et Test de TXD ⇒ RXD avec « /dev/ttyAMA0 »

IMPORTANT : Afin de pouvoir utiliser l’UART0 (PL011) en Émission/Réception sur les broches #8 = GPIO14/BCM14 (TXD) et #10 = GPIO15/BCM15 (RXD), il faut sous RPi OS 32-bit (Raspberry Pi Operating System, ex-Raspbian) désactiver comme précédemment la Console Série Linux mais aussi le Bluetooth (BT) intégré, reconfigurer le Périphérique, et choisir/forcer le Baud Rate à 38.400 baud (qui donnera 31.250 baud après changement de la fréquence de l’horloge de l’UART0).

  • Désactiver (ou vérifier l’état de) la Console série Linux avec sudo raspi-config dans un Terminal -> Voir ci-dessus le détail pour /dev/ttyS0.
  • Quelques modifications / ajouts à faire dans le fichier /boot/config.txt, par exemple en entrant dans un Terminal sudo nano /boot/config.txt :
    • dtoverlay=disable-bt désactive le périphérique Bluetooth et fait du premier PL011 (UART0) l’UART principal (1ère affectation – voir le Tableau récapitulatif plus haut).
      Il faut également désactiver le service systemd qui initialise le modem, afin qu’il ne se connecte pas à l’UART, en utilisant sudo systemctl disable hciuart dans un Terminal qui confirme en affichant Removed /etc/systemd/system/multi-user.target.wants/hciuart.service.
    • En regardant dans /boot/overlays/README de la dernière version de Raspberry Pi OS Buster (Debian 10), je peux maintenant voir disable-bt et d’autres overlays documentés.
      Pour une explication plus complète sur les Device Trees (DT), Overlays and Parameters, consultez ce document officiel en ligne.
  • Les tests sont à réaliser avec un Baud Rate de 31.250 baud ± 1% (spécifications MIDI-DIN v.1.0 et 1.1) mais Raspberry Pi OS 10 Buster ne supporte toujours pas ce débit par défaut.
    • Nouveau – 1/10/2021 : La solution la plus fiable, stable et reproductible, parmi d’autres possibilités, est d’utiliser un Overlay ad-hoc pour atteindre cet objectif. Pour ce faire nous prenons le midi-uart0.dtbo qui est disponible parmi plus de 230 overlays dans /boot/overlays.
      => Ajoutons simplement la ligne dtoverlay=midi-uart0 dans le fichier /boot/config.txt.
      Explication : midi-uart0 configure automatiquement la fréquence de l’UART0 (/dev/ttyAMA0) de sorte qu’un débit de 38.400 baud qui lui est demandé soit géré en fait comme du 31.250 baud, le débit standardisé qui est requis pour tout trafic MIDI-DIN.
  • Il ne reste plus qu’à choisir le Baud Rate de 38.400 baud en entrant dans un Terminal sudo stty -F /dev/ttyAMA0 38400 (à faire après chaque reboot du RPi ou à spécifier dans le script/programme utilisé !). Cela devrait convenir aux communications normalisées MIDI-DIN v.1.0 et v.1.1.

Après le redémarrage du RPi 400, vérifions dans un Terminal que les modifications ont bien été appliquées. Ici, je n’ai pas refait les tests avec l’utilisation de l’overlay midi-uart0 car je les ai faits directement à l’Étape 4 ci-dessous.

♦ 4ème Étape : Mise en action des prototypes

RAPPEL : Les réglages et configurations logiciels qui suivent sont valables pour Raspberry Pi OS 32-bit (base Debian 10 Buster 32-bit) ! Pour les autres systèmes d’exploitation compatibles avec les RPi, faire les modifications utiles, si cela est nécessaire et faisable.

Tests du MIDI-ITO-HAT Modèle 2 Multi-cible universel avec RPi 400

Toujours sous Raspberry Pi OS 32-bit après les modifications du fichier /boot/config.txt (voir ci-dessus), nous allons maintenant vérifier le bon fonctionnement des MIDI-IN/THRU/OUT de cette carte-fille Modèle 2 Multi-cible utilisant l’UART0 sur /dev/ttyAMA0.

Mais avant cela, le Raspberry Pi – ici 400 – doit reconnaître l’interface connectée MIDI-ITO-HAT comme un périphérique MIDI et pas comme une console Série (tty) ! Pour ce faire, nous allons essayer de trouver un utilitaire de conversion des communications Serial ⇔ MIDI compatible ALSA.

MIDI-ITO-HAT I/F | Testing Prototype PCB – Model 2.0c on Raspberry Pi 400

• Serial <=> MIDI Software #1  😎   (avec l’Overlay midi-uart0)

Parmi un certain nombre de possibilités, j’ai retenu en premier ce ttyMIDI v.0.60 qui me semble être l’Original (voir Note ci-dessous). Il a été développé pour Arduino mais devrait maintenant aussi fonctionner avec les Raspberry Pi.

Après la compilation de ttyMIDI Original – adaptée aux Raspberry Pi ! – (car prévue pour les Arduino et non disponible dans la Logithèque de RPi OS), son installation et sa configuration, nous aurons un pilote (driver) d’Entrée MIDI-IN et un pilote de Sortie MIDI-OUT disponibles sous ALSA. Puis pour effectuer les tests, nous utiliserons les outils MIDI d’ALSA (alsa-utils) installés par défaut sur Raspberry Pi OS comme aconnect (en ligne de commande ou en mode GUI), amidi, aplaymidi, arecordmidi, voire d’autres, si ttyMIDI Original est bien compatible avec eux. Si besoin, nous pourrions aussi utiliser les utilitaires graphiques QjackCtl et Qsynth en complément.

Note : Attention, plusieurs développeurs / projets utilisent le même nom générique ttymidi tel quel alors que ces différents utilitaires n’ont pas / plus tout à fait les mêmes caractéristiques, ou en lui ajoutant un préfixe ou un suffixe avec des fonctionnalités additionnelles.

L’utilitaire ttyMIDI Original a été téléchargé (fichier ttymidi.tar.gz d’~ 75 Ko), décompressé, ses fichiers Makefile et ttymidi.c adaptés au RPi OS (voir IMPORTANT ci-dessous), compilé et installé avec succès. Son utilisation se fait simplement en ligne de commande dans un Terminal et s’interface avec les utilitaires MIDI d’ALSA et aussi avec les applications MIDI installées. Consultez son fichier README pour en savoir plus. Voir ci-dessous un premier exemple d’utilisation en images.

IMPORTANT : 1- Après la décompression du fichier ttymidi.tar.gz, il faut modifier son fichier Makefile (qui exécute un ensemble d’actions décidé par l’utilisateur) avec un Éditeur de texte où la ligne de commande sous all: devient :
     gcc src/ttymidi.c -o ttymidi -lasound -lpthread    (était : gcc src/ttymidi.c -o ttymidi -lasound)
2- Avant de lancer la compilation de ttyMIDI, il faut modifier son fichier ttymidi.c (fichier source écrit en C) avec un Éditeur de texte juste au début de la section // Main program pour éviter une erreur de compilation ‘int’ à la ligne 477 :
     int main(int argc, char** argv)    (était : main(int argc, char** argv))
3- Et aussi, il faut installer le paquet logiciel libasound2-dev depuis un Terminal :
     sudo apt install libasound2-dev
ou en mode graphique depuis la Logithèque de Raspberry Pi OS.

MIDI-ITO-HAT I/F | ttyMIDI v.0.60 Compilation – Installation & Use on RPi 400

19/09 + 25/09 + 1/10/2021 :
Je suis maintenant prêt à passer aux derniers tests – les RUNs…

25/09/2021 : Oups ! Enfer et damnation !  🙄

Mes grands-mères chéries, qui ne sont pas des geeks en informatique, me le répètaient pourtant régulièrement : « Fais une sauvegarde de ton support système Raspberry Pi ! ». Je ne les ai pas écoutées remettant cela toujours au lendemain et Murphy est passé par là à l’improviste. Mon média RPi OS 10 vient de planter grave (récupération impossible) suite à une coupure du courant dans mon secteur pendant une phase intensive d’écriture/lecture sur ma clé USB système. Pourtant l’utilitaire SD Card Copier est installé par défaut sur RPi OS (~ 40 minutes pour dupliquer à l’identique une µSD Card ou clé USB de 64 Go prête à l’emploi). Alors vogue la galère, je suis parti pour une nouvelle et très longue réinstallation de plusieurs heures du système + applications + utilitaires + configuration. Mais cette fois je ferai régulièrement des sauvegardes/duplications. Je l’ai promis à mes douces grands-mères !

• RUN #1bis  -avec-  Serial <=> MIDI SW #1 : Mode Full Duplex ALSA  😎

A- Lecture fichier MIDI => Trafic MIDI au travers MIDI-ITO-HAT (MIH) => Synthétiseur matériel externe
B- Jeu sur Clavier-maître externe => Trafic MIDI au travers MIDI-ITO-HAT => Synthétiseur logiciel interne

Note : Maintenant avec l’utilisation de l’Overlay midi-uart0 dans /boot/config.txt !

– Je lance ttyMIDI OriginaI en mode verbeux (pour débogage si nécessaire) dans un Terminal.
– Je lance Qsynth que j’ai préalablement configuré avec Pilote MIDI = alsa_seq, Pilote Audio = alsa et Banque de sons = Timbres of Heaven (compatible Modes GS/GM/XG d’~ 380 Mo). Parmi d’autres SoundFonts libres, nous pourrions aussi utiliser l’historique Fluid-soundfont-gm (FluidR3_GM.sf2 compatible Mode GM d~ 150 Mo) qui est directement disponible dans la Logithèque de RPi OS.
– Je lance Drumstick MIDI Player (DMP) et Drumstick Virtual Piano (DVP).
– Je lance AconnectGUI et j’établis graphiquement les connexions MIDI internes entre ces 4 logiciels. Cette opération peut aussi se faire directement depuis les 3 applications MIDI (hors ttyMIDI).
– Je connecte un Clavier-maître externe à MIDI-IN.
– Je connecte un Synthétiseur matériel externe à MIDI-OUT.
– Je charge un fichier MIDI, ici Adele – Rolling in the Deep.mid (format SMF – Standard MIDI File), dans DMP, je lance sa lecture -et- je joue en même temps sur le Clavier-maître MIDI externe.

La musique interne sur synthétiseur logiciel (venant de MIDI-IN) retentit correctement dans mes enceintes stéréo branchées au RPi 400 et les notes s’affichent sur le clavier de DVP.
Pour mémoire : Sur mon RPi 400 j’utilise un USB Audio Device connecté sur le port USB 2.0. L’utilisation de ce dongle CSL Audio/USB (reconnu par RPi OS comme un Unitek Y-247A avec chipset Cmedia HS-100B) sera fort utile quand je basculerai de l’Audio ALSA à JACK, car l’Audio JACK sur HDMI ne fonctionne pas très bien sur les Raspberry Pi.

La musique externe sur synthétiseur matériel (venant de MIDI-OUT) retentit aussi corectement dans une autre paire d’enceintes branchée sur la sortie Audio du synthétiseur.

MIDI-ITO-HAT I/F | Run #1bis with ttyMIDI v.0.60 under RPi OS 10 Buster on RPi 400

RUN #1bis : Cheminement simplifié du trafic MIDI (messages et données)
  • Fichier MIDI (.mid ou .kar – Standard Midi File) => Drumstick Media Player => ttyMIDI / GPIO TXD => MIDI-ITO-HAT / MIDI-OUT => Câble MIDI-DIN 5 broches (Noir) => MIDI-IN / Synthétiseur externe (Yamaha CBX-T3 ou TG100 ou autres synthétiseurs vintages)
    -et-
  • Clavier-maître MIDI (Roland PC-200 vintage) / MIDI-OUT => Câble MIDI-DIN 5 broches (Jaune) => MIDI-IN / MIDI-ITO-HAT => GPIO RXD / ttyMIDI => Qsynth / MIDI SoundFont

MIDI-ITO-HAT I/F | Test environment under RPi OS 10 Buster on RPi 400

RUN #1bis : EXCELLENTS RÉSULTATS  😎

– 30/09/2021 : Après réinstallation complète de RPi OS 10 (voir ci-dessus 25/09/2021) et des tests supplémentaires des MIDI-DIN IN/OUT/THRU, il me semble que le problème soit un mauvais alignement des planètes « baud rates UART / ttyAMA0 / ttyMIDI ». ttyMIDI sur MIDI-DIN OUT ne délivre pas les messages à 31.250 baud ± 1% et ttyMIDI sur MIDI-DIN IN ne gère pas correctement les messages reçus à 31.250 baud d’un périphérique MIDI externe.
Après de plus amples investigations, j’ai enfin réussi à faire fonctionner Clavier-maître MIDI / Roland PC-200 => MIDI-DIN IN / MIDI-ITO-HAT => ttyMIDI => Qsynth / FluidSynth / SoundFont en utilisant l’Overlay « midi-uart0 » en lieu et place du changement de fréquence de l’UART0 (/dev/ttyAMA0). Les messages et données MIDI – au moins Notes, Program Changes (PC) et Control Changes (CC) – sont correctement reçus et traités.  😎
Je vais maintenant investiguer les MIDI-DIN OUT et THRU => Périphériques MIDI externes.

– 1/10/2021 : Ma carte-fille MIDI-ITO-HAT Modèle 2 fonctionne correctement.  😎

L’utilitaire ttyMIDI Original (Thiago Teixeira), ici utilisé avec un Raspberry Pi et pas avec un Arduino, fait bien son travail à presque 100%, aussi bien en interne avec le MIDI ALSA qu’en externe avec les MIDI-DIN IN/THRU/OUT.
Les SysEx (messages System Exclusive) ainsi que l’utilisation de JACK (serveur Audio et MIDI) restent à investiguer !
En l’état « ttyMiDI Original » correspond aux besoins de mon projet MIDI-ITO-HAT !  😎

• Serial <=> MIDI Software #2  🙁   (après coup)

Le 2ème utilitaire Serial <=> MIDI sur ma liste est The Hairless MIDI-to-Serial Bridge v.0.4. Il sera aussi testé avec MIDI-ITO-HAT Modèle 2 sous Raspberry Pi OS Buster (Debian 10 32-bit) sur Raspberry Pi 400. Apparemment, il a une structure différente de ttyMIDI et il utilise l’API bien connu RtMidi, ce qui devrait donner de bons résultats dans la gestion des messages et données MIDI conformes aux Spécifications MIDI. À voir lors des essais…

Bon ça y est, je suis à nouveau opérationel, mon RPi OS 10 32-bit est revenu à la vie avec les bonnes applications et configurations.

Mais après téléchargement et décompression, je ne peux même pas tester Hairless-MidiSerial v.0.4 car il n’y a aucun moyen de le lancer sous RPi OS 10. Après des recherches sur le web, son développeur ProjectGus le confirme malheureusement. Son utilitaire est trop vieux, donc à oublier pour l’instant.  🙁
Il travaille depuis environ Mai 2020 à rendre son projet compatible avec les distributions GNU/Linux modernes mais il fait cela sur son temps libre et il en a peu. Quand il sera prêt (aucune date de prévue), nous devrions avoir une AppImage fonctionnelle de Hairless-MidiSerial qui sera disponible pour les plateformes libres. Wait & see…

♦ RÉSUMÉ

Comme nous l’avons vu dans cet article, la réalisation par soi-même (DIY – Do It Yourself) de MIDI-ITO-HAT, une interface vintage MIDI-DIN IN/THRU/OUT à brancher sur le port GPIO à 40 broches (TXD/RXD, +3,3V/+5V, GND) des Raspberry Pi 3B+/4B/400 tournant sous Raspberry Pi OS 10 Buster 32-bit, est à la portée de tout un chacun qui possède quelques notions d’électronique et d’informatique. Le coût de revient unitaire pour le matériel de prototypage d’une carte-fille MIDI-ITO-HAT n’est que d’environ 6 € (six euros) tout compris.

Mon projet libre MIDI-ITO-HAT (MIDI – In/Thru/Out – Hardware Attached on Top) est conforme aux Spécifications électriques MIDI-DIN v.1.0 et 1.1. Il se met en action avec les utilitaires libres suivants : Overlay RPi disable-bt (désactive le BlueTooth et restaure l’UART0/ttyAMA0 sur les GPIO 14 – TXD pin #8 et GPIO 15 – RXD pin #10), Overlay RPi midi-uart0 (adapte le débit de l’UART0 de 38.400 baud à celui du MIDI de 31.250 baud), ttyMIDI Original Bridge (crée et gère une passerelle Série UART <=> MIDI ALSA) et ALSA (alsa-utils installés par défaut sur RPI OS 10).

En bref  (consultez les détails dans l’article)

  • Choisissez l’un des Modèles « 2 » (avec un même PCB et 3 possibilités de connecteur J1) -ou- Modèles « 3 » (avec un même connecteur J1 et 2 possibilités de PCB) de cartes-filles MIDI-ITO-HAT adapté à votre RPi et à votre besoin.
  • Montez les composants nécessaires sur un circuit imprimé standard de prototypage (moins cher) simple ou double face ou commandez le auprès d’un fabricant de PCB (beaucoup plus cher).
  • Sur votre RPi sous RPi OS 10 32-bit, désactivez la Console Linux avec raspi-config, ajoutez les 2 lignes dtoverlay=disable-bt et dtoverlay=midi-uart0 au fichier /boot/config.txt, et désactivez le lancement du daemon BlueTooth avec « systemctl disable hciuart ». Puis rebootez.
  • Téléchargez le fichier ttymidi.tar.gz (ttyMIDI Original Bridge), décompressez le, adaptez/modifiez ses fichiers « Makefile » (directives de compilation et autres) et « ttymidi.c » (source écrit en C) au RPi. Installez ttyMIDI sur votre RPi. Puis rebootez.
  • Connectez la carte-fille MIDI-ITO-HAT que vous venez de réaliser (Modèle 2 ou 3) avec, en fonction du modèle choisi, une nappe plate IDC ou directement au port GPIO à 40 broches de votre RPi.
  • Lancez ttyMIDI et les applications-utilitaires souhaités. Établissez les connexions MIDI internes (ALSA) avec AconnectGUI ou depuis chaque application. La configuration de ttyMIDI se fait uniquement avec AconnectGUI en mode graphique (plus facile) ou avec aconnect dans un Terminal (moins aisée).
  • Connectez vos équipements externes MIDI-DIN vintage avec des câbles MIDI-DIN 5 broches aux prises MIDI-IN/THRU/OUT de MIDI-ITO-HAT.
  • Et vous êtes maintenant prêt à jouer, enregistrer et reproduire votre musique électronique avec votre RPi !

Toutes les applications libres de musique MIDI compatibles avec ALSA sous le système d’exploitation RPi OS 10 Buster 32-bit sont capables d’exploiter les capacités de MIDI-ITO-HAT. En plus de celles utilisées dans cet article, vous pouvez consulter une liste non-exhaustive de ces applications MIDI (voire plus) dans la Logithèque de RPi OS.
Note : Prenez bien en compte la puissance de calcul et la RAM disponibles sur votre Raspberry Pi. Ne choisissez pas des applications MIDI ou MIDI/Audio qui sont gourmandes en ressources système. Par exemple, l’utilisation d’Ardour ne me semble pas être un choix judicieux pour les RPi. Préférez-lui plutôt LMMS, MusE Sequencer, MuseScore, Qtractor, Rosegarden ou d’autres, à tester sur votre machine. Et n’oubliez pas Sonic Pi qui est installée par défaut sur RPi OS 10.

ATTENTION !  😯
Utilisez les cartes-filles MIDI-ITO-HAT à vos propres risques et périls. Je n’accepterai aucune responsabilité si cela devait endommager l’un de vos équipements (Raspberry Pi, périphériques MIDI ou autres).

 

♦ 2ème Partie… à venir plus tard…

Note : Dans le prochain article sur mon projet libre MIDI-ITO-HAT (Partie 2/2), j’explorerai son utilisation avec des langages de programmation, « textuelle » comme Python et « graphique » (objets) comme Pure Data et peut-être son dérivé amélioré Purr Data