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.
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.
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. |
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.
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 |
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 |
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:
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. |
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
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. |