Guide · Informatique musicale
Python pour la musique: librosa, music21 et pretty_midi
Un langage, trois boîtes à outils : librosa regarde l'audio, music21 la partition et pretty_midi le MIDI. Ce que fait chaque bibliothèque et quand l'utiliser.
Python est le langage de référence en informatique musicale, mais ce n’est pas une seule bibliothèque : c’est un écosystème de pièces spécialisées qui ne se recoupent pas. Quand quelqu’un me demande « quelle bibliothèque j’utilise pour travailler avec la musique en Python ? », la réponse courte est toujours une autre question : regardez-vous le son enregistré, la partition écrite, ou un fichier MIDI ? Chaque réponse mène à une bibliothèque différente — librosa, music21 ou pretty_midi — et ce guide est la carte des trois : ce que fait chacune, quand utiliser chacune et comment elles se combinent dans un flux de travail réel.
La carte : trois bibliothèques, trois plans de la musique
Avant le code, il convient de fixer l’idée de fond. La musique peut se regarder sur au moins trois plans distincts, et chaque bibliothèque vit sur l’un d’eux :
| Bibliothèque | Plan | Ce qu’elle gère |
|---|---|---|
| librosa | Audio (signal) | Forme d’onde, spectrogrammes, caractéristiques spectrales |
| music21 | Partition (symbole) | Notes, mesures, tonalité, analyse harmonique, MusicXML |
| pretty_midi | MIDI (événement) | Notes comme objets avec hauteur, temps et vélocité, fichiers .mid |
Ce ne sont pas des alternatives entre elles : elles sont complémentaires. Un
flux de travail typique de
transcription musicale automatique part de l’audio
(librosa pour l’explorer), passe par une représentation d’événements note
par note (pretty_midi pour gérer le résultat en MIDI) et peut se terminer
en partition lisible (music21 pour l’exporter en
MusicXML).
pip install librosa music21 pretty_midi
librosa : l’audio comme signal
librosa travaille sur la forme d’onde : l’audio tel que le capte un microphone, avant de savoir quelles notes il contient. Elle charge un fichier, calcule des spectrogrammes, extrait des caractéristiques spectrales (MFCC, chroma) et détecte les onsets et le tempo.
import librosa
y, sr = librosa.load("extracto.mp3")
tempo, _ = librosa.beat.beat_track(y=y, sr=sr)
print(f"Frecuencia de muestreo: {sr} Hz")
print(f"Tempo estimado: {tempo:.1f} BPM")
librosa.load renvoie la forme d’onde comme tableau numpy (y) et sa
fréquence d’échantillonnage (sr) ; à partir de là, tout le reste de la
bibliothèque — spectrogrammes, MFCC, détection de battements — opère sur
ces deux valeurs. J’ai déjà consacré un tutoriel complet à cette
bibliothèque, avec le pas à pas du calcul d’un spectrogramme réel à partir
d’un enregistrement de cornemuse :
Comment calculer un spectrogramme avec librosa.
Ici il suffit de la situer sur la carte : c’est la porte d’entrée quand le
point de départ est l’audio, ni la partition ni le MIDI.
music21 : la partition comme symbole
music21 est la bibliothèque Python du MIT pour la musicologie computationnelle. Elle ne regarde pas le signal audio : elle regarde la partition, sur son plan symbolique — notes, mesures, tonalité, doigté, dynamique. Elle lit et écrit le MusicXML, le MIDI et d’autres formats de notation, ce qui en fait l’outil habituel pour l’analyse de corpus musicaux et la théorie musicale computationnelle en code.
from music21 import corpus, key
# Corpus de ejemplo que trae music21 (un coral de Bach)
sinfonia = corpus.parse("bach/bwv66.6")
# Estimación de tonalidad a partir del análisis armónico
tonalidad = sinfonia.analyze("key")
print(f"Tonalidad estimada: {tonalidad}")
for nota in sinfonia.flatten().notes[:5]:
print(nota.nameWithOctave, nota.quarterLength)
corpus.parse charge l’une des partitions d’exemple installées avec
music21 — des chorals de Bach entre autres ; analyze("key") applique un
algorithme d’estimation de tonalité sur les notes du morceau ;
flatten().notes parcourt les notes une à une avec leur hauteur
(nameWithOctave) et leur durée (quarterLength). Rien de tout cela ne
passe par l’audio : toute l’analyse se fait sur la partition déjà codée.
Cette capacité à lire et écrire du MusicXML est celle que j’utilise pour comparer, avec des données réelles, quelle information de notation survit à l’exportation d’une même phrase musicale vers différents formats : MIDI vs MusicXML en Python : ce qui subsiste.
pretty_midi : le MIDI comme objets manipulables
pretty_midi ferme la carte : elle travaille avec des fichiers MIDI
au niveau du programme. Elle charge un .mid et expose ses notes, ses
instruments, ses control changes et ses changements de tempo comme des
objets Python faciles à parcourir, au lieu d’octets bruts du protocole.
import pretty_midi
pm = pretty_midi.PrettyMIDI("ejemplo.mid")
for instrumento in pm.instruments:
print(f"Instrumento: {instrumento.program}")
for nota in instrumento.notes[:5]:
print(
f" pitch={nota.pitch} "
f"start={nota.start:.2f} end={nota.end:.2f} "
f"velocity={nota.velocity}"
)
Chaque note porte sa hauteur MIDI (pitch, 0-127), son début et sa fin en
secondes — pas en mesures ni en valeurs de notes, comme dans music21 —
et son intensité (velocity). C’est là la différence de fond avec
music21 : pretty_midi décrit une interprétation temporisée, pas une
partition avec mesures et doigté. C’est l’outil habituel pour générer le
MIDI de sortie dans les systèmes de transcription musicale automatique et
pour évaluer une transcription en comparant des événements note par note à
une référence.
Quand utiliser chacune
La question de départ décide de la bibliothèque :
- Je veux analyser ou transformer de l’audio enregistré ?
librosa: spectrogrammes, MFCC, détection d’onsets et de tempo, extraction de caractéristiques. - Je veux travailler avec la partition — tonalité, mesures, doigté — ou
exporter vers MusicXML ?
music21: analyse harmonique, génération de notation, musicologie computationnelle. - Je veux lire, générer ou éditer un fichier MIDI au niveau de la note,
de l’instrument ou du tempo ?
pretty_midi: la couche d’abstraction sur le protocole MIDI qui rend maniable le travail avec lui en code.
En pratique, on n’en choisit pas une seule : dans un même cahier de
recherche, il est courant d’utiliser librosa pour explorer l’audio
d’entrée, pretty_midi pour gérer la sortie d’un modèle de transcription
et music21 pour convertir cette sortie en une partition lisible. Les
trois s’accordent bien avec Jupyter,
l’environnement habituel de ce type de travail exploratoire : charger,
transformer et voir le résultat dans le même document sans monter un
programme à part.
Où cela s’inscrit dans le MIR
Les trois bibliothèques — et Python lui-même comme langage de facto — sont
des outils de travail dans le champ du
Music Information Retrieval
(MIR) : l’étude de comment extraire, organiser et récupérer de
l’information à partir de signaux musicaux, en audio ou sous forme
symbolique. librosa couvre le côté du signal ; music21 et
pretty_midi, le côté symbolique — partition et MIDI, respectivement.
Aucune ne fait de MIR à elle seule : elles sont le vocabulaire dans lequel
s’implémentent ses tâches, de la reconnaissance d’accords à la
transcription musicale automatique.
Bibliographie
Les références sur lesquelles s’appuie cet article, et par où poursuivre la lecture :
- McFee, B., Raffel, C., Liang, D., Ellis, D. P. W., McVicar, M., Battenberg, E., & Nieto, O. (2015). librosa: Audio and Music Signal Analysis in Python. Proceedings of the 14th Python in Science Conference, 18–24.
- Cuthbert, M. S., & Ariza, C. (2010). music21: A Toolkit for Computer-Aided Musicology and Symbolic Music Data. Proceedings of the 11th International Society for Music Information Retrieval Conference (ISMIR).
- Documentation officielle de music21.
- Raffel, C., & Ellis, D. P. W. pretty_midi: A Python Library for Handling MIDI Data — dépôt et documentation officielle.
- Documentation officielle de librosa.