Introduction à la programmation MIDI avec Python, MidO et RtMidi (1/6)

Nous allons découvrir le trio « Python – MidO – RtMidi », puis nous l’utiliserons pour nous initier à la programmation MIDI (Musical Instrument Digital Interface)

♦ Préambule

PYTHON — Pour profiter au mieux de cet article et des suivants, il est nécessaire d’avoir quelques connaissances en programmation informatique et de connaître au moins les bases de PYTHON, un langage de programmation objet interprété, multi-paradigme et multi-plateformes.

Python est un langage qui peut s’utiliser dans de nombreux contextes et s’adapter à tout type d’utilisation grâce à des bibliothèques spécialisées comme MidO (voir plus loin dans l’article). Il est cependant particulièrement utilisé comme langage de script pour automatiser des tâches simples mais fastidieuses, comme un script qui récupérerait la météo sur Internet ou qui s’intégrerait dans un logiciel de conception assistée par ordinateur (MAO – MIDI) afin d’automatiser certains enchaînements d’actions répétitives. On l’utilise également comme langage de développement de prototype lorsqu’on a besoin d’une application fonctionnelle avant de l’optimiser avec un langage de plus bas niveau. Il est particulièrement répandu dans le monde scientifique, et possède de nombreuses bibliothèques optimisées destinées au calcul numérique.

Le MIDI (Musical Instrument Digital Interface) est utilisé pour la MAO (Musique assistée par ordinateur) et d’autres applications

♦ MIDI au cadran de notre montre

Le Musical Instrument Digital Interface (FR) ou MIDI (EN plus complet) est un protocole de communication -ET- un format de fichier dédiés à la musique numérique, et utilisés pour la communication entre instruments électroniques, contrôleurs, séquenceurs, et logiciels de musique.
La Musique assistée par ordinateur (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 ou aux instruments.
Le MIDI est à la base de toute la MAO.

• Rappel sur les Messages MIDI

La spécification MIDIStandard MIDI-File Format Spec. 1.1, updated (PDF) – est divisée en deux sections principales, l’une est appelée Channel messages (Messages de Canal) et l’autre est appelée System messages (Messages Système). Chaque câble MIDI envoie 16 canaux d’informations et les messages de canal sont des messages qui affectent chaque canal indépendamment l’un de l’autre, les messages système sont des messages qui affectent l’ensemble du module MIDI.

  • CHANNEL Messages sont des messages qui affectent chaque canal indépendamment les uns des autres (0.. 15).
    • VOICE : Note on (0.. 127), Note off (0.. 127), Polyphonic aftertouch, Control change (0.. 127), Program change (0.. 127), Channel aftertouch (0.. 127), Pitch bend (0.. 16383)
    • MODE : Ces messages de mode sont les seuls messages de canal qui affectent l’ensemble du périphérique MIDI et ne sont pas spécifiques à un canal. Ce sont des messages de changement de contrôle (120.. 127).
      • All Notes Off = envoie un message Notes off à toutes les notes sur tous les canaux
      • Omni Off = un appareil ne répond qu’à un seul canal MIDI prédéterminé
      • Omni On = un appareil répond à tous les canaux MIDI
  • SYSTEM Messages des messages qui affectent l’ensemble du module MIDI (exception Mode OMNI-ON Channel messages)
    • SYSTEM Exclusive (F0/F7)
    • SYSTEM common (F1/F2/F3/F6)
    • SYSTEM real-time (F8/FA/FB/FC/FE/FF)

♦ De quoi avons-nous besoin, au minimum ?

1. Ordinateur tournant sous une distribution GNU/Linux

J’utilise ici la distribution Linux MINT 19.1 Cinnamon 64-bit mais toute autre distribution GNU/Linux avec ses spécificités fera tout aussi bien l’affaire, comme Arch, Debian, Fedora, Manjaro, openSuse, Ubuntu, et leurs variantes – dérivées, etc. Le libre choix est définitivement votre !

2. Python 3.x

Python est installé par défaut en versions 2.x et 3.x sur toutes les bonnes distributions qui se respectent. Néanmoins, Python 2.x n’est plus du tout recommandé pour de nouveaux développements. Il faudra maintenant utiliser Python 3.x. Sur Linux MINT 19.1, Python3 est actuellement en version 3.6.7. Python 3.7 est en train d’arriver.

  • Documentation officielle Python 3.6 (FR) – Commencez en lisant d’abord le Tutoriel.
  • Python 3 – Apprendre à programmer (avec le serpent) / de Gérard Swinnen, 3ème édition, Janvier 2012, 473 pages au format PDF
    Ce cours expérimental s’efforce de présenter l’apprentissage de la programmation sous une forme attrayante, avec de nombreux exemples et exercices graphiques. Distribué de manière tout à fait classique en librairie, il vous est également proposé ci-dessus en téléchargement gratuit, aux termes d’un accord passé avec l’éditeur Eyrolles.

3. Python IDE (Integrated Development Environment)

Nous pouvons utiliser un couple Éditeur de texte simple (mais avec coloration syntaxique Python) + un Émulateur de terminal (en tant que console Python). Sous Linux MINT, cela donne Xed (2.0.2) et Terminal de GNOME (3.28.1).

Une alternative plus performante – mais beaucoup plus-trop complexe – pourrait être l’utilisation de Vim 8.0, un éditeur de texte « hautement configurable » qui prend en charge des centaines de langages de programmation et de formats de fichiers. Il est inclus en tant que « vi » – vim-tiny version minimaliste pour console – avec la plupart des systèmes UNIX et macOS. Sous Linux MINT, il faudra installer son interface graphique Vim-Gnome pour essayer d’exploiter toutes ses possibilités. En fait, c’est une vraie fausse bonne idée car c’est usine à gaz qui n’est pas du tout adaptée à celles et ceux qui débutent avec la programmation, que ce soit en Python ou autres !

Le bon compromis est l’utilisation d’un logiciel IDE Python intégrant les deux outils Éditeur de texte avec coloration syntaxique + Émulateur de terminal plus d’autres fonctionnalités très utiles, comme un Débogueur. Il existe un offre assez large sous GNU/Linux du plus simple au plus compliqué et performant.

IDLE est l’environnement de développement et d’apprentissage intégré de Python

Dans cet article et les suivants, nous allons principalement utiliser IDLE (Integrated Development & Learning Environment) développé par l’équipe Python. Il est intégralement écrit avec Python et la bibliothèque graphique Tkinter. Ce dernier pourra aussi être utilisé lorsque nous aurons besoin – voudrons ajouter facilement une interface graphique à nos scripts Python 3.
IDLE3 (3.6.7) s’installe directement depuis le Gestionnaire de logiciels (Logithèque) de Linux MINT.

Les principales fonctionnalités de IDLE3 sont :
Puis plus tard, une fois IDLE et la programmation en Python +/- maîtrisée, d’autres IDE plus complets, voire spécialisés, nous tendent les bras, comme :
  • Eclipse PyDev – A Python IDE for Eclipse, mais nécessite l’installation d’Eclipse Platform
    PyDev est un EDI Python pour Eclipse, qui peut être utilisé dans les développements Python, Jython et IronPython.
  • Eric Python IDE – A full featured Python editor and IDE
    Eric est un éditeur Python et EDI complet, écrit en Python. Il est conçu pour être utilisé comme éditeur rapide et flexible, ainsi que comme outil de gestion de projet professionnel intégrant de nombreuses fonctionnalités avancées que Python offre au codeur professionnel.
  • PyCharm Community – The Python IDE for Individual Developers
    PyCharm est un EDI Python pour les développeurs professionnels et les autres. Ses principales caractéristiques sont : un Assistant de codage intelligent, des Outils de développement intégrés, un Framework de développement Web Python et des Outils scientifiques.
  • Spyder – The Scientific PYthon Development EnviRonment
    Spyder est un environnement scientifique puissant écrit en Python, pour Python, et conçu par et pour les scientifiques, les ingénieurs et les analystes de données. Il offre une combinaison unique des fonctionnalités avancées d’édition, d’analyse, de débogage et de profilage d’un outil de développement complet avec l’exploration de données, l’exécution interactive, l’inspection approfondie et les superbes capacités de visualisation d’un progiciel scientifique.
  • Ces cinq IDE sont disponibles depuis la Logithèque de Linux Mint.

NB : Attention à l’utilisation des FlatPaks (FlatHub) ou équivalents « Tout-en-un » qui demandent trop souvent plusieurs Gigaoctets d’espace disque quand leurs équivalents Paquets logiciels traditionnels ne demandent que de quelques dizaines à quelques centaines de Mégaoctets ! Ne choisissez la version FlatPak ou équivalents (AppImages, etc.) que si vous avez vraiment-vraiment besoin de la toute dernière version du logiciel et si vous avez assez d’espace disque disponible.

4. Python-MidO (v.1.2.9) – MIDI Objects for Python
Le sésame pour la programmation MIDI en Python

MidO (PyPi.org) est une bibliothèque pour travailler avec les messages et les ports MIDI en tant qu’objets Python. Il est conçu pour être aussi simple et pythonique que possible. MidO est livré avec plusieurs backends MIDI, RtMidi (python-rtmidi) utilisé par défaut et recommandé, et aussi PortMidi et Pygame.
MidO cible les versions 2.7 et 3.2 de Python mais il fonctionne correctement aussi avec Python 3.2+.
Python3-Mido 1.2.7 s’installe directement depuis la Logithèque de Linux MINT.

Programmes inclus dans MidO :
  • mido-play : lit un ou plusieurs fichiers MIDI,
  • mido-ports : répertorie les ports MIDI d’entrée (Input) et de sortie (Ouput) disponibles et affiche les variables d’environnement ainsi que le module backend actuel,
  • mido-serve : sert un ou plusieurs ports sur le réseau, et
  • mido-connect : transfère tous les messages qui arrivent sur un ou plusieurs ports vers un serveur.
MidO Documentation – Latest release (version la plus récente)

5. Python-RtMidi (v.1.1.2) – API Python pour la bibliothèque RtMidi C++
L’interface MIDI d’arrière-plan de MidO

Python-RtMidi (PyPi.org) est une liaison Python pour RtMidi implémentée à l’aide de Cython et fournit un wrapper fin autour de l’interface C++ de RtMidi. L’API est fondamentalement identique à celle écrit en C++, mais avec le schéma de nommage des classes, méthodes et paramètres adapté aux conventions Python PEP-8 (Style Guide for Python Code) et aux exigences de la structure de nommage des packages Python.
Python-RtMidi prend en charge Python 2 (testé avec Python 2.7) et Python 3 (3.4, 3.5, 3.6 et 3.7).
Python3-RtMidi 1.1.0 s’installe directement depuis la Logithèque de Linux MINT.

♦ Programmer ses premiers scripts MIDI avec Python3, Python3-MidO et Python3-RtMidi

Dans mes prochains articles, nous verrons comment

  • Configurer tout ce qui est nécessaire sur son ordinateur,
  • Identifier et utiliser les ports MIDI-OUT et MIDI-IN de son ordinateur,
  • Écrire et lire des messages MIDI,
  • Jouer des fichiers MIDI (*.mid), et
  • Un certain nombre d’autres choses.
  • Ces articles seront organisés par thème :
    • MIDI-OUTPUT – pour vérifier sa configuration PC et aussi le plus facile à mettre en œuvre,
    • MIDI-PLAY et MIDI-WRITE – pour se faire plaisir rapidement,
    • MIDI-PLOT – à quoi peut ressembler le MIDI en représentation graphique, et
    • MIDI-INPUT – le plus complexe et intéressant pour le traitement des messages.

Un avant goût de ce qui nous attend… ici MIDI-IN (5/6)

Un exemple de configuration utilisée dans le cadre de l’écriture et tests d’un script MIDI-IN en Python3 – MidO – RtMidi sous GNU/Linux

En plus du trio logiciel « Python – MidO – RtMidi », nous avons bien sur aussi besoin :

  • d’un Clavier maître MIDI (pour générer – recevoir des séquences de notes – contrôles MIDI), et
  • d’un synthétiseur [synthé] MIDI (instrument de musique électronique logiciel ou matériel capable de créer et de moduler des sons sous forme de signal électrique à partir de messages MIDI).
  • Ils sont installés (logiciels) dans un premier temps à l’intérieur de l’ordinateur (par commodité), puis à l’extérieur en fonction des équipements disponibles et des besoins de chacun.
Pour démarrer mes tests, j’ai donc choisi :
  • VMPK (Virtual Midi Piano Keyboard), et
  • le couple Qsynth/FluidSynth pour gérer les SoundFonts libres (d’un centaine de mégaoctets à plus d’un gigaoctet).

VMPK, Qsynth/FluidSynth et la fonte sonore bien connue FluidR3_GM.sf2 sont installés directement depuis la Logithèque de Linux MINT. Cinq autres fontes sonores .sf2 sont téléchargées depuis Internet et installées sur mon ordinateur.

SoundFont ou AWE SoundFont est une format de fichier de fonte sonore mise au point par la société E-mu pour Creative Labs, permettant de stocker dans un fichier au format .sbk (pour SoundFont Bank) puis .sf2 (pour SoundFont Bank v.2) des échantillons au format WAV, puis de les organiser sous forme d’instruments MIDI, afin que ceux-ci puissent être utilisés sur un synthétiseur dit à tables d’ondes.

Pour être tout à fait complet

  • Il faut absolument donner la TOP priorité système à l’Audio en installant directement depuis la Logithèque QjackCtl (une application graphique permettant de contrôler le démon du serveur de son JACK (JACK Audio Connection Kit)).
    Nous pourrions nous passer de QjackCtl/JACK si nous utilisions par défaut l’Audio ALSA, mais alors il y a de très forts risques d’interférences – parasitages sonores (en fonction de ce qui est fait sur le PC) et donc de détérioration de l’Audio !
  • Enfin, il n’y a rien de mieux que de voir la représentation graphique en temps réel des connexions MIDI et Audio entre les ports des différents logiciels – matériels. Pour cela, nous installerons directement depuis la Logithèque Patchage, une baie de brassage modulaire graphique pour les systèmes Audio et MIDI basés sur Jack et Alsa.
    • QjackCtl possède aussi un puissant Éditeur de baie de brassage graphique qui peut-être utiliser seul ou en complément de Patchage, selon les besoins et préférences de l’utilisateur.

Un exemple d’utilisation de Patchage dans le cadre de l’écriture d’un script Python3 – MidO – RtMidi sous GNU/Linux

♦ Focus sur MIDI-OUT

MidO (Midi Objects) nous permet de travailler avec des messages MIDI directement en tant qu’objets Python.

Nous allons débuter avec « MIDI-OUT » car il est plus facile à mettre en œuvre et surtout à traiter que « MIDI-IN »…

⇒ Lire la suite : Scripts MIDI-OUT avec Python, MidO et RtMidi (2/6)