Tiempo en archivos MIDI

Entiendo la nota/tono y los componentes de velocidad de un mensaje. Sin embargo, tengo dificultades para entender el atributo de tiempo. De acuerdo con la documentación demido , una biblioteca que estoy usando para leer archivos MIDI, el atributo de tiempo denota el tiempo delta que ha transcurrido desde el último mensaje.

En primer lugar, ¿cómo se mide este tiempo delta? Como en, ¿en qué unidades se discretiza el tiempo?

Por ejemplo, tome la siguiente pieza de Liszt . Encuentro que a veces el atributo de tiempo es 0. ¿Esto implica que la nota anterior y la actual se tocan juntas?

El objetivo final es convertir un archivo MIDI en un Piano-roll en Python. Cuando se lee en Python, esta es una pequeña parte del mensaje:

Track 0: Rhapsodie Nr. 10
<meta message track_name name='Rhapsodie Nr. 10' time=0>
<meta message copyright text='Copyright © 2005 von Bernd Krüger. ' time=0>
<meta message text text='Franz Liszt' time=0>
<meta message text text='Fertiggestellt am  28.5.2005\n' time=0>
<meta message text text='Update am 9.4.2011\n' time=0>
<meta message text text='Update am 8.3.2014\n' time=0>
<meta message text text='Dauer:  4:39 Minuten\n' time=0>
<meta message text text='Notation im 4/4 statt im 2/4 Takt.\n' time=0>
<meta message time_signature numerator=5 denominator=4 clocks_per_click=24 notated_32nd_notes_per_beat=8 time=0>
<meta message key_signature key='E' time=0>
<meta message set_tempo tempo=525394 time=0>
<meta message marker text='Preludio' time=0>
program_change channel=0 program=0 time=0
control_change channel=0 control=7 value=100 time=0
control_change channel=0 control=10 value=64 time=0
note_on channel=0 note=47 velocity=77 time=0
control_change channel=0 control=91 value=127 time=0
<meta message text text='bdca426d104a26ac9dcb070447587523' time=0>
program_change channel=0 program=0 time=0
control_change channel=0 control=7 value=100 time=0
control_change channel=0 control=10 value=64 time=0
control_change channel=0 control=91 value=127 time=0
<meta message text text='bdca426d104a26ac9dcb070447587523' time=0>
note_on channel=0 note=35 velocity=61 time=0
program_change channel=0 program=0 time=0
control_change channel=0 control=64 value=127 time=0
note_on channel=0 note=35 velocity=0 time=90
note_on channel=0 note=47 velocity=0 time=0
Esto podría obtener mejores respuestas en sound.stackexchange.com
Vea si esto ayuda (Han usado un módulo diferente pero con un propósito similar): stackoverflow.com/questions/36000906/…

Respuestas (1)

El tiempo delta se mide en tics.

Si un tiempo delta es cero, entonces este mensaje debe enviarse al mismo tiempo (inmediatamente después) del mensaje anterior. (Tenga en cuenta que un mensaje de nota activada con una velocidad de cero es en realidad una nota desactivada).

El encabezado del archivo especifica el número de pulsos por tiempo, y los mensajes de tempo especifican la duración de un tiempo, en microsegundos. Puede calcular un valor de tiempo delta en microsegundos con tempo * delta_ticks / ticks_per_beat, pero debe tener cuidado de fusionar todas las pistas primero porque un mensaje de tempo en otra pista puede cambiar ese valor en cualquier momento. Ver esta respuesta .

"un mensaje de nota activada con una velocidad de cero es en realidad una nota desactivada" solo con el estado de ejecución habilitado, en cuyo caso no lleva ningún byte de estado.
@Tetsujin El estado de ejecución y la velocidad = 0 son dos mecanismos completamente ortogonales.