Cursillo de Introducción a la Informàtica Musical
Parte III: Musical Instruments Digital Interface (MIDI)

Autor: David García Garzón

Lo ke sigue aki es un resumen de las especificaciones MIDI, el protocolo mas generalizado de comunicacion entre instrumentos digitales. Tambien se explican algunos de los formatos de fichero para guardar sequencias MIDI, la funcion de algunos perifericos MIDI, y otras convenciones y extensiones de este estandard.

Indice

0. Introduccion al MIDI.

MIDI es un protocolo de comunicacion digital entre intrumentos musicales que se empezo a usar en los 70 y que ya hace tiempo que esta consolidado como la interficie entre instrumentos por excelencia.

Lo que se envia por MIDI no es el sonido que producen los instrumentos, sino los eventos: Cuando se pulsa una nota, cuando se varia un control... Permite sincronizar y sequenciar instrumentos, almacenar una interpretacion para su posterior edicion y reproduccion...

La ventaja del MIDI es que es un estandard muy establecido y que la mayoria de aparatos musicales tienen algun tipo de interficie MIDI. Pero, esta es, al parecer, su unica ventaja, pues, en todos los sentidos, el MIDI limita por anticuado: polifonia, numero de aparatos, conectividad, longitud del cableado, ancho de banda... Esto provoca, a menudo, que cada fabricante establezca su propia ampliacion del estandard aunque, por suerte, mantienen, la compatibilidad con el MIDI basico.

1. Especificaciones MIDI

1.1. Hardware de conexion

Interfaz serie: A 31,250 Kb/s (1% de tolerancia) asincrono con un start bit, ocho bits de datos empezando por el menos significativo y un stop bit, sin bit de paridad. Se realiza por bucle de corriente: 5 mA -> zero logico y 1uA -> uno logico. Entradas optoaisladas con un tiempo de respuesta de 2ns o menor.

Conectores: DIN de 5 pins (180o). Se utilizan 3: In(4), Out(5) y massa(2). La longitud maxima del cable es de 15 metros y tiene que ser trenzado y apantallado con la pantalla conectada al pin 2 en ambos extremos. Las patillas 1 y 3 se dejan sin conectar.

Puertos MIDI.

Los elementos MIDI se conectan mediante tres tipos de puertos.

Configuraciones típicas:

1.2. Conceptos basicos

Canal MIDI: Un canal MIDI sirve para direccionar los mensajes que se envian a un instrumento o a otro. El estandard MIDI utiliza 16 canales.

Canales propios de un instrumento: Canales a los que hace caso.

Canal basico de un instrumento: Canal por el que recibe los mensajes de modo (Configuracion).

Voces de un instrumento: Elementos de generacion de sonido de los que consta el dispositivo. P.ej: Las notas son las voces de un sintetizador pero en el caso de una caja de ritmos las voces serian cada uno de los elementos de percusion.

Notas: Cuando una voz se corresponde a una nota, se suele asociar el Do medio al valor 60. Se considera el rango 0-127 con una resolución de un semitono lo que da una amplitud de 10 octavas que no todos los dispositivos alcanzan. Cuando esto sucede, se ignoran o se trasladan a otra octava.

Pulsacion o velocidad: Es la fuerza o velocidad con que se pulsa, mantiene o suelta una voz. Se suele ponderar en escala logaritmica aunque no hay fijado un estandard. 0 es pulsacion minima mientras que 127 es la maxima. En ausencia de esta caracteristica se envia un 64.

Control: Es un parametro controlable de un sintetizador como el volumen, la afinacion... Existen de dos tipos de controles: continuos y conmutados. Suelen equivaler al accionamiento de un interruptor, un potenciometro, o un pedal.

Control contínuo: Tienen una gama de valores posibles como el volumen, ataque y sostenimiento de nota... La especificacion MIDI permite que sean de 7 bits (0-127) o de 14 bits (0-16383) aunque, en realidad, se consideran todos de 14 bits, lo que pasa es que, como se modifican los bytes alto y bajo por separado, en distintos mensajes, cuando tenemos uno de 7 bits solo modificamos la parte alta y la parte baja no se utiliza.

Control conmutado: Los conmutadores son controles que solo tienen dos posiciones que suelen ser ON (127) y OFF (0). Cualquier otro valor se ignora.

1.3. Tipos de estados.

Por el cable MIDI circulan dos tipos de bytes:

Bytes de estado: Tienen el MSB (Most Significant Bit) a uno. Son los que indican el tipo de mensaje que se va a enviar.

Bytes de datos: Tienen el MSB a cero. Contienen los parametros del comando/estado indicado en el byte de estado.

El estado de un dispositivo MIDI determina de que manera entendera los siguientes bytes de datos que reciba. Cada estado se alcanza al recibir un byte de estado y se mantiene hasta recibir otro byte de estado que no sea de tiempo real. Los mensajes de tiempo real interrumpen el estado pero no lo cambian.

Estados de ejecucion: Solo valido para mensajes de canal (voz y modo). No es necesario reenviar el byte de estado si es el mismo. Los mensajes cuyos grupos de bytes de datos no lleguen completos se ignoraran.

Estados no implementados: Se establece cuando llega un byte de estado de un comando, que, aunque pertenezca al protocolo MIDI, el instrumento no interpreta. El protocolo MIDI propone que se ignore dicho byte y los posteriores bytes de datos.

Estados indefinidos: Bytes de estado que no existen en el protocolo MIDI. Si se envian es debido a un error (apagado o encendido, ruido...) El protocolo MIDI propone que se ignore dicho byte y los posteriores bytes de datos.

1.4. Tipos de mensaje.

Mensajes de canal: Los que van dirigidos a un canal especifico. Dicho canal se indica en los 4 bits bajos del byte de estado y en los 4 altos se indica el comando/estado.

Mensajes de sistema: Son los que no se ligan a un canal. Los 4 bits altos de byte de estado estan a uno y los bajos indican el comando.

1.5. Mensajes de modo de canal.

Estado de cambio de modo: En realidad es el estado de canvio de control 1011nnnn donde nnnn indica el canal basico al que afecta. Todas las notas que se esten reproduciendo en el canal se paran.

Modo Omni On: El instrumento puede recibir los mensajes de voz por cualquiera de los canales aunque no sean suyos.
OMNI ON: 1011nnnn 01111101 00000000

Modo Omni Off: Se desactiva. Solo hace caso a los mensajes de los canales propios.
OMNI OFF: 1011nnnn 01111100 00000000

Modo Monofonico: En modo monofonico, un canal se corresponde con una voz. Se indica en los bytes de datos (uuuuuuu) que numero de canales asignados en este modo a partir del canal basico. si uuuuuuu es cero seran los todos los que tenga el instrumento.
MONOFONICO: 1011nnnn 01111110 0uuuuuuu

Modo Polifonico: Cada canal puede controlar mas de una voz simultaneamente.
POLIFONICO: 1011nnnn 01111111 00000000

Desactivar todas las notas: Los cuatro anteriores tambien lo hacen pero este permite hacerlo sin necesidad de conocer el modo de operacion actual ni cambiarlo.
DESACTIVA TODA NOTA: 1011nnnn 01111011 00000000

Modo Control Local ON/OFF: El control local del dispositivo se puede activar o desactivar con este mensaje. Se puede así hacer que el dispositivo solo haga caso al control MIDI. XXXXXXX es 1111111 para activado y 0000000 para desactivado.
CONTROL LOCAL: 1011nnnn 01111010 0XXXXXXX

Reajuste de Controles: Es una funcion asignada posteriormente al estandard. Lo que hace es inicializar los controles como el volumen y el pitch.
REAJUSTE CONTROLES: 1011nnnn 01111001 00000000

1.6. Mensajes de voces de canal.

Estado Desactivacion de voz: Indica que se desactiva una voz (deja de sonar una nota)
El byte de estado es 1000nnnn y se sirve de dos bytes de datos. El primero indica la voz que se desactiva y el segundo la velocidad o fuerza de pulsacion con que lo hace.

Estado Activacion de voz: Indica que se activa una voz (empieza a sonar una nota)
El byte de estado es 1001nnnn y se sirve de dos bytes de datos. El primero indica la voz que se activa y el segundo la velocidad o fuerza de pulsacion con que lo hace, igual que en el de desactivacion. Una activacion de velocidad 0 es equivalente a una desactivacion.

Estado Pulsacion de teclado polifonico: Indica una variacion de la pulsacion de la voz.
El byte de estado es 1010nnnn y comparte el formato que usan Activacion y Desactivacion para los bytes de datos.

Estado Cambio de control (1011nnnn): Indica un cambio en el valor de un control. Hace servir dos bytes de datos: El primero indica el control que se desea modificar y el segundo el nuevo valor para dicho control. La especificacion MIDI solo determina el tipo de los controles pero no restringe el control en concreto al que corresponde cada numero.

Estado Cambio de programa (1100nnnn): Solo necesita un byte de datos que indica un programa del 0 al 127.

Estado Presion de canal (1101nnnn): Es similar al de Pulsacion de teclado polifonico pero afecta a todas las notas del canal especificado. Por lo tanto solo requiere un byte de datos, el de presion.

Estado Modificacion del pitch (1110nnnn): De los dos bytes de datos que necesita, el primero es el byte menos significativo y el segundo el mas significativo. El valor central del pitch es 2000h y la sensibilidad de variacion del pitch se selecciona en el receptor.

1.7. Mensajes comunes de sistema

Mensaje de trama temporal MIDI (11110001): Lleva un solo byte de datos 0nnnxxxx donde nnn indica el tipo de codificacion y xxxx el valor. Para mas informacion sobre los codigos temporales se aconseja consultar la bibliografia.

Mensaje de posicion de cancion (11110010): Determina con dos bytes de datos cual es la posicion actual de la cancion en golpes de ritmo MIDI (un golpe de ritmo cada seis pulsos de reloj). El primero es el menos significativo y el segundo el mas significativo.

Mensaje de seleccion de cancion (11110011): Un solo byte de datos indica el numero de cancion que sera interpretada una vez llege el mensaje de tiempo real de inicio.

Mensaje de requerimiento de entonacion (11110110): Lo utilizan los sintetizadores analogicos (que tiempos aquellos...) para sintonizar sus osciladores. No llego a ver claro su funcion, pero si algun dia te las tienes que ver con un analogico y te enteras, no estaria de mas que me lo explicases.

Mensaje de fin de exclusivo (11110111): Se utiliza para finalizar los mensajes de sistema exclusivos aunque dicha funcion la puede realizar cualquier otro byte de estado que no sea de tiempo real. No tiene bytes de datos.

NB: Los mensajes comunes de sistema 11110100 y 11110101 son estados no definidos en la norma hasta una futura ampliacion.

1.8. Mensajes de sistema de tiempo real.

Reloj de temporizacion (11111000): El sistema, si lo envia, lo hace con una candencia de 24 por cuarto de nota.

Inicio (11111010): El sistema lo envia al iniciar una pieza. Generalmente es el instrumento maestro quien lo hace.

Continuacion (11111011): El sistema lo envia cuando quiere continuar tocando una pieza que ha parado. Se empezara a tocar en el siguiente pulso de reloj.

Parada (11111100): El sistema lo envia para detener la secuencia.

Espera activa (11111110): El sistema lo envia cada 300 milisegundos. Los sistemas MIDI no estan obligados a hacerlo, ni receptor ni transmisor. En el caso de que un receptor reconozca dicho mensaje, una vez que reciba uno, si antes de 300 milisegundos no ha recibido otro mensaje de qualquier tipo, desactivara las voces y volvera a modo de operacion normal. Si un transmisor lo envia, lo habra de hacer cada 300 milisegundos de inactividad si no quiere que algunos receptores se descuelguen.

Reset del sistema (11111111): Resetea todos los intrumentos que lo reciben.

NB: Los mensajes de tiempo real 11111001 y 11111101 son estados no definidos en la norma hasta una futura ampliacion.

1.9. Mensajes de sistema exclusivos

Estos mensajes sirven para ampliar los estandards MIDI para un intrumento en concreto. Empiezan con el byte de estado 11110000. Los bytes de datos que siguen identifican el fabricante. A partir de aqui el formato depende de el fabricante, por eso es esencial que si el fabricante no es el correcto, el mensaje se ignore.

Los mensajes exclusivos de sistema van dirigidos a todos los canales por lo que si hay dos instrumentos del mismo tipo, ambos lo recibiran. Por esta razon, generalmente se incluye en el formato de fabricante algun tipo de direccionado basado en canal MIDI o no.

El estado acaba cuando entra un mensaje de fin de exclusivo (11110111) o cualquier otro byte de estado que no sea de tiempo real.

1.10. Controles MIDI

CONTROLES ESPECIFICADOS (HEX)
Ajuste MSB
00 Seleccion de banco (coarse)
01 Modulation Wheel (coarse)
02 Breath controller (coarse)
04 Foot Pedal (coarse)
05 Portamento Time (coarse)
06 Data Entry (coarse)
07 Volume (coarse)
08 Balance (coarse)
0A Pan position (coarse)
0B Expression (coarse)
0C Effect Control 1 (coarse)
0D Effect Control 2 (coarse)
10 General Purpose Slider 1
11 General Purpose Slider 2
12 General Purpose Slider 3
13 General Purpose Slider 4
Ajuste LSB
20 Bank Select (fine)
21 Modulation Wheel (fine)
22 Breath controller (fine)
24 Foot Pedal (fine)
25 Portamento Time (fine)
26 Data Entry (fine)
27 Volume (fine)
28 Balance (fine)
2A Pan position (fine)
2B Expression (fine)
2C Effect Control 1 (fine)
2D Effect Control 2 (fine)
Interruptores
40 Hold Pedal (on/off)
41 Portamento (on/off)
42 Sustenuto Pedal (on/off)
43 Soft Pedal (on/off)
44 Legato Pedal (on/off)
45 Hold 2 Pedal (on/off)
50 General Purpose Button 1 (on/off)
51 General Purpose Button 2 (on/off)
52 General Purpose Button 3 (on/off)
53 General Purpose Button 4 (on/off)
Generacion de sonido
46 Sound Variation
47 Sound Timbre
48 Sound Release Time
49 Sound Attack Time
4A Sound Brightness
4B Sound Control 6
4C Sound Control 7
4D Sound Control 8
4E Sound Control 9
4F Sound Control 10
Efectos
5B Effects Level
5C Tremulo Level
5D Chorus Level
5E Celeste Level
5F Phaser Level
Parametros
60 Data Button increment
61 Data Button decrement
62 Non-registered Parameter (fine)
63 Non-registered Parameter (coarse)
64 Registered Parameter (fine)
65 Registered Parameter (coarse)
Modo de canal
78 All Sound Off
79 All Controllers Off
7A Local Keyboard (on/off)
7B All Notes Off
7C Omni Mode Off
7D Omni Mode On
7E Mono Operation
7F Poly Operation

1.10. Parametros MIDI

Los parametros son una puerta abierta al limite de los 128 controles MIDI. Se agrupan en dos grupos, los registrados, que dependen de las especificaciones, y los no registrados disponibles para los implementadores. Permiten asociar los numeros del 0 al 63.383 a cualquier parametro de un aparato y controlarlo via MIDI.

Para hacerlo primero hemos de indicar la parte alta y la parte baja del numero del parametro con los mensajes de control adecuados: 62h y 63h para los no registrados o 64h y 65h para los registrados. Una vez seleccionado el parametro, utilizamos otros controles para incrementar el parametro una cantidad (61h), decrementarlo (60h), fijar los 7 bits mas significativos (06h) o los menos significativos (26h).

Controles Para Cambiar Parametros (HEX)
06Ajuste brusco del parametro (MSB)
26Ajuste fino del parametro (LSB)
60Decrementa el parametro en una cantidad
61Incrementa el parametro en una cantidad
62Indica un parametro no registrado a ajustar (LSB)
63Indica un parametro no registrado a ajustar (MSB)
64Indica un parametro registrado a ajustar (LSB)
65Indica un parametro registrado a ajustar (MSB)

2. Aparatos MIDI

2.1. Vision general

A parte de los instrumentos, los generadores de sonido y los sequenciadores, existen otros elementos mas discretos, pero igual de utiles en una configuracion MIDI, gracias a los cuales podemos sacarle un mayor partido.

Hoy en dia muchos de los elementos aqui citados, suelen estar acoplados entre si en una sola unidad. El ejemplo mas claro de esto es el ordenador que, gracias a su versatilidad, practicamente, puede hacer las funciones de cualquier elemento MIDI. Aun asi, no siempre se amortiza un equipo que haga demasiadas funciones.

Los elementos pueden hacer tres tipos de funciones:

2.2. Teclado Mudo

Protocolos como el MIDI han permitido que se pueda separar el el instrumento en si, y el aparato que genera el sonido, de tal forma un teclado mudo, por ejemplo, tan solo enviaria mensajes MIDI que directamente a otro modulo generador de sonidos que es el que suena realmente.

Un generador de sonidos puede ser un sintetizador, un sampler, un ordenador... cualquier elemento MIDI que genere sonido.

Es muy importante el grado de configurabilidad de un teclado mudo. Lo mas normal es que ofrezca sensibilidad a la expresion (velocidad de pulsacion) y que ofrezca la posibilidad de enviar mensajes de control mediante uno o varios pedales o palancas incorporadas.

2.3. Pedales y palancas MIDI

Los mensajes de control, en general, necesitan otro tipo de entrada por parte del interprete que no puede ser por teclado. Para ello, no hay nada mejor que un pedal que deje las manos libres.

Los pedales MIDI son unos pedales especiales que envian un determinado mensaje de control (configurable o no) al teclado o directamente a la cadena MIDI. Los hay, tambien, ke modifican el pitch, la pulsacion...

Las palancas o ruedas suelen estar incorporadas en los teclados. La funcion es parecida pero ahora es el teclado mismo quien genera la mensajeria MIDI. Las ruedas casi siempre hacen funciones de pitch pero tambien las hay configurables.

Tambien hay una serie de pedales que no son MIDI, que dependen del teclado. Estos pedales no envian al teclado mensajes MIDI, pero sirven para modificar la interpretacion del teclado y, en consecuencia, su salida MIDI, de forma similar a las ruedas.

2.4. Secuenciador

Un secuenciador permite generar sequencias MIDI en frio para reproducirlas despues de forma sincronizada. Por lo general, el aparato ofrece la posibilidad de crear la secuencia con un metodo que consiste en llenar los espacios de un compas con determinadas notas. No tenemos, pues, que interpretarla con un instrumento.

Esta claro que si nos ceñimos a los 16 espacios ke suele tener el sequenciador y a poner o no una nota, se limita mucho la expresividad de las sequencias por lo que, ademas se nos permite variar varios parametros de cada uno de los 16 slots: Retardo, si se prolonga al siguiente slot, si hay un slide o el valor de uno o varios controles del generador de sonidos.

Tambien existen los llamados DNA. Un DNA es una serie de parametros de retardo, enfasis... que se recogen a partir de un interprete real y que se aplican a la sequencia en question. Dan mucha mas personalidad dado que cada interprete y cada estilo tienen su propio DNA. Tan solo tengo noticias de DNA's aplicados a las sequencias de percusion, pero pronto se aplicaran tambien a otro tipo de sequencias.

2.5. Lanzadores

Un lanzador es un modulo que almazena sequencias MIDI y que, a una senyal de el interprete, lanza una o otra sequencia a la cadena. El modulo que hace de lanzador, suele permitir guardar las sequencias en un soporte no volatil.

La funcion de lanzador de sequencias suele estar en el teclado o en el ordenador.

2.6. Arpegiadores y harmonizadores

El arpegiador es un modulo que a partir de un acorde y un patron, genera la sequencia MIDI para el correspondiente arpegio.

El harmonizador hace lo propio agregando, a la sequencia MIDI, las notas de acompanyamiento que harmonizan con lo que le entra.

Estos dos modulos suelen estar incluidos en teclados, sequenciadores y lanzadores.

En cuanto a dispositivos originadores de mensajes MIDI la variedad de funciones no va mucho mas alla de los explicado y de los clasicos instrumentos MIDI: Guitarras, Saxofones, Cajas de ritmos...

2.7. Generador de sonidos sintetitzados (sintetizador)

En su mayor parte, los consumidores de mensajes MIDI son generadores de sonido aunque bien pueden ser tan variados (psicodelicos, automatas MIDI, transcriptores de partituras... imaginacion!)

Existen dos grandes familias de generadores de sonidos: Los sintetizadores y los samplers.

Un sonido sintetizado es aquel que se produce a partir del procesado analogico o digital de una o varias senyales simples. Las senyales simples que mas se utilizan son las ondas triangulares, de dientes de sierra, sinosuidales, cuadradas... Los procesos mas extendidos son la modulacion, el filtrado frequencial, la distorsion, las envolventes...

La mayoria de procesos (digitales o analogicos) dependen de una serie de parametros que se modifican para obtener un sonido o otro. Hay un manual especialmente dedicado a explicar este tipo de generacion de sonidos.

Los sintetizadores suelen tener un banco de sonidos donde guardan los parametros de cada uno, y, por lo general, permiten que se programen nuevos.

2.8. Generador de sonidos basado en grabaciones (sampler)

Este tipo de generador no parte de una onda simple sino de una onda grabada. Necesitan mucha mas memoria para almazenar los sonidos pero se obtienen sonidos bastante mas verosimiles.

Los samplers tambien aplican filtros, envolventes y otros procesos a la señal para dar mayor expresividad al sonido.

Se puede encontrar mas informacion sobre las tecnicas sampleado en los otros manuales.

Las muestras de sonido son siempre digitales pero los procesos tambien pueden ser digitales o analogicos.

2.9. Caja THRU

Una caja THRU es un simple aparato que tiene una entrada IN y n salidas THRU. Sencillamente duplica la entrada en las salidas, dividiendo la cadena MIDI en n cadenas (configuracion en estrella). De esta manera se pueden evitar cadenas excesivamente largas y los problemas que estas comportan.

En cadenas largas se produce, por ejemplo, el problema del retardo debido al tiempo que tarda en llegar un mensaje del primer al ultimo elemento.

Tambien existe el problema de la degradacion. Cada vez que la senyal pasa por un elemento las transiciones de la senyal se hacen mas tenues, y, al final, acaban siendo indistinguibles.

2.10. Filtro MIDI

El filtro MIDI es un aparato que elimina de forma selectiva mensajes MIDI. Tiene una entrada IN y una salida OUT. Los hay especificos o programables segun se pueda o no elegir el tipo de mensaje a filtrar.

Hay que tener cuidado al diseñar filtros, pues, si simplemente se eliminan los mensajes a filtrar, cabe la posibilidad que el resto de mensajes queden inconsistentes.

Un filtro permite reducir el nivel de mensajes que circulan por la cadena para que no se produzca saturacion. La saturacion es el hecho de que un puerto MIDI no pueda procesar todos los mensajes que le llegan mas los que genera.

Los filtros son tambien una opcion muy buena para controlar los instrumentos que solo pueden funcionar en modo Omni para que formen parte de una cadena. Los instrumentos Omni no hacen seleccion de canal por lo que no podemos direccionar mensajes solo a un instrumento, sin que el Omni tambien lo toque, pero si introducimos antes del instrumento Omni un filtro para los mensajes de un canal determinado, podria funcionar correctamente.

2.11. Canalizador MIDI

La funcion del canalizador es transportar los mensajes dirigidos a cierto canal hacia otro, pues no siempre podemos hacer coincidir el canal de salida de un aparato y el de entrada de otro.

2.12. Monitor MIDI

Sirve para visualizar el tipo de mensajes que circulan por un punto en la cadena. Generalmente, suele constar de una serie de LED's que se iluminan cuando estos mensajes pasan.

2.13. Multiprocesador

Los multiprocesadores son aparatos programables basados en un microprocesador. Estos aparatos permiten realizar cualquier tipo de proceso a la secuencia de mensajes MIDI que nuestra habilidad como programadores nos permita.

Hoy en dia este tipo de tarea la suele realizar un ordenador, pero a veces, un ordenador tiene un tiempo de respuesta (latencia MIDI) excesivo para que la sequencia no se demore demasiado.

Un ordenador tiene, a menudo, otras cosas a las que atender y se produce lo que se llama una alta latencia MIDI, es decir, se tarda demasiado en responder. Por eso, aveces, es aconsejable dedicar uno de estos pequeños procesadores exclusivamente al proceso MIDI.

3. General MIDI

3.1. Introduccion

General MIDI es un estandard, añadido a MIDI, que intenta garantizar que la musica realizada en un equipo de un fabricante se pueda interpretar en otro equipo de un fabricante diferente y suene de forma similar a como fue concebido.

Un dispositivo General MIDI ha de cumplir los siguientes requisitos:

Este sello, garantiza que un aparato cumple estas especificaciones.

3.2. Instrumentos General MIDI

El kit de instrumentos que define General MIDI se compone de 16 grupos con 8 instrumentos cada uno. Los grupos definidos son los siguientes:

PianoPercusion Cromatica
00 Acoustic Grand Piano
01 Bright Acoust. G.Piano
02 Electric Grand Piano
03 Honky-tonk Piano
04 Rhodes Piano
05 Chorused Piano
06 Harpsichord
07 Clavinet
08 Celesta
09 Glockenspiel
0A Music box
0B Vibraphone
0C Marimba
0D Xylophone
0E Tubular Bells
0F Dulcimer
OrganosGuitarra
10 Hammond Organ
11 Percussive Organ
12 Rock Organ
13 Church Organ
14 Reed Organ
15 Accordion
16 Harmonica
17 Tango Accordion
18 Acoustic Guitar1
19 Acoustic Guitar2
1A Electric Guitar1
1B Electric Guitar2
1C Electric Guitar3
1D Overdrive Guitar
1E Distorton Guitar
1F Guitar Harmonics
BajoCuerda
20 Acoustic Bass
21 Electric Bass 1
22 Electric Bass 2
23 Fretless Bass
24 Slap Bass 1
25 Slap Bass 2
26 Synth Bass 1
27 Synth Bass 2
28 Violin
29 Viola
2A Cello
2B Contrabass
2C Tremolo Strings
2D Pizzicato StringS
2E Orchestral Harp
2F Timpani
EnsembleMetales
30 String Ensemble1
31 String Ensemble2
32 SynthStrings 1
33 SynthStrings 2
34 Choir Aahs
35 Voice Oohs
36 Synth Voice
37 Orchestra Hit
38 Trumpet
39 Trombone
3A Tubah
3B Muted Trumpet
3C French Horn
3D Brass Section
3E Synth Brass 1
3F Synth Brass 2
LenguetasTubos
40 Soprano Sax
41 Alto Sax
42 Tenor Sax
43 Baritone Sax
44 Oboeh18
45 English Horn
46 Bassoon
47 Clarinet
48 Piccolo
49 Flute13
4A Recorder
4B Pan Flute
4C Bottle Blow
4D Shakuhachi
4E Whistle
4F Ocarina
Sintetizador solistaSintetizador Acompañamiento
50 Lead 1 square
51 Lead 2 sawtooth
52 Lead 3 caliope
53 Lead 4 chiff
54 Lead 5 charang
55 Lead 6 voice
56 Lead 7 fifths
57 Lead 8 brass
58 Pad 1 new age
59 Pad 2 warm
5A Pad 3 polysynth
5B Pad 4 choir
5C Pad 5 bowed
5D Pad 6 metallic
5E Pad 7 halo
5F Pad 8 sweep
Sintetizador EfectosEtnicos
60 FX 1 rain
61 FX 2 soundtrack
62 FX 3 crystal
63 FX 4 atmosphere
64 FX 5 brightness
65 FX 6 goblins
66 FX 7 echoes
67 FX 8 sci-fi
68 Sitar4
69 Banjo5
6A Shamisen
6B Kotoh7
6C Kalimba
6D Bagpipe
6E Fiddlet
6F Shanai0
PercusionEfectos
70 Tinkle Bell
71 Agogo13
72 Steel Drums
73 Woodblock
74 Taiko Drum
75 Melodic Tom
76 Synth Drum
77 Reverse Cymbal
78 Guitar FretNoise
79 Breath Noise
7A Seashore
7B Bird Tweet
7C Telephone Ring
7D Helicopter
7E Applause
7F Gunshot

3.3. Kit de percusion General MIDI

El kit de percusion define los elementos sonoros que iran asociados a algunas de las voces que se tocan por el canal 10.

VozSonido AsociadoVozSonido Asociado
35Acoustic Bass Drum59Ride Cymbal 2
36Bass Drum 160Hi Bongo
37Side Stick61Low Bongo
38Acoustic Snare62Mute Hi Conga
39Hand Clap63Open Hi Conga
40Electric Snare64Low Conga
41Low Floor Tom65High Timbale
42Closed Hi-Hat66Low Timbale
43HighFloorTom67High Agogo
44Pedal Hi-Hat68Low Agogo
45Low Tom69Cabasa
46Open Hi-Hat70Maracas
47Low-Mid Tom71Short Whistle
48Hi-Mid Tom72Long Whistle
49Crash Cymbal 173Short Guiro
50High Tom74Long Guiro
51Ride Cymbal 175Claves
52Chinese Cymbal76Hi Wood Block
53Ride Bell77Low Wood Block
54 Tambourine78Mute Cuica
55Splash Cymbal79Open Cuica
56Cowbell80Mute Triangle
57Crash Cymbal 281Open Triangle
58Vibraslap  

3.4. Controles General MIDI

Es necesario, como minimo que un dispositivo General MIDI reconozca los siguientes controles:

# ControlDescripcionComentarios
1Modulationusually hard-wired to control LFO amount, ie, vibrato),
7Main Volume 
10Pan 
11Expression 
64Sustain 
121Reset All Controllers 
123All Notes Off 

3.5. Recomendaciones para los sistemas General MIDI

Lo que siguen son recomendaciones, no requisitos.

Parametros registrados MIDI

Si se incluyen los parametros de afinacion, la afinacion inicial debera ser la referencia estandard: 440 Hz para el La medio.

Recomendaciones sobre mensajes exclusivos de sistema:

General MIDI On:

0xF0	Byte de Estado (SysEX)
0x7E	Fabricante: Universal Non-Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x09	Protocolo: General MIDI Message
0x01	Mensaje: General MIDI On
0xF7	Fin de SysEx

General MIDI Off:

0xF0	Byte de Estado (SysEX)
0x7E	Fabricante: Universal Non-Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x09	Protocolo: General MIDI Message
0x02	Mensaje: General MIDI Off
0xF7	Fin de SysEx

NOTA: Los cambios de volumen y balanceado como SysEx se difieren del cambio de control en que los controles se refieren al canal y los SysEx al dispositivo.

4. Archivos estandar MIDI (SMF)

4.1. Vision general

Los archivos SMF (Standard MIDI Files) se utilizan para almacenar secuencias MIDI y casi siempre llevan la extension .MID. Un archivo SMF puede contener varias secuencias MIDI, cada una, en una pista o track.

El formato de estos archivos los distribuye en chunks. El primer chunk es el de cabecera, o header chunk, y el resto son chunks de pistas, o track chunks.

Cada chunk va precedido por cuatro bytes de identificacion y cuatro mas que indican la longitud en bytes del resto del chunk. Despues viene el contenido.

4.2. Chunk de cabecera

El identificador del chunk de cabezera es 'MThd'. La longitud de este chunk siempre es la misma, 6 bytes. Los dos primeros bytes determinan el tipo de fichero.

Los siguientes dos bytes codifican el numero de pistas del fichero y los dos ultimos el numero de tiempos de delta por cuarto de nota cuyo significado se vera mas adelante.

4.3. Chunk de pista

Los chunks de pista tienen el identificador 'MTrk'. Una vez indicada la longitud del chunk vienen los eventos MIDI. Cada evento MIDI viene precedido por un tiempo de delta que tiene que passar antes de enviarlo.

Dicho tiempo de delta se especifica de la siguiente manera: Se divide el numero de deltas en palabras de 7 bits. Se completa cada palabra con el bit 7 (el mas significativo) para tener bytes completos. El bit 7 sera 1 en todas las palabras menos en la palabra menos significativa que valdra 0. En el fichero las palabras se colocan de mas a menos significativas de tal forma que, cuando leamos la menos significativa (bit 7=0), sabemos que ha acabado la delta y empieza un evento. El ultimo evento de cada track ha de ser el (meta) evento 2Fh 00h.

4.4. Metaeventos

Los metaeventos son eventos utilizados en los SMF que no estan definidos en el estandard MIDI. Siguen el formato:

FF xx nn dd...

Empiezan todos con FF (11111111) seguido del identificador del comando (xx), la longitud de los datos en bytes (nn) y los datos propiamente dichos (dd..)

Cuidado: Estos mensajes no se deben de enviar a la ligera por el puerto MIDI pues un FF significa un Reset del sistema.

Aqui teneis algunos de los mas utilizados:

Hex Binary Data Description
00 00000000 nn ssss Numero de Track.
nn=02 (length of 2-byte sequence number)
ssss=sequence number
01 00000001 nn tt .. Evento de Texto
nn=length in bytes of text
tt=text characters
02 00000010 nn tt .. Informacion de Copyright.
nn tt=same as text event
03 00000011 nn tt .. Nombre del Track.
nn tt=same as text event
04 00000100 nn tt .. Nombre del Intrumento del Track.
nn tt=same as text event
05 00000101 nn tt .. Letra de la cancion.
nn tt=same as text event
06 00000110 nn tt .. Marcador.
nn tt=same as text event
07 00000111 nn tt .. Cue point
nn tt=same as text event
2F 00101111 00 Finalizador de track.
51 01010001 03 tttttt Ajuste del tempo
tttttt=microseconds/quarter note
58 01011000 04 nn dd cc bb Time Signature
nn=numerator of time sig.
dd=denominator of time sig. 2=quarter, 3=eighth, etc.
cc=number of ticks in metronome click
bb=number of 32nd notes to the quarter note
59 01011001 02 sf mi Key signature
sf=sharps/flats (-7=7 flats, 0=key of C, 7=7 sharps)
mi=major/minor (0=major, 1=minor)
7F 01111111 xx dd .. Informacion especifica del sequenciador
xx=number of bytes to be sent
dd=data

5. Ampliaciones del MIDI

5.1. El tiempo en MIDI

Existen toda una serie de funciones de control sobre el tiempo, y de sincronizacion de los relojes de los dispositivos conectados a una cadena MIDI.

Por un lado existe el mensaje de reloj de sistema o metronomo (F7h). Es un mensaje de tiempo real que, si se envia, se hace con una candencia continua de 24 veces cada cuarto de nota negra (o pulsacion). Si variamos el tempo, se varia dicha candencia.

Tambien tenemos el mensaje de puntero de cancion (F2h). Es un mensaje comun de sistema que indica la posicion dentro de la cancion. Dicha posicion, que se viene indicada en dos bytes de datos, es un numero que se incrementa cada 6 tics de reloj y, por tanto, si los tics de reloj eran 24 por negra, cada 16 unidades incrementadas del puntero corresponden a una nota negra. Una cancion que utilice el puntero de cancion podria tener una duracion maxima de 1024 tiempos (negras).

Tanto el reloj como el puntero de cancion son utiles para controlar y sincronizar elementos MIDI que tengan que adaptarse al tempo del resto del sistema como un arpegiador o una linia de bajo o percusion.

Paralelamente, tenemos el mensaje de trama temporal MIDI o MIDI Time Code (F1h). Es un mensaje comun de sistema que determina la posicion actual en la cancion pero utilizando una codificacion SMPTE (Society of Motion Picture and Television Engineers).

La codificacion SMPTE es un estandard comercial de codificacion del tiempo en dispositivos no musicales. La utilizaremos para controlar cintas de audio, aparatos de video y otros aparatos que no entienden lo que es un compas, una nota o el tempo. SMPTE establece una subdivision temporal en horas, minutos, segundos y frames. El numero de frames por segundo se especifica segun el formato SMPTE usado.

Formato SMPTE Frames/segundo Usado en
0 24 Cine
1 25 Video Europeo (Sistema PAL)
2 30 (non drop) Audio
3 29,97 (30 drop) Video USA (Sistema NTSC)

NOTA: El formato 3 de SMPTE es un poco mas complejo que los otros, pues no se trata de un numero entero de frames por segundo. Lo que se hace es contar 30 frames pero colarnos (drop) los dos primeros frames de cada minuto excepto si el minuto es multiple de 10 que no nos saltamos ninguno. Esto da una media de 29.97 frames/minuto.

Para formar una trama MTC completa utilizamos de 8 mensajes MTC (F1h). Se envia una trama completa cada dos frames, por tanto, un mensaje cada cuarto de frame. El byte de datos del mensaje MTC tiene el formato 0nnnxxxx donde:

nnn Significado de xxxx
0 4 bits bajos de Frames
1 4 bits altos de Frames
2 4 bits bajos de Segundos
3 4 bits altos de Segundos
4 4 bits bajos de Minutos
5 4 bits altos de Minutos
6 4 bits bajos de Horas
7 Bit alto de Horas y Formato SMPTE utilizado

Vemos que necesitamos los ocho mensajes para codificar una posicion SMPTE. Si el MTC va hacia adelante, los mensajes se envian de 0 a 7. Si va hacia atras, los mensajes se envian en orden inverso. Se supone que los dos frames ocurren exactamente en el mensaje 0 y 4.

Tambien se puede especificar rapidamente el MTC con un solo mensaje SysEx Universal RealTime. Esto tiene la aplicacion de hacer saltar rapidamente hacia atras o hacia adelante a un dispositivo.

Mensaje de especificacion rapida de MTC

0xF0	Byte de estado (SysEx)
0x7F	Fabricante: Universal Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x01	Protocolo: MIDI Time Code
0x01	Mensaje: Full Time Code Message
[hr]	Horas y Formato SMPTE
[mn]	Minutos
[se]	Segundos
[fr]	Frames
0xF7	Fin de SysEx

Tambien se pueden especificar bits de usuario de SMPTE. Algunos dispositivos SMPTE los utilizan para propositos propios. En principio, estan pensados para almacenar 8 digitos decimales que podrian tener el contador de vueltas en una cinta, por ejemplo.

Mensaje de especificacion de bits de usuario

0xF0	Byte de estado (SysEx)
0x7F	Fabricante: Universal Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x01	Protocolo: MIDI Time Code
0x02	Mensaje: MIDI Time Code User Bits
[u1]	0000aaaa 
[u2]	0000bbbb 
[u3]	0000cccc 
[u4]	0000dddd
[u5]	0000eeee 
[u6]	0000ffff 
[u7]	0000gggg 
[u8]	0000hhhh 
[u9]	000000ii
0xF7	Fin de SysEx

Los bits 'i' son Flags y los otros son datos que estan pensados para representar digitos decimales por eso los cuatro bits de arriba estan a 0: para representar un digito decimal de 0 a 9 solo hace falta 4 bits.

5.2. Sample Dump Standard

La extension SDS del MIDI esta pensada para que los dispositivos MIDI se intercanvien samples entre ellos cuando no tienen otra forma mas rapida de hacerlo, por que no hay una interficie adecuada como podria ser un interface SCSI.

SDS No esta pensada para usarse en medio de una interpretacion pues ocupa mucho del ancho de banda. SDS esta pensado pues, para usarse en el momento anterior a dicha representacion, o mediante un puerto MIDI alternativo.

La utilidad mas directa del volcado de samples, es aprovechar la memoria de un ordenador o de un dispositivo de almacenage independiente para que un instrumento, normalmente un sampler, pueda ampliar su banco de instrumentos mas alla de su propia memoria.

SDS, en conjuncion con los Standard MIDI Files, tambien sirve de estandar de almacenamiento de samples. Tambien da la posibilidad de editar dichos instrumentos con un software adecuado.

SDS define protocolos para acordar el envio entre los dos extremos o bien enviarlo abiertamente sin ningun tipo de acuerdo previo a toda la cadena MIDI.

5.3. MIDI General Information

Esta extension sirve para obtener una serie de informacion sobre los dispositivos conectados a la cadena MIDI. Se basa en dos mensajes exclusivos de sistemas universales (no propietarios):

Device Identity Request Message:

0xF0	Byte de estado (SysEx)
0x7E	Fabricante: Universal Non-Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x06	Protocolo: General Information
0x01	Mensaje: Requerimiento de Identidad
0xF7	Fin de SysEx

Device Identity Reply Message:

0xF0	Byte de estado (SysEx)
0x7E	Fabricante: Universal Non-Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x06	Protocolo: General Information
0x02	Mensaje: Respuesta de Requerimiento de Identidad
[id]	Identificador de Fabricante (1 o 3 Bytes)
[fl]	Codigo de Familia del dispositivo (LSB)
[fm]	Codigo de Familia del dispositivo (MSB)
[ml]	Codigo de Miembro de la familia (LSB)
[mm]	Codigo de Miembro de la familia (MSB)
[ver]	Version del Software (4 Bytes)
0xF7	Fin de SysEx

Duda: En que se basan los device id de los SysEx.

5.4. MIDI Tuning Standard

Esta extension permite acceder a la afinacion de cada una de las voces de cada programa de un dispositivo MIDI. Una tabla de afinacion consiste en una lista de valores de afinacion para cada voz MIDI de un programa.

La afinacion de cada voz se codifica con 3 bytes. Como son bytes de datos (7 bits utiles) tenemos un margen de 21 bits por nota. El primero de los 3 bytes indica la nota por encima de la que se afina, los dos bytes siguientes son un numero positivo que subdividen el intervalo entre esa nota y el siguiente semitono mas agudo en 214 divisiones. Tenemos una precision tal que se nos permite ajustar la afinacion 0'006125 centesimas de semitono.

Mensage de requerimiento de volcado de las tablas de afinacion:

0xF0	Byte de estado (SysEx)
0x7E	Fabricante: Universal Non-Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x08	Protocolo: MIDI Tuning Standard
0x00	Mensaje: Bulk Dump Request
[pp]	Numero de programa que se quiere afinar
0xF7	Fin de SysEx

Mensaje de volcado de tablas de afinacion:

0xF0	Byte de estado (SysEx)
0x7E	Fabricante: Universal Non-Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x08	Protocolo: MIDI Tuning Standard
0x01	Mensaje: Bulk Dump
[pp]	Numero de programa que se quiere afinar
[name]	Nombre del programa (16 caracteres ASCII no extendidos)
[data]	Datos de la tabla de afinacion
	(128 notas * 3 bytes) [Tono Base]-[Parte alta]-[Parte baja]
[cc]	Checksum
0xF7	Fin de SysEx

Este mensaje se puede utilizar tanto para extraerlas como para cambiarlas dependiendo de quien lo envie.

El valor de Checksum se calcula haciendo la XOR de todos los bytes de datos hasta antes del propio checksum.

Mensaje de cambio de afinacion de voces concretas:

0xF0	Byte de estado (SysEx)
0x7F	Fabricante: Universal Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x08	Protocolo: MIDI Tuning Standard
0x02	Mensaje: Note Change
[pp]	Numero de programa que se quiere afinar
[nn]	Numero de Notas a cambiar
[data]	Datos de la tabla de afinacion (+ voz a la que pertenecen)
	(nn notas * 4 bytes) [Voz]-[Tono Base]-[Parte alta]-[Parte baja]
0xF7	Fin de SysEx

Hay que tener en cuenta que en este mensaje es necesario indicar la voz a la que pertenece cada dato de afinacion. En los mensajes de volcado no era necesario pues se enviaba toda la tabla ordenada.

5.5. Otras ampliaciones MIDI

Notation Information

Los mensajes de notacion informan, en tiempo real, de las claves, las armaduras, las linias de compas... Su aplicacion es clara: la representacion grafica de partituras.

Utiliza el protocolo SysEx Universal RealTime 03h. Los dos siguientes mensajes cambian el tipo de compas. El mensaje asincrono lo hace en el momento de recepcion y el otro se espera a que acabe el compas actual.

Cambio asincrono de tipo de compas:

0xF0	Byte de estado (SysEx)
0x7F	Fabricante: Universal Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x03	Protocolo: Notation Information
0x02	Mensaje: Asyncron Signature Change
[ln]	Numero de Bytes que siguen (3 si no es una clave compuesta)
[nn]	Numerador de la clave
[dd]	Denominador de la clave sera la potencia de dos: 2dd
[qq]	Numero de 1/32 de nota notada en un cuarto de nota MIDI.
[parejas nn dd]	Opcional para las compuestas
0xF7	Fin de SysEx

Cambio sincrono de tipo de compas:

0xF0	Byte de estado (SysEx)
0x7E	Fabricante: Universal Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x03	Protocolo: Notation Information
0x42	Mensaje: Syncron Signature Change
[ln]	Numero de Bytes que siguen (3 si no es una clave compuesta)
[nn]	Numerador de la clave
[dd]	Denominador de la clave sera la potencia de dos: 2dd
[qq]	Numero de 1/32 de nota notada en un cuarto de nota MIDI.
[parejas nn dd]	Opcional para las compuestas
0xF7	Fin de SysEx

Barra de fin de compas:

0xF0	Byte de estado (SysEx)
0x7F	Fabricante: Universal Real Time
[dd]	Identificador de dispositivo destino (0x7F para Broadcast)
0x03	Protocolo: Notation Information
0x01	Mensaje: Bar Marker
[lb]	Numero de barra (LSB)
[mb]	Numero de barra (MSB)
0xF7	Fin de SysEx

El numero de barra es un entero con signo. Si es 0 o negativo implica

lb mb is the desired bar number, with the LSB first (ie, Intel order). This is a signed 14-bit value (low 7 bits are in lb, right-justified, and bits 8 to 14 are in mb, right-justified). Zero and negative numbers up to -8,190 indicate count off measures. For example, a value of -1 (ie, lb mb = 7F 7F) means that there is a one measure introduction. A value of zero would indicate no count off. Positive values indicate measures of the piece. The first measure is bar 1 (ie, lb mb = 01 00). A maximum neg number (lb mb = 00 40) indicates "stopped play" condition. A maximum positive value (lb mb = 7E 3F) indicates running condition, but no idea about measure number. This would be used by a device wishing to mark the passage of measures without keeping track of the actual measure number.

Real Time Cueing

Los 'cue' son puntos de interes que se insertan en la representacion. Los cues se colocan en diversos puntos a lo largo del tiempo, por lo que van de la mano del MIDI Time Code. Consiste en un conjunto de 14 mensajes que permiten posicionarlos para cualquer dispositivo compatible.

Utiliza el protocolo SysEx Universal RealTime 05h.

MIDI File Dumps

Es una extension del protocolo que estandariza la forma de transmitir ficheros via MIDI. Las aplicaciones mas directa son la transmision de ficheros MIDI, samples en formato propietario (no compatible con SDS) o cualquier tipo de informacion de configuracion. Cada fabricante implementaba su forma de hacerlo por lo que se establecio, finalmente, este estandard.

Utiliza el protocolo SysEx Universal Non-RealTime 07h.

MIDI Show Control

Esta extension pretende dar herramientas para controlar, de una forma estandard, equipo, que pese a no ser musical, forme parte de una representacion: Luces, fuegos artificiales, aparatos de video, maquinaria de escenario...

Utiliza el protocolo SysEx Universal RealTime 02h.

MIDI Machine Control

Es un protocolo de mensajes exclusivos de sistema universales para controlar sistemas de produccion multimedia. Tiene bastantes vias de expansion futura, aunque actualmente solo estandariza como controlar sistemas de audio y video.

Utiliza los protocolos SysEx Universal RealTime 06h (comandos) y SysEx Universal RealTime 07h (respuestas).

Bibliografia, Links y Referencias.

Este manual es una transcripcion ampliada de los apuntes que recogi de las siguientes fuentes:

Los amantes de la aventura encontraran mas informacion en:

Manual realizado por David García Garzón (Vokimon)

Agradecimientos


A Jeff Glatt mailto:jglatt@borg.com por sus incansables ganas de bombardearnos con sus manuales de MIDI y enseñarnos que juntar desnudos un conector DIN macho y otro hembra no es pecado.