Scripts MIDI-PLOT avec Python, MidO et RtMidi (4/6)

Initiation à la programmation MIDI (Musical Instrument Digital Interface) en utilisant le trio « Python – MidO – RtMidi », avec focus sur MIDI-PLOT

♦ Précision et Prérequis

MidO (Midi Objects) nous permet de travailler avec des messages MIDI directement en tant qu’objets Python. Après avoir vu « MIDI-OUT » et « MIDI-PLAY-WRITE dans deux précédents articles, ici nous continuons avec « MIDI-PLOT », et dans un prochain article nous finirons par « MIDI-IN ».

Dans cet article nous allons découvrir quelques éléments de base pour visualiser sous forme graphique des fichiers MIDI avec MidO (MIDI Objects) associé à deux bibliothèques Python.

Matplotlib une bibliothèque du langage de programmation Python destinée à tracer et visualiser des données sous formes de graphiques. Elle peut être combinée avec les bibliothèques Python de calcul scientifique NumPy et SciPy. Une illustration avec cette Galerie qui contient des exemples de nombreuses choses (images complètes avec leur code source) que nous pouvons faire avec Matplotlib.

Numpy une extension du langage de programmation Python, destinée à manipuler des matrices ou tableaux multidimensionnels ainsi que des fonctions mathématiques opérant sur ces tableaux. Plus précisément, cette bibliothèque fournit de multiples fonctions permettant notamment de créer directement un tableau depuis un fichier (comme les fichiers MIDI) ou au contraire de sauvegarder un tableau dans un fichier, et de manipuler des vecteurs, matrices et polynômes. NumPy est la base de SciPy, regroupement de bibliothèques Python autour du calcul scientifique. Tutoriel de démarrage rapide (EN) pour nous familiariser avec Numpy (et SciPy).

Matplotlib (Python3-matplotlib) et Numpy (Python3-numpy) s’installent directement depuis la Logithèque de Linux Mint.

Pour de plus amples d’informations, reportez-vous aux documentations ad-hoc ci-dessus et dans les trois liens d’articles ci-dessous.

• À lire en premier

♦ Changement d’IDE Python

Ici, nous allons quitter IDLE Python pour Spyder3, un IDE Python plus complet et optimisé pour les flux de travail sur la science des données, qui a été introduit dans mon premier article.

  • Spyder3 – 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 de fonctionnalités avancées d’édition, d’analyse, de débogage et de profilage dans 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.
    Cette dernière fonctionnalité est possible grâce à IPython son terminal interactif enrichi, ou enhanced shell, pour Python qui propose des fonctionnalités telles que l’introspection, une syntaxe additionnelle, la complétion, un historique riche et la prise en charge de la visualisation interactive des données et de l’utilisation des kits d’outils graphiques.
  • Spyder3 s’installe directement depuis la Logithèque de Linux Mint.

Logarithmic Spiral Pylab

Pour nous mettre en bouche et voir les possibilités graphiques intégrées de Syder3, prenons l’exemple d’un script graphique en 2D tiré d’une page de Wikimedia Commons, la médiathèque libre.

Le script -Logarithmic-Spiral-Pylab- dans un éditeur de texte

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
from https://commons.wikimedia.org/wiki/File:Logarithmic_Spiral_Pylab.svg?uselang=fr
"""
from pylab import *
rc('grid', color='#aaaaaa', linewidth = 1, linestyle = '-')
figure(figsize = (6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8], polar = True)
t = arange(-4 * pi, 4 * pi, .1)
polar(t, 1.19**t, linewidth = 2)
xt, yt = xticks()[0], yticks()[0]
xticks(xt, ['' for q in range(len(xt))])
yticks(yt, ['' for q in range(len(yt))])
savefig('logarithmic_spiral.jpg')
show()

Remarque : Ce script n’est pas strictement pythonique et il pourrait être amélioré un peu, mais il fonctionne correctement.

Le script -Logarithmic-Spiral-Pylab- dans Spyder3

SPYDER – IDE Python3 en action avec le module Pylab pour visualiser une spirale logarithmique. Matplotlib est le paquet entier alors que Pylab est un module de Matplotlib.

Remarque : L’IDE Spyder3 est plus adapté à la programmation MIDI avec Python et ses différentes bibliothèques que ne l’est le basique IDLE Python. Dès que nous voudrons écrire des scripts +/- complexes, comme pour le traitement en nombre et en profondeur des messages MIDI et avec représentation graphique, Spyder3 me semble être un bon choix tout en restant assez simple d’utilisation.

♦ S’il vous plaît, dessine-moi un Piano Roll MIDI !

Je me suis servi de l’excellent projet midi-visualization (légèrement modifié) de exeex du Department of Computer Science @ National Tsing Hua University – Hsinchu, Taiwan. Ce long script pourra être réutilisé, avec adaptation-modification si nécessaire, en l’intégrant dans un projet MIDI plus large.

Son script Python permet la visualisation des notes MIDI sous forme d’un Piano Roll (type séquenceur MIDI) en utilisant les bibliothèques MidO, Numpy et Matplotlab. Comme son programme roll.py, bien commenté (en anglais), fait plus de 200 lignes actives (265 au total), nous le consulterons directement sur son site.
Nous devons bien entendu installer Numpy et Matplotlib, sur notre ordinateur sous GNU/Linux, en plus de MidO déjà installé, avant d’utiliser ce script, voir plus haut.

• MIDO Visualization PianoRoll de MIDO Write Nocturne Composition File

Comment utiliser le script de exeex ?

Il suffit d’analyser le bloc principal dans son script. Nous pouvons simplement exécuter le bloc ci-dessous pour voir comment cela fonctionne avant d’utiliser le script complet.

if __name__ == "__main__":
    mid = MidiFile("test_file.mid")  # nom du fichier .mid à tester

    # obtenir la liste de tous les événements MIDI
    # events = mid.get_events()

    # obtenir le tableau np (numpy) pour l'image piano roll
    roll = mid.get_roll()

    # dessiner le piano roll par pyplot (matplotlib.pyplot)
    mid.draw_roll()

Remarque : Bien entendu ce bloc principal en tant que tel n’est pas fonctionnel car il manque toutes les déclarations préalables. Néanmoins il permet de voir dans le terminal IPython son déroulement. Pour une compréhension totale, il faudra analyser le script dans son ensemble.

Le script complet -MIDO Visualization PianoRoll- dans Spyder3

SPYDER – IDE Python3 en action avec les bibliothèques MidO, Numpy et Matplotlib pour visualiser un Piano Roll MIDI

Astuces : – Dans le script roll.py, à la ligne 253 mid = MidiFile(« test_file/1.mid »), il faut obligatoirement remplacer « test_file/1.mid » par le nom de son fichier MIDI (incluant si nécessaire le chemin du fichier).
– Le graphique obtenu en sortie du script peut être, soit inclus directement dans la console amélioré IPython de Spyder3, soit affiché dans une fenêtre indépendante comme ci-dessus. Pour ce faire, il faut modifier dans Spyder3 -> Outils -> Préférences -> Console IPython -> Onglet Graphiques -> Sortie graphique de En ligne à Automatique.

Le 1er graphique retravaillé de MIDO Visualization PianoRoll

Graphique retravaillé du Piano Roll MIDI généré par SPYDER – IDE Python3 avec les bibliothèques MidO, Numpy et Matplotlib

Remarque : Ci-dessus, j’ai ajouté les 4 lignes blanches horizontales « notes et leurs numéros MIDI » ainsi que les 5 verticales  » délimitation entre morceau / transposition d’octave » (0, -1, 0, +1, 0), et des indications pour les canaux MIDI.

Après vérification, les informations de canal unique 0 (par défaut) et de notes (entre 74 et 67 pour le morceau / octave de référence) sur le Piano Roll ci-dessus correspondent bien au script MIDO Write Nocturne Composition File présenté à la fin de mon article 3/6.

• MIDO Visualization PianoRoll de MIDO Play Midi File

Si nous avions eu des notes MIDI sur plus d’un canal, ces autres canaux (1.. 15) / notes (0.. 127) auraient été eux aussi traités et affichés par le script sur le Piano Roll MIDI et avec leurs couleurs.

En reprenant le fichier « blackvelvet.mid » dont nous nous sommes servi pour MIDI-PLAY de MidO dans mon article 3/6 nous obtenons le graphique suivant.

Le 2ème graphique retravaillé de MIDO Visualization PianoRoll

Graphique retravaillé du Piano Roll « blackvelvet.mid » généré par SPYDER – IDE Python3 avec les bibliothèques MidO, Numpy et Matplotlib

♦ Focus sur MIDI-IN

Nous allons maintenant nous intéresser aux Scripts MIDI-IN avec Python 3, MidO et RtMidi et nous servir de ce que nous avons déjà vu…

Scripts MIDI-IN avec Python, MidO et RtMidi (5/6)