Guía · Informática Musical
Python para música: librosa, music21 y pretty_midi
Un mismo lenguaje, tres cajas de herramientas: librosa mira el audio, music21 la partitura y pretty_midi el MIDI. Qué hace cada librería y cuándo usar cada una.
Python es el lenguaje de referencia en informática musical, pero no es una librería sola: es un ecosistema de piezas especializadas que no se solapan. Cuando alguien me pregunta “¿qué librería uso para trabajar con música en Python?”, la respuesta corta es siempre otra pregunta: ¿estás mirando el sonido grabado, la partitura escrita, o un fichero MIDI? Cada respuesta lleva a una librería distinta —librosa, music21 o pretty_midi— y esta guía es el mapa de las tres: qué hace cada una, cuándo usar cada una y cómo se combinan en un flujo de trabajo real.
El mapa: tres librerías, tres planos de la música
Antes del código, conviene fijar la idea de fondo. La música se puede mirar en al menos tres planos distintos, y cada librería vive en uno:
| Librería | Plano | Qué maneja |
|---|---|---|
| librosa | Audio (señal) | Forma de onda, espectrogramas, características espectrales |
| music21 | Partitura (símbolo) | Notas, compases, tonalidad, análisis armónico, MusicXML |
| pretty_midi | MIDI (evento) | Notas como objetos con pitch, tiempo y velocidad, ficheros .mid |
No son alternativas entre sí: son complementarias. Un flujo típico de
transcripción automática de música parte de audio
(librosa para explorarlo), pasa por una representación de eventos nota a
nota (pretty_midi para manejar el resultado en MIDI) y puede terminar en
partitura legible (music21 para exportarla a
MusicXML).
pip install librosa music21 pretty_midi
librosa: el audio como señal
librosa trabaja sobre la forma de onda: el audio tal como lo captura un micrófono, antes de saber qué notas contiene. Carga un fichero, calcula espectrogramas, extrae características espectrales (MFCCs, chroma) y detecta onsets y 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 devuelve la forma de onda como array de numpy (y) y su
frecuencia de muestreo (sr); a partir de ahí, todo el resto de la librería
—espectrogramas, MFCCs, detección de beats— opera sobre esos dos valores. Ya
dediqué un tutorial completo a esta librería, con el paso a paso de calcular
un espectrograma real a partir de una grabación de gaita:
Cómo calcular un espectrograma con librosa.
Aquí basta con situarla en el mapa: es la puerta de entrada cuando el punto de
partida es audio, no partitura ni MIDI.
music21: la partitura como símbolo
music21 es la librería de Python del MIT para musicología computacional. No mira la señal de audio: mira la partitura, en su plano simbólico —notas, compases, tonalidad, digitación, dinámica—. Lee y escribe MusicXML, MIDI y otros formatos de notación, lo que la hace la herramienta habitual para análisis de corpus musicales y teoría musical computacional en código.
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 carga una de las partituras de ejemplo que se instalan con
music21 —corales de Bach entre ellas—; analyze("key") aplica un algoritmo
de estimación de tonalidad sobre las notas de la pieza; flatten().notes
recorre las notas una a una con su altura (nameWithOctave) y duración
(quarterLength). Nada de esto pasa por audio: todo el análisis ocurre sobre
la partitura ya codificada.
Esa capacidad de leer y escribir MusicXML es la que uso para comparar, con datos reales, qué información de notación sobrevive al exportar una misma frase musical a distintos formatos: MIDI vs MusicXML en Python: qué se pierde y qué no.
pretty_midi: el MIDI como objetos manejables
pretty_midi cierra el mapa: trabaja con ficheros MIDI a nivel de
programa. Carga un .mid y expone sus notas, instrumentos, control changes
y cambios de tempo como objetos Python fáciles de recorrer, en vez de bytes
crudos del protocolo.
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}"
)
Cada nota trae su altura MIDI (pitch, 0-127), su inicio y fin en
segundos —no en compases ni figuras, como en music21— y su intensidad
(velocity). Esa es la diferencia de fondo con music21: pretty_midi describe
una interpretación temporizada, no una partitura con compases y
digitación. Es la herramienta habitual para generar el MIDI de salida en
sistemas de transcripción automática de música y para evaluar una
transcripción comparando eventos nota a nota contra una referencia.
Cuándo usar cada una
La pregunta de partida decide la librería:
- ¿Quiero analizar o transformar audio grabado?
librosa: espectrogramas, MFCCs, detección de onsets y tempo, extracción de características. - ¿Quiero trabajar con la partitura —tonalidad, compases, digitación— o
exportar a MusicXML?
music21: análisis armónico, generación de notación, musicología computacional. - ¿Quiero leer, generar o editar un fichero MIDI a nivel de nota,
instrumento o tempo?
pretty_midi: la capa de abstracción sobre el protocolo MIDI que hace manejable trabajar con él en código.
En la práctica no se elige una sola: en un mismo cuaderno de investigación es
habitual usar librosa para explorar el audio de entrada, pretty_midi para
manejar la salida de un modelo de transcripción y music21 para convertir
esa salida en una partitura legible. Las tres se llevan bien con
Jupyter, el entorno habitual de este tipo de
trabajo exploratorio: cargar, transformar y ver el resultado en el mismo
documento sin montar un programa aparte.
Dónde encaja esto en el MIR
Las tres librerías —y el propio Python como lenguaje de facto— son
herramienta de trabajo dentro del campo del
Music Information Retrieval
(MIR): el estudio de cómo extraer, organizar y recuperar información a
partir de señales musicales, en audio o en forma simbólica. librosa cubre
el lado de la señal; music21 y pretty_midi, el lado simbólico —partitura
y MIDI, respectivamente—. Ninguna hace MIR por sí sola: son el vocabulario en
el que se implementan sus tareas, desde el reconocimiento de acordes hasta la
transcripción automática de música.
Bibliografía
Las referencias en las que se apoya este artículo y por dónde seguir leyendo:
- 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).
- Documentación oficial de music21.
- Raffel, C., & Ellis, D. P. W. pretty_midi: A Python Library for Handling MIDI Data — repositorio y documentación oficial.
- Documentación oficial de librosa.