Tutorial · Llaboratoriu DIY
MIDI vs MusicXML en Python: qué se pierde y qué non
Un esperimentu con music21 y pretty_midi: la mesma frase con dixitación, lligadura y dinámica, esportada a MIDI y a MusicXML. Qué sobrevive en cada formatu, con cifres reales.
MIDI ye’l formatu que tol mundu que dalguna vegada tocó con un tecláu electrónicu conoz, aunque seya d’oyíes. MusicXML conócelu muncha menos xente, y sicasí hai una entruga que asoma en cuanto fai falta daqué más qu‘“asonar”: ¿y si lo que fai falta ye la partitura, non el soníu? Dixitación, lligadures, matices de dinámica —too eso que un intérprete llee y un ordenador pue necesitar caltener—. Esti tutorial nun esplica otra vuelta qué ye cada formatu —pa eso tán ¿Qué ye MIDI? y ¿Qué ye MusicXML?— sinón que lo demuestra: constrúi la mesma frase musical una sola vegada, esporta la a los dos formatos y comprueba, con datos reales, qué sobrevive en cada ún.
L’esperimentu
La idea ye cenciella: escribir una frase curtia con music21 —dixitación en cada nota, una lligadura y una marca de dinámica incluyíes— y esportala dos vegaes, una a MusicXML y otra a MIDI. Dempués, lleer cada ficheru de vuelta y ver qué queda.
from music21 import stream, note, meter, tempo, dynamics, articulations, spanner, clef
s = stream.Part()
s.append(clef.TrebleClef())
s.append(meter.TimeSignature('4/4'))
s.append(tempo.MetronomeMark(number=100))
n1 = note.Note('C5', quarterLength=1)
n1.articulations.append(articulations.Fingering(1))
n2 = note.Note('E5', quarterLength=1)
n2.articulations.append(articulations.Fingering(3))
n3 = note.Note('G5', quarterLength=0.5)
n3.articulations.append(articulations.Fingering(5))
n4 = note.Note('E5', quarterLength=0.5)
n4.articulations.append(articulations.Fingering(3))
n1.dynamic = dynamics.Dynamic('mp')
slur = spanner.Slur(n3, n4)
s.append(n1); s.append(n2); s.append(n3); s.append(n4)
s.insert(0, dynamics.Dynamic('mp'))
s.insert(0, slur)
s.write('musicxml', fp='ejemplo.musicxml')
s.write('midi', fp='ejemplo.mid')
Cuatro notes —Do5, Mi5, Sol5, Mi5—, cada una col so deu indicáu, les dos últimes lligaes ente sí y tola frase marcada mezzopiano. Nada exóticu: ye exactamente’l tipu d’información qu’un intérprete espera ver imprentada nuna partitura.

Lleendo el MIDI de vuelta
Con pretty_midi pue abrise ejemplo.mid y llistar les notes tal como
quedaron codificaes:
pitch=72 start=0.00 end=0.60 velocity=81 (C5)
pitch=76 start=0.60 end=1.20 velocity=81 (E5)
pitch=79 start=1.20 end=1.50 velocity=81 (G5)
pitch=76 start=1.50 end=1.80 velocity=81 (E5)
Cuatro eventos de nota, cada ún con altor (pitch), instante d’entamu y
fin en segundos, y una velocity —81 nes cuatro, resultáu de traducir
la única dinámica mp de la frase a un valor MIDI fixu—. Ye exactamente lo
qu’hai qu’esperar de MIDI: instrucciones de cuándo suena qué, con qué
intensidá. Nin rastru de la dixitación, nin de la lligadura, nin de que
dalguna vegada hebo una marca “mp” na partitura: esa información nun tien
ónde vivir nel protocolu. Toca igual de bien, pero perdióse pa siempres
en cuanto se guardó.
Lleendo el MusicXML de vuelta
Con music21.converter.parse sobre ejemplo.musicxml, la mesma frase
devuelve muncho más:
C5: digitación=[1]
E5: digitación=[3]
G5: digitación=[5]
E5: digitación=[3]
Ligaduras (slurs) codificadas explícitamente: 2
Marcas de dinámica: ['mp']
Les cuatro dixitaciones tán intautes, la lligadura sigue codificada como tal
—non como una coincidencia de tiempos, sinón como un elementu <slur>
esplícitu— y la marca “mp” sigue siendo “mp”, non un númberu de velocity.
Too lo que MIDI nun tenía ónde guardar, MusicXML caltiénlo porque describe
la partitura, non la interpretación.
Un fragmentu del XML xeneráu dexa ver por qué: cada ún d’esos elementos ye una etiqueta lleíble, non un númberu de protocolu.
<dynamics default-x="-36" default-y="-80">
<mp />
</dynamics>
...
<fingering alternate="no" substitution="no">1</fingering>
...
<slur number="1" type="start" />
Lo que dicen los bytes
La diferencia tamién se ve, lliteralmente, nel tamañu y la forma de cada
ficheru. ejemplo.mid pesa 99 bytes; ejemplo.musicxml, 3560 bytes
—36 vegaes más pa la mesma frase de cuatro notes—. Nun ye inefeutividá: ye
la diferencia ente guardar namás instrucciones de reproducción y guardar una
descripción completa de la notación escrita.
Los primeros bytes del MIDI, en hexadecimal, son binariu puru:
4d54 6864 0000 0006 0001 0002 2760 4d54
726b 0000 0014 00ff 5103 0927 c000 ff58
Ensin un parser pel mediu, esto nun diz nada. El MusicXML, en cambiu, ye
testu XML que cualquier persona pue abrir nun editor y lleer —los
fragmentos d’enriba (<dynamics>, <fingering>, <slur>) entiéndense ensin
más contestu que’l propiu nome de la etiqueta—.
Tabla comparativa del esperimentu
MIDI (ejemplo.mid) | MusicXML (ejemplo.musicxml) | |
|---|---|---|
| Notes (altor, tiempu) | ✔ Calteníes | ✔ Calteníes |
| Dixitación | ✘ Perdida | ✔ Caltenida ([1], [3], [5], [3]) |
| Lligadura | ✘ Perdida (namás tiempos contiguos) | ✔ Caltenida como <slur> esplícitu |
| Dinámica (“mp”) | Aproximada a velocity=81 | ✔ Caltenida como testu (mp) |
| Tamañu | 99 bytes | 3560 bytes |
| Lleíble por una persona | ✘ Binariu | ✔ Testu XML |
Por qué importa na práutica
Esto nun ye una curiosidá de formatu: decide qué ferramienta usar según lo que faiga falta caltener. Pa reproducir, secuenciar o remanar un sintetizador, MIDI abonda y ye más llixeru. Pa notación, pedagoxía —una dixitación qu’un alumnu necesita ver imprentada— o archivu d’una partitura que se quiera editar más alantre, MIDI queda cortu por diseñu, non por descuidu: enxamás prometió guardar eso.
Ye tamién la razón de que un sistema de trescripción automática de música tenga que escoyer con curiáu’l so formatu de salida según l’usu final: MIDI si l’oxetivu ye que la trescripción sone, MusicXML si l’oxetivu ye qu’algún la llea, la corrixa o la use pa enseñar. Na mio propia investigación doctoral trabayo con pianu como corpus, y esta mesma disyuntiva apaez en cuanto un sistema d’AMT termina de decidir qué notes sonaron: el pasu siguiente ye en qué formatu entregar esi resultáu, y nun ye una decisión neutra.
Bibliografía
Les referencies nes que s’apoya esti artículu y per ónde siguir lleendo:
- The MIDI Association. The Official MIDI Specifications (MIDI 1.0, General MIDI, MIDI 2.0).
- W3C Music Notation Community Group. (2021). MusicXML 4.0.
- 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).
- Raffel, C., & Ellis, D. P. W. pretty_midi: A Python Library for Handling MIDI Data — repositoriu y documentación oficial.