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

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)

◊ Sommaire

♦ Introduction

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

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

Au départ mon projet ciblé uniquement le Raspberry Pi 400, mini-ordinateur ARM que je possède. 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 permet donc de connecter des équipements MIDI (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 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.

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 (80 x 60 mm) pour les RPi 3B+/4B/400 avec un GPIO Header adapté à chaque utilisation,
    • une HAT In/Out format standard (65 x 56 mm) pour les RPi 3B+/4B avec un GPIO Header standard, et
    • une autre HAT In/Thru/Out grand format (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 et elles 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.

– 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.

– 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.

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. Je reviendrai sur ce sujet plus loin dans l’article.

♦ 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). 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 (TX et RX), 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 préliminaire 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 | Preliminary schematic – Rev. A-1c

– L’utilisation des 2x switches SW-OFF/ON (commutateur d’alimentation Arrêt/Marche) et SW-Bus_State (commutateur de Désactivation/Activation des Bus A et B du Transceiver) n’est pas obligatoire mais cela apporte de la flexibilité pendant au moins la phase de prototypage du projet.
Note : Dans le cas de l’utilisation du SW-OFF/ON, en position OFF les pins #8/10 du GPIO au travers du IC2 alimente (~ 3V) la LED ON. On peut déplacer l’Anode de cette LED du +5V au +3.3V toujours derrière ce commutateur pour atténuer cette « anomalie ». La vraie solution est qu’en position OFF nous coupions les deux connexions TX/RX.
– L’étage de sortie R2 / R3 du Photocoupler sera peaufiné après les tests de la carte-fille.
– La valeur de 1 KΩ des 3x résistances R8 / R9 / R10 des 3x LEDs IN/THRU / OUT / ON pourra être ajustée en fonction des spécifications des LEDs utilisées pour obtenir l’intensité lumineuse désirée.
– Ce schéma préliminaire pourrait être appelé à +/- évoluer au fur et à mesure de l’avancement du projet.

• 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 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.

♦ 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 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 qui ne sont pas trop complexes.

• 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 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 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.0d

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 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 recommandé (pour soudures broches 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 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 broches 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 (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 le 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 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 après repositionnement d’un certain nombre de composants.

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

Raspberry Pi 3B+/4B uniquement
  • MIDI-ITO-HAT – Carte Format « Standard » (65 x 56 mm)
    • 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.
  • MIDI-ITO-HAT – Carte « Grand » Format (85 x 56 mm)
    • 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. 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 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 abaissement de la fréquence de l’horloge de l’UART).

  • 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 Buster ne supportant toujours pas ce débit par défaut les ingénieurs de la Fondation Raspberry Pi ont heureusement une rustine à nous proposer.
    • Faire communiquer l’UART à un débit qu’il prend en charge et proche du Baud Rate du MIDI-DIN de 31.250 baud, c’est-à-dire ici 38.400 baud. L’entrée de l’UART est une horloge à « x » MHz que nous pouvons faire varier (ici baisser) avec le paramètre init_uart_clock dans le fichier /boot /config.txt pour atteindre notre objectif.
      Affichons la Fréquence par défaut de l’horloge de l’UART (à faire avant modifications du fichier /boot/config.txt !). Dans un Terminal entrons vcgencmd measure_clock uart qui nous répond frequency(22)=48001464 soit ~ 48 MHz, ici pour un RPi 400. Cette fréquence peut être différente en fonction du modèle RPi utilisé !
      Calculons maintenant la valeur de la Fréquence de l’horloge de l’UART dont nous avons besoin pour aligner le Baud Rate TXD/RXD du RPi 400 sur celui du MIDI-DIN : 48 MHz x (31.250 Bd / 38.400 Bd) = 39,063.691 MHz soit 39.063.691 Hz.
      Ajoutons (ou modifions si existe déjà) la ligne init_uart_clock=39063691 dans le fichier /boot/config.txt.
  • 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 mes tests de la 4ème Étape ci-dessous, je reviendra sur les modifications à effectuer dans le·s fichier·s /boot/config.txt, et peut-être /boot/cmdline.txt.

Après le redémarrage du RPi 400, vérifions dans un Terminal que les modifications ont bien été appliquées.

  • Échange (swap) de /dev/ttyS0 et /dev/ttyAMA0 en entrant ls -lh /dev/serial*
    – affichait avant :
    lrwxrwxrwx 1 root root 5 sept. 13 15:44 /dev/serial0 -> ttyS0
    lrwxrwxrwx 1 root root 7 sept. 13 15:44 /dev/serial1 -> ttyAMA0
    – affiche maintenant :
    lrwxrwxrwx 1 root root 7 sept. 10 12:17 /dev/serial0 -> ttyAMA0
    lrwxrwxrwx 1 root root 5 sept. 10 12:17 /dev/serial1 -> ttyS0
  • Nouvelle horloge de l’UART en entrant vcgencmd measure_clock uart
    – affiche maintenant frequency(22)=39062988  (arrondie à partir de 39063691)

Puis comme pour la 1ère Configuration avec une résistance d’environ 680 Ω branchée entre les pin #8 et #10 du GPIO Header, on teste le bon fonctionnement de l’UART0 (PL011) : envoi TXD => réception RXD avec un petit script Python ou plus simple avec un utilitaire de communication série comme Minicom (un clone de Telix très complet en mode Terminal) ou CuteCom (similaire à Minicom en plus simple et convivial avec une interface graphique)… mais… ce dernier ne fonctionne plus avec cette 2ème Configuration ! ?

Alors utilisons Minicom dans un Terminal en entrant sudo minicom -D /dev/ttyAMA0 -b 38400. Minicom s’ouvre et tout ce que nous tapons au clavier s’affiche bien dans le Terminal Minicom. Si nous débranchons la résistance entre les pins #8 et #10 du GPIO Header du RPi, il n’y a effectivement plus aucune communication série entre le clavier et le terminal. CQFD !

♦ 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 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-OUT/IN/THRU (Pourquoi dans cet ordre ? Voir après l’image ci-dessous.) 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 Serial ⇔ MIDI compatible ALSA.

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

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

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 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é, son fichier Makefile adapté au RPi OS (voir Note 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 (normalement) aussi avec les applications MIDI. Consultez son fichier README pour en savoir plus. Ci-dessous un premier exemple d’utilisation en images.

Note : – Après la décompression du fichier ttymidi.tar.gz, il faut modifier son fichier Makefile (qui exécute un ensemble d’actions) avec un éditeur de texte où la ligne de commande sous all: devient :
    gcc src/ttymidi.c -o ttymidi -lasound -lpthread
– Et avant de lancer la compilaton de tttyMIDI, il faut installer le paquet logiciel libasound2 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/2021 : Je suis maintenant prêt à passer aux derniers tests – les RUNs…

• RUN #1 -avec- Serial <=> MIDI SW #1 : Mode Duplex ALSA
Lecture fichier MIDI => Trafic MIDI au travers MIDI-ITO-HAT (MIH) => Synthétiseur logiciel interne -et- Synthétiseurs matériel externes

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).
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 Synthétiseur matériel externe à MIDI-THRU.
Je charge un fichier MIDI, ici Aquarius.kar (format SMF – Standard MIDI File), dans DMP et je lance sa lecture.

La musique interne sur synthétiseur logiciel 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étiseurs matériel ne retentit pas car rien de cohérent ne sort par MIDI-THRU. Après plusieurs essais, rien de cohérent ne sort non plus par MIDI-OUT. Pour être plus précis, dans les 2 cas les messages et données MIDI qui sortent par MIDI-OUT et MIDI-THRU ne sont pas conformes aux Spécifications MIDI.

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

RUN #1 : Cheminement simplifié du trafic MIDI (messages et données)

Fichier MIDI (.mid ou .kar – SMF) => Drumstick Media Player => ttyMIDI / GPIO TXD => MIDI-ITO-HAT / MIDI-OUT => Câble MIDI-DIN 5 broches (rouge) => MIDI-IN / MIDI-ITO-HAT => GPIO RXD / ttyMIDI => Qsynth / MIDI SoundFont
-et-
MIDI-ITO-HAT / MIDI-THRU (copie de MIDI-IN) => Câble MIDI-DIN 5 broches (noir) => MIDI-IN / Synthétiseurs externes (Yamaha CBX-T3 et TG100 ainsi que quelques autres)

RUN #1 : RÉSULTATS en DEMI-TEINTES !
Ma carte-fille MIDI-ITO-HAT Modèle 2 fonctionne correctement.  😎

MAIS l’utilitaire ttyMIDI Original (Thiago Teixeira), ici utilisé avec un Raspberry Pi et pas avec un Arduino, ne fait son travail qu’à environ 50%  (presque 100 % en interfaçage avec des logiciels MIDI internes mais proche de 0 % en interfaçage avec des périphériques MIDI externes). Cela semble provenir des choix / adaptations (gestion des messages / données MIDI) que son développeur a implémentés dans son logiciel (voir détails sur son site web) qui ne sont pas à 100 % en conformité avec les Spécifications MIDI v.1.0 et 1.1. En l’état « ttyMiDI Original » ne correspond pas à mes besoins. 🙁

J’ai essayé un Autre ttyMIDI (smbaker), dérivé de ce ttyMIDI Original, qui se dit être plus performant mais dans la réalité les résultats sont pires. Je ne prendrai donc pas la peine de développer ici toutes mes manipulations avec cet Autre ttyMIDI. Cet utilitaire est aussi à oublier.  🙁

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 (~ 30 minutes pour dupliquer à l’identique une µSD Card ou clé USB de 64 Go). 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 !

• 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 personnel 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…

• Serial <=> MIDI Software #3 ?

Le 3ème utilitaire Serial <=> MIDI sur ma liste est Serial – MIDI Converter v.2d. Il utilise Processing et 2 bibliothèques clés Processing Serial Library et The MidiBus.
Mais soyons prudents car son développeur écrit clairement qu’il n’a pas testé son logiciel sous Linux même si il est disponible sous ce système, et qu’il y a de fortes limitations des messages MIDI supportés quel que soit le système d’exploitation utilisé. Alors ? Analyse et tests à venir…

Je continue ma quête du Saint-Graal « Serial <=> MIDI » pour Raspberry Pi…

• À SUIVRE tôt ou tard…

En attendant, je continue à utiliser mes Interfaces USB/MIDI-DIN Class Compliant du commerce – M-Audio MidiSport UNO et Roland UM-ONE MK2 – qui fonctionnent très bien avec mon Raspberry Pi 400, mais sans le fun du DIY.

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…

• Configuration MIDI du Raspberry Pi pour l’utilisation en MiAO (Musique Interactive Assistée par Ordinateur) du MIDI-ITO-HAT

Comme aucun des logiciels Serial <=> MIDI ne donne satisfaction (voir plus haut), je réfléchis à utiliser la bibliothèque PiGPIO (python3-pigpio-1.79) au lieu de RPi.GPIO (python3-rpi.gpio-0.7.0) pour interfacer mon projet MIDI-ITO-HAT avec les broches TXD (Midi-Out) / RXD (Midi-In) du GPIO Header.

Je suis aussi en cours d’analyse des différents logiciels libres disponibles pour gérer les messages MIDI / UART avec un Raspberry Pi 400 sous Raspberry Pi OS Buster 32-bit (Debian 10).

Parmi ceux-ci, en utilisant Python 3 standard, il y a MidO (python3-midi-1.2.9) – MIDI Objects Library for Python – qui est une bibliothèque facile à utiliser pour gérer les données MIDI. Elle s’appuie sur le backend temps réel RtMidi (python3-rtmidi-1.2.3),  la bibliothèque asound (ALSA) et le serveur de son JACK.

Il y a aussi Adafruit CircuitPython, un Python basé sur MicroPython, avec son Adafruit MIDI Library (adafruit-circuitpython-midi 1.4.2), un assistant CircuitPython pour l’encodage et le décodage des paquets MIDI via une connexion MIDI ou UART.

Certains de ces logiciels / bibliothèques sont déjà installés par défaut sur les RPi ou disponibles en tant que paquets logiciels compilés dans la Logithèque de Raspberry Pi OS ou depuis PyPi (le dépôt officiel Python Package index).

Une liste non-exhaustive de logiciels de musique, pas que MIDI, écrits en Python :

J’utiliserai aussi Pure Data (Pd), un environnement de programmation graphique temps réel pour la création multimédia (Audio / Vidéo / Graphique) dont la Musique interactive Assistée par Ordinateur (MiAO / MIDI). Cette application libre est actuellement disponible (qu’)en version 0.49.0 dans la Logithèque de RPi OS 10 Buster. Lors de l’installation d’objets supplémentaires (externals) il faut faire attention à choisir que des externals (bibliothèques externes comme Cyclone, Gem, IemLib, Zexy et autres) qui sont bien compatibes avec cette version de Pure Data !