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
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 .
Rishi Nandha Vanchi
Rishi Nandha Vanchi