Apéndice: Formato MIDI

El formato MIDI no se considera de audio digital, ya que no almacena muestras de un determinado sonido sino una descripción musical del mismo. Sólo puede representar sonidos musicales, además no los describe completamente, ya que indica el instrumento en el que se tocan, la forma de tocarlo, pero el sonido final que se reproduzca depende fuertemente del dispositivo reproductor MIDI.

Si bien este formato no es estrictamente audio digital, está ampliamente extendido para la representación de sonidos musicales en sistemas informáticos, por lo que le dedicamos este apéndice.

Estructura de fichero MIDI

Los ficheros MIDI tienen una estructura simple, se componen de una sucesión de segmentos. Debe haber un segmento de cabecera, seguido de un número variable de pistas (tracks). Una pista se asemeja conceptualmente a un pentagrama: puede describir el sonido de un determinado instrumento.

Segmento de cabecera

El segmento de cabecera de un fichero MIDI según la especificación General MIDI 1 tiene la siguiente estructura:

		struct {
 			char id[4];
 			long size;
 			unsigned format;
 			unsigned ntracks;
 			unsigned deltatime;
 		}MIDIhdr; 
id Identifica al fichero como de formato MIDI. Contiene la cadena de caracteres "MThd".
size Indica la longitud de la cabecera del fichero MIDI, sin contar los campos id y size. En esta especificación la cabecera siempre tiene 6 bytes.
format Hay tres posibles formatos:
0 – Pista única
1 – Multipista, síncrono
2 – Multipista, asíncrono
deltatime Indica el número de intervalos de tiempo contenidos en un cuarto de nota. Especifica así el tempo de la reproducción.

Formatos

Segmentos de pista

Cada segmento de pista consta de una cabecera, similar a la del fichero, seguida de una serie de eventos MIDI. De entre los eventos MIDI se encuentran los comandos, que son los mismos datos enviados o recibidos por los puertos MIDI de los dispositivos.

		struct {
 			char id[4];
 			long size;
 		}MIDItrackhdr; 
id Es una cadena de cuatro caracteres que especifica el tipo de segmento como una pista MIDI. Su contenido es "MTrk".
size Indica el tamaño de la pista sin contar la cabecera, esto es, el tamaño del conjunto de comandos que contiene.

Los programas que interpreten ficheros MIDI deben considerar la posible existencia de otros segmentos aparte de los de cabecera o pista y deben ignorarlos. Esto permite una mayor libertad a la hora que introducir nuevos elementos a la especificación MIDI.

Notas musicales en MIDI

Las notas musicales se representan en MIDI mediante un número entero positivo comprendido entre 0 y 127 (requiere de 7 bits). Con este rango cubre 11 octavas. Las correspondencias son las siguientes:

Octava C C# D D# E F F# G G# A A# B
0 0 1 2 3 4 5 6 7 8 9 10 11
1 12 13 14 15 16 17 18 19 20 21 22 23
2 24 25 26 27 28 29 30 31 32 33 34 35
3 36 37 38 39 40 41 42 43 44 45 46 47
4 48 49 50 51 52 53 54 55 56 57 58 59
5 60 61 62 63 64 65 66 67 68 69 70 71
6 72 73 74 75 76 77 78 79 80 81 82 83
7 84 85 86 87 88 89 90 91 92 93 94 95
8 96 97 98 99 100 101 102 103 104 105 106 107
9 108 109 110 111 112 113 114 115 116 117 118 119
10 120 121 122 123 124 125 126 127        

Valores de longitud variable

En muchos de los comandos MIDI se empleará una representación de números que se denomina de longitud variable.

La intención es representar un rango amplio de valores sin obligar a que valores pequeños ocupen más bytes los que el valor necesita para ser almacenado.

La forma de representación es la siguiente. El número se formará como una secuencia de bytes. Cada byte aporta sólo siete bits (los menos significativos) al número representado. El bit de mayor peso debe valer 1 si quedan más bytes para representar el número y 0 para el último byte. Estos son algunos ejemplos de valores hexadecimales y su representación en longitud variable MIDI:

Valor hexadecimal Representación MIDI
0x0000000 00
0x0000040 40
0x000007F 7F
0x0000080 81 00
0x0002000 C0 00
0x0003FFF FF 7F
0x0004000 81 80 00
0x0100000 C0 80 00
0x01FFFFF FF FF 7F
0x0200000 81 80 80 00
0x8000000 C0 80 80 00
0xFFFFFFF FF FF FF 7F

Eventos

Los eventos contenidos en los segmentos de pista de un fichero MIDI constan de dos elementos: un campo delta-time y un campo evento. El campo delta-time es de longitud variable y se expresa una determinada fracción del compás, tal como se indica en la cabecera. El campo evento puede ser de tres tipos:

Eventos MIDI

De los eventos MIDI se distinguen los comandos de voz de los comandos de modo.
— Comandos de voz: Constan de un byte de estado seguido de unos datos dependientes del byte de estado. El sistema MIDI organiza los diferentes instrumentos en canales. Hay 16 posibles canales que se especifican con los 4 bits más bajos del byte de estado. Los posibles mensajes son:

Byte de estado Significado Datos
0x8- Liberación de nota 1 byte de tono 1 byte de velocidad
0x9- Pulsación de nota 1 byte de tono 1 byte de velocidad
0xA- Presión de tecla 1 byte de tono 1 byte de presión (después de pulsar)
0xB- Parámetro 1 byte de número de parámetro 1 byte de valor
0xC- Programa 1 byte de programa seleccionado
0xD- Presión del canal 1 byte de presión (después de pulsar)
0xE- Pitch wheel 2 bytes que proporcionan 14 bits, los 7 de menor peso primero.

El sistema MIDI almacena el último byte de estado, de forma que si se quiere transmitir un tipo de mensaje, por el mismo canal, no es necesario volver a mandar el byte de estado. La velocidad es para aquellos dispositivos que son sensibles a la pulsación de la tecla a diferentes velocidades. Su valor está representado en escala logarítmica. Los dispositivos que no tienen esta funcionalidad se suponen que pulsan la tecla con una velocidad igual a 64.

Mensajes Exclusivos del Sistema MIDI

Los eventos exclusivos pueden ser únicos, en paquetes (una secuencia) o una secuencia de escape.

Existen fundamentalmente dos forma de mandar este tipo de mensajes:

0xF0 + longitud + mensaje

El campo longitud especifica el número de bytes del mensaje (no incluye cabecera ni el propio campo longitud). Es un valor expresado en formato longitud variable.

El mensaje completo puede enviar en un solo bloque o en varios. El mensaje completo debe finalizar con el carácter 0xF7 (que no se considera parte del mensaje). Si una mensaje contenido en una secuencia 0xF0 no finaliza con el carácter 0xF7, consta de más secciones. El resto del mensaje se envía con secuencias similares pero que comienzan con el carácter 0xF7.

Existe otra forma de enviar datos a modo de secuencia de escape. Este es un método para transmitir datos que de otra forma no serían válidos. Se trata de una secuencia como las vistas, que comienza por 0xF7, pero no es continuación de una secuencia 0xF0:

0xF7 + longitud + mensaje

Eventos META

Los eventos meta son muchos, no son información MIDI sino otros tipos de información que asociamos al fichero MIDI.

Los programas de aplicación no necesitan saber interpretar todos los eventos meta. A continuación se especifican algunos eventos meta:

Evento meta Descripción
FF 00 02 secnum Número de secuencia. Identifica una secuencia, para poder componer canciones en el formato 2 mediante la sucesión de secuencias que se identifican por este número. Es opcional y de existir debe situarse al principio de una pista. Antes de cualquier delta-time no nulo y de cualquier evento MIDI transmisible. Los ficheros de tipo 0 o 1, que sólo constan de una secuencia, deben tener este campo en la primera (o única) pista.
FF 01 long texto Texto. Permite introducir un texto en el fichero MIDI. Normalmente se suele incluir al comienzo de una pista para describir la forma en la que se debe representar. Pueden también emplearse en otros puntos del fichero, pudiendo servir como letras o bien como explicaciones de marcadores dentro de la pista. Se debe componen con caracteres ASCII imprimibles y aquellos programas que no los soporten deben ignorarlos. El campo long es de longitud variable.
FF 02 long texto Nota de copyright. Incluye una nota de copyright. La epecificación indica que debe contener los caracteres "(C)", el año del copyright y el propietario del mismo. Si existen diversas piezas musicales, los copyright deben agruparse en un único texto por fichero.
FF 03 long texto Nombre de secuencia/pista. Indica para los ficheros de formato 0 o la primera pista de los de formato 1 el nombre de la secuencia. En otro caso lo que indica es el nombre de la pista.
FF 04 long texto Nombre de instrumento. Describe el tipo de instrumentación a usar en la pista. Puede ir utilizado con el meta-evento Prefijo de canal MIDI para que indique el canal al que aplica la descripción.
FF 05 long texto Letra Es una letra para ser cantada. De forma general, cada sílaba es un evento Letra distinto, que comienzo en el instante del evento.
FF 06 long texto Marca Se utiliza normalmente en la pista del formato 0 o bien en la primera pista del formato 1. Nombra un determinado punto de la secuencia (p.ej. "Verso primero").
FF 07 long texto Apunte Indica algo que sucede en una película o pantalla de vídeo en el momento en el que la música se encuentra en ese instante de la reproducción.
FF 20 01 cc Prefijo de canal MIDI. El canal MIDI que indica (de 0 a 15) se toma como canal actual, de forma que los eventos siguientes están asociados a este canal (tanto los de sistema como los meta-eventos).
FF 2F 00 Fin de pista. Este evento es obligatorio. Se incluye para especificar un punto exacto de finalización, muy importante sobre todo si las pistas se repiten o se concatenan.
FF 51 03 tempo Tempo. Indica un cambio en el tempo en microsegundos por cuarto de nota MIDI.
FF 58 04 nn Tiempo.
FF 7F long texto Evento meta de secuenciador. Se emplea para definir mensajes específicos de un determinado secuenciador. El primer byte del mensaje es el ID del fabricante. Pero si el primer byte es cero, el campo de identificación es de tres bytes. Los formatos de estos mensajes específicos deben ser publicados por cada fabricante para permitir a otros secuenciadores la interpretación de esa información.