---
title: "Python para música: librosa, music21 y pretty_midi"
slug: python-para-musica
kind: guide
summary: "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."
publishedAt: 2026-08-16
updatedAt: 2026-08-16
---
**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](/blog/que-es-amt) 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](/blog/que-es-musicxml)).

```bash
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.

```python
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](/blog/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**](/concepto/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.

```python
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](/blog/midi-vs-musicxml-en-python).

## pretty_midi: el MIDI como objetos manejables

[**pretty_midi**](/concepto/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.

```python
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](/blog/cuadernos-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](/blog/que-es-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](https://doi.org/10.25080/Majora-7b98e3ed-003). *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](https://web.mit.edu/music21/). *Proceedings of the 11th International Society for Music Information Retrieval Conference (ISMIR)*.
- [Documentación oficial de music21](https://www.music21.org/music21docs/).
- Raffel, C., & Ellis, D. P. W. [pretty_midi: A Python Library for Handling MIDI Data](https://github.com/craffel/pretty-midi) — repositorio y documentación oficial.
- [Documentación oficial de librosa](https://librosa.org/doc/latest/index.html).
