martes, 5 de febrero de 2008

MIDI Formato de fichero. Eventos en tracks

Lo que he leido de los ficheros midis, me deja una duda que quiero solventar, por eso voy a traducir este documento.
Es una especie de borrador que espero ir arreglando.
Traducido de: aquí


Eventos en tracks.

Un MTrk(track) puede contener eventos MIDI y no eventos MIDI (es decir, los eventos que contienen datos como la configuración de tempo, los titulos, etc.)

Los primeros (1 a 4) byte (s) en un MTrk serán los delta-tiempos del el primer evento almacenados como una cantidad de longitud variable. El siguiente byte de datos es, en realidad, el primer byte de ese evento en sí. Voy a referirme a este byte como el Estado del Evento. Para eventos MIDI, ése será el byte de Estado MIDI (midi o el primer byte de datos en caso de running status). Por ejemplo, si el byte hexadecimal es 90, entonces este es un caso de Nota On en el canal midi 0. Si, por ejemplo, el byte hexadecimal es 23, lo que tenemos que recordar es el estado anterior (es decir, running status midi). Obviamente, el primer evento MIDI en la MTrk debe tener un byte de estado. Después de un byte de estado midi llegan sus bytes de datos 1 o 2 bytes de datos (dependiendo del Status - algunos mensajes MIDI sólo tienen despues 1 byte de datos ). Luego nos encontramso el delta-tiempo del siguiente evento (como una cantidad variable), etc

Eventos SYSEX

Eventos SYSEX (sistema exclusivo) (status = F0) son un caso especial porque un mensaje SYSEX puede ser cualquier longitud. Después del byte de Estado F0 (que siempre existe - no hay running-status aquí), encontrará una serie de bytes de longitud variable. De la misma forma que el delta-time pueden ser hasta 32 bits(8 bytes) que indica cuántos bytes más siguen al F0 y conforman el evento SYSEX. Esta longitud no incluye el Estado F0.

Por ejemplo, considere el siguiente mensaje SYSEX MIDI:

F0 7F 7F 04 01 7F 7F F7

Esto sería almacenado en un archivo MIDI con la siguiente serie de bytes (sin contar con los bytes de delta-tiempo que preceden al F0):

F0 07 7F 7F 04 01 7F 7F F7

La 07 es la cantidad de longitud variable (que pasa a caber en un solo byte para este ejemplo). Se indica que hay siete bytes despues del F0 para componer el mensaje SYSEX.

Los dispositivos midi del fabricante Really oddball envian un mensaje exclusivo del sistema(SYSEX) como una serie de "pequeños paquetes" (con un tiempo de retraso entre transmisión de cada paquete). La primera comienza con un paquete de F0, pero no termina con un F7. Los siguientes paquetes no empiezan con una F0 ,empiezan con F7 pero no finalizan con con F7. El último paquete no se inicia con una F0, se inicia con F7, pero sí termina con la F7. Así, entre el primer paquete de apertura de F0 y el último paquete de clausura del F7, hay un SYSEX mensaje. (Nota: sólo extremadamente pobres diseños, como el 'crap' comercializado por Casio exhiben tal horrible conducta). Por supuesto, como necesita una demora entre cada paquete, necesita almacenar cada paquete como un evento separado con su propio tiempo en el MTkr. Tambien, debe de alguna manera saber que eventos no deben comenzar con una F0 (es decir, todos ellos, excepto el primer paquete). Así, el archivo MIDI midi redefine una situación de F7 (que normalmente se utiliza como un fin para la marca SYSEX paquetes) como una forma de indicar que un evento no comienza con F0.
Si un evento sigue a un F0 evento, entonces se asume que el evento F7 es el segundo "paquete" de una serie. En este contexto, es mencionado como un caso SYSEX CONTINUACIÓN.
Al igual que el tipo de evento F0 , ls F7 tienen una cantidad de longitud variable seguida de bytes de datos.
Por otra parte, el evento F7 puede utilizarse para almacenar mensajes MIDI TIEMPO REAL o MIDI COMÚN(PERO NO MENSAJES DE CANAL). En este caso, después de los bytes de longitud variable, usted puede esperar encontrar un byte de Estado MIDI de F1, F2, F3, F6, F8, FA, FB, FC, o FE. (Tenga en cuenta que NO va a encontrar cualquiera de esos bytes dentro de un evento SYSEX CONTINUACIÓN). Cuando se usa de esta manera, el F7 evento es denominado ESCAPED evento.




Por lo que he entendio, un mensaje de SYSEX en formato continuación , son varios mensajes del formato.
F0datos
F7datos
.......
F7datos
F7F7


Otra cosa es el evento ESCAPE.
F7
En el evento ESCAPE caben los Estados comunes y Tiempo real.

Eventos no MIDI.
El estado de FF se reserva para indicar un evento especial no-MIDI.(Notar que FF es usado en MIDI con el significado de "reset", por lo que no es util almacenarlo en un fichero de datos. Sin embargo, el fichero MIDI redefine arbitrariamente el uso de este status). Despues del byte de estado FF, hay otro byte que nos indica el tipo del no-MIDI evento. Despues de este byte, tenemos otros bytes de cantidad de longitud variable que ya conocemos (ver delta-time). que nos indica la longitud del mensaje sin inccluir el FF el byte de tipo y la longitud misma. Estos no-MIDI eventos especiales se llaman Meta-Eventos, y la mayoría son opcionales mientras no se indique lo contrario. La seción de este libro online titulado "Meta-Eventos", lista los Meta-Eventos corrientemente definidos. Notar que aunque no ha sido mencionado, estos eventos se menten en un MTrk, puede haber mas de uno y llevan su delta-time correspondiente.(Como los eventos midi. Los Meta-Eventos tienen un delta-time que los separa del anterior evento. Tambien, puede libremente mezclar MIDI y Meta eventos).

No hay comentarios: