Tever
ES

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.

Logo de Python en el centro rodeado de formas de onda de audio, un espectrograma, una partitura impresa y un fragmento de código con librosa, music21 y pretty_midi, con los logotipos de las tres librerías en la parte inferior, sobre fondo oscuro.

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íaPlanoQué maneja
librosaAudio (señal)Forma de onda, espectrogramas, características espectrales
music21Partitura (símbolo)Notas, compases, tonalidad, análisis armónico, MusicXML
pretty_midiMIDI (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: