Tever
AST

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.

Escritoriu con dos ventanes de códigu Python al llau: a la esquierda un editor col script de music21 y una pantalla de partitura con lligadura, dixitación y matiz mp resaltaos en naranxa; a la derecha una vista hexadecimal d'un archivu binariu MIDI diminutu, sobre una mesa de llaboratoriu técnicu

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.

Partitura de la frase d'exemplu renderizada dende'l MusicXML real xeneráu pol códigu: cuatro notes en clave de sol con dixitación 1, 3, 5, 3, una lligadura ente les dos últimes y la indicación de dinámica mp
La frase d’exemplu tal como queda escrita nel MusicXML xeneráu pol códigu anterior —dixitación, lligadura y dinámica incluyíes—, renderizada equí pa velu como la vería un intérprete.

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ñu99 bytes3560 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: