La especificación MIDI
Jordi Bartolomé 10-1-2013


1-Introducción

2-Introducción y descripción de los niveles físico, eléctrico y lógico
   2.1-Sobre MIDI
   2.2-Nivel físico
       - MIDI IN
       - MIDI OUT
       - MIDI THRU
  
   2.3-Nivel eléctrico
   2.4-Nivel logico
  
3-Descripción de los códigos de operación de los Voice Messages:

       0x8X = Note off ( categoría Voice Messages )
       0x9X = Note on ( categoría Voice Messages )
       0xAX = After touch ( categoría Voice Messages )
       0xBX = Control change ( categoría Voice Messages )
       0xCX = Program change ( categoría Voice Messages )
       0xDX = Channel presure ( categoría Voice Messages )
       0xEX = Pitch Wheel ( categoría Voice Messages )
 
4-Descripción de los códigos de operación de los Generic Messages
  4.1-Categoría System Common
       0xF0 = SysEx - System Exclusive ( categoría System Common )
       0xF1 = MTC Quarter Frame Message ( categoría System Common )
       0xF2 = Song position pointer ( categoría System Common )
       0xF3 = Song Select ( categoría System Common )
       0xF6 = Tune Request ( categoría System Common )
  
  4.2-Categoría System Realtime
       0xF8 = MIDI Clock ( categoría System Realtime )
       0xFA = MIDI Start ( categoría System Realtime )
       0xFB = MIDI Continue ( categoría System Realtime )
       0xFC = MIDI Stop ( categoría System Realtime )
       0xFE = Active Sense ( categoría System Realtime )
       0xFF = Reset ( categoría System Realtime )
 
5-Control Numbers
   5.1-Control Numbers "convencionales"
       0x00 Control: Bank Select ( byte alto )
       0x01 Control: Modulation Wheel ( byte alto )
       0x02 Control: Breath Controller ( byte alto )
       0x04 Control: Foot Controller ( byte alto )
       0x05 Control: Portamento Time ( byte alto )
       0x06 Control: Data Entry ( byte alto )
       0x07 Control: Channel Volume ( byte alto )
       0x08 Control: Balance ( byte alto )
       0x0A Control: Pan ( byte alto )
       0x0B Control: Volumen de Expresión ( byte alto )
       0x0C Control: Efecto 1 ( byte alto )
       0x0D Control: Efecto 2 ( byte alto )
       0x10 , 0x11 , 0x12 , 0x13 Controles: Slider de Proposito general 1, 2, 3 y 4
       0x20 Control: Bank Select ( byte bajo )
       0x21 Control: Modulation Wheel ( byte bajo )
       0x22 Control: Breath Controller ( byte bajo )
       0x24 Control: Foot Controller ( byte bajo )
       0x25 Control: Portamento Time ( byte bajo )
       0x26 Control: Data Entry ( byte bajo )
       0x27 Control: Channel Volume ( byte bajo )
       0x28 Control: Balance ( byte bajo )
       0x2A Control: Pan ( byte bajo)
       0x2B Control: Volumen de Expresión ( byte bajo)
       0x2C Control: Efecto 1 ( byte bajo)
       0x2D Control: Efecto 2 ( byte bajo)
       0x40 Control: Hold Footswitch 1 ( o Dampp Pedal o Sustain Pedal )
       0x41 Control: Portamento Footswitch
       0x43 Control: Soft Footswitch
       0x44 Control: Legato Footswitch
       0x45 Control: Hold Footswitch 2
       0x46 Control: Sound Controller 1
       0x47 Control: Sound Controller 2
       0x48 Control: Sound Controller 3
       0x49 Control: Sound Controller 4
       0x4A Control: Sound Controller 5
       0x4B Control: Sound Controller 6
       0x4C Control: Sound Controller 7
       0x4D Control: Sound Controller 8
       0x4E Control: Sound Controller 9
       0x4F Control: Sound Controller 10
       0x50 Control: General Purpose Button
       0x52 Control: General Purpose Button
       0x54 Control: Portamento
       0x58 Control: High Resolution Velocity Prefix
       0x5B Control: Effects 1 Depth o Effects Level
       0x5C Control: Effects 2 Depth o Effects Level
       0x5D Control: Effects 3 Depth o Effects Level
       0x5E Control: Effects 4 Depth o Effects Level
       0x5F Control: Effects 5 Depth o Effects Level
       0x60 Control: Data Increment
       0x61 Control: Data Decrement (Data Entry -1)
       0x62 Control: Non-Registered Parameter Number FINE (NRPN)
       0x63 Control: Non-Registered Parameter Number COARSE (NRPN)
       0x64 Control: Registered Parameter Number FINE (RPN)
       0x65 Control: Registered Parameter Number COARSE (RPN)

    5.2-Control Numbers del tipo Channel Mode Message
       0x78 Channel Mode Message: All Sound Off
       0x79 Channel Mode Message: Reset All Controllers
       0x7A Channel Mode Message: Local Control
       0x7B Channel Mode Message: All Notes Off
       0x7C Channel Mode Message: Omni Mode Off + all notes off
       0x7D Channel Mode Message: Omni Mode On + all notes off
       0x7E Channel Mode Message: Mono Mode On
       0x7F Channel Mode Message: Poly Mode On
 
1-Introducción
Los siguientes documentos son un resumen de los aspectos más importantes de la especificación MIDI, y están dirigidos a aquellos que deseen comprender su funcionamiento pero no quieran perderse en la extensa documentación oficial de MIDI ( http://www.midi.org/ ), algo que no quedará más remedio hacer a quienes tengan la intención de realizar una implementación seria de este estándar en algún dispositivo. La información aquí expuesta se ha obtenido principalmente de dos fuentes:
   - http://www.midi.org/techspecs/
   - http://www.blitter.com/~russtopia/MIDI/~jglatt/

El resumen se organiza en cuatro documentos:
- Introducción y descripción de los niveles físico, eléctrico y lógico: en el que se hace una introducción al estándar y se explica el tipo de conectores, cables, señales eléctricas y mensajes utilizados por MIDI.
- Voice Messages: centrado en los mensajes de la categoria Voice Messages
- Generic Messages : dedicado a los dos tipos de mensaje de la categoría Generic Messages: los System Common Messages, y los System Realtime Messages.
- Control Numbers: en este apartado se lista el significado de los diferentes números de control que se utilizan en los mensajes Control Change de la Categoria Voice Messages.

2-Introducción y descripción de los niveles físico, eléctrico y lógico

2.1-Sobre MIDI
MIDI ( Musical Instrument Digital Interface ) es un estándar diseñado para la codificación digital de la información relativa a la interpretación de instrumentos musicales. En otras palabras, MIDI permite la interconexión digital de diferentes tipos de instrumentos y herramientas musicales. Este apareció en agosto de 1983 con la finalidad de facilitar la interconexión y comunicación entre los, por entonces, recién aparecidos sintetizadores digitales. En sus predecesores, los sintetizadores analógicos, esto último era relativamente simple. Su sencillez y sobre todo, la amplia aceptación por músicos y compositores ha hecho que con los años , MIDI haya sido adoptado por cada vez más fabricantes, siendo hoy en día el estándar de interconexión más utilizado en los instrumentos musicales ( controladores, sintetizadores, secuenciadores etc.) y también en las aplicaciones software que producen sonido ( incluso presentaciones multimedia o juegos ) . Así MIDI facilita la interconexión y comunicación entre controladores, secuenciadores y sintetizadores digitales y permite codificar digitalmente los eventos e información que se genera durante la utilización de prácticamente cualquier instrumento.

El estándar MIDI se compone de especificaciones físicas, eléctricas y lógicas. Durante los últimos años han aparecido implementaciones de MIDI sobre USB, Ethernet u otros buses, pero en este documento únicamente se describe la especificación MIDI original sin entrar en sus versiones más modernas. Aún y así la información aquí descrita debería servir para comprender los puntos más importantes de éste estándar en todas sus versiones, ya que estas últimas ( las implementaciones sobre USB, Ethernet ), no son más que implementaciones que de un modo u otro encapsulan los mensajes MIDI estándar.

2.2-Nivel físico
Los equipos con capacidad MIDI se interconectan entre si mediante un par trenzado apantallado de como máximo 15m de largo. Estos equipos utilizan conectores DIN de 5 pines hembra. Los cables montan, a ambos extremos, conectores DIN de 5 pines macho. La malla del cable se conecta al pin 2 y a la envolvente metálica de este conector. Los pines 1 y 3 no se utilizan y deberían mantenerse desconectados. Los pines 4 y 5 se conectan al par trenzado.
Conectores presentes en los equipos con conectividad MIDI
Extremos de los cables usados en la interconexion de equipos MIDI

Los equipos MIDI suelen disponer de 3 conectores hembra DIN 5 independientes denominados MIDI IN, MIDI OUT y MIDI THRU:

-MIDI IN ( conector de entrada ) : a través de éste conector el equipo recibe los comandos MIDI provenientes de la salida MIDI OUT o MIDI THRU de otros equipos. Por ejemplo, un sintetitzador puede recibir, provenientes de un controlador o secuenciador, la secuencia de comandos que codifican la melodía que ha de reproducir. Por tanto este es el conector de entrada de datos de los equipos MIDI.

-MIDI THRU (conector de salida) : Mediante este conector, los equipos MIDI reenvan los comandos que van recibiendo por su conector MIDI IN, es decir que esta salida actúa a modo de repetidora, enviando exactamente lo mismo que reciben en su entrada MIDI IN, y facilitando el encadenamiento de diferentes equipos. Así, todos los equipos encadenados a través de este puerto reciben todos los comandos que circulan por el bus, y procesan sólo los destinados a ellos. Por tanto la principal finalidad de este conector es permitir prolongar el lazo de corriente para facilitar la conexión de más equipos al bus, garantizando a su vez que la información MIDI llegue a todos ellos por igual.

-MIDI OUT (conector de salida ) : es la salida de datos de los equipos MIDI y se utiliza para enviar información procesada por estos hacia otros equipos MIDI. Este es, por ejemplo, el conector utilizado por un secuenciador o controlador para enviar hacia uno o varios sintetizadores la información referente a la interpretación de una melodia. Por tanto es el conector de salida de los equipos MIDI.

Hay que tener en cuenta, que a pesar de que los conectores anteriores permiten el encadenamiento de dispositivos MIDI, existe un número máximo de dispositivos que podremos conectar en serie ya que la señal se va degradado a medida que “salta” de un equipo a otro.

Los siguientes son algunos ejemplos que muestran como se podrian interconectar diferentes tipos de dipositivo MIDI:
Ej 1: Sintetizadores conectados en cascada controlados mediante un teclado MIDI ( controlador )
Ej 2:Mediante el teclado de música se envian las notas al PC donde se guardan y editan las partituras que luego se envian a los sintetizadores para hacerlas sonar.

2.3-Nivel eléctrico
La transmisión se realiza mediante un lazo de corriente sobre el par trenzado. El 0 lógico se produce al circular corriente ( 5 ma ), y el 1 lógico al no circular corriente. Esta corriente excita el optoacoplador que ha de situarse a la entrada MIIDI IN de cualquier dispositivo MIDI para aislar los equipos, y evitar los flujos de corrientes de tierra y los consiguientes fallos o errores de transmisión.

La transmisión de los mensajes MIDI se realiza en modo serie unidireccional y asícnrono a una velocidad de 31.25 Kbaud ( +/- 1%), con 10 bits transmitidos por byte: 1 start bit, 8 bits de datos y 1 stop bit ( esto hace 320 microsegundos por byte ) . Por tanto se puede implementar fácilmente un canal MIDI con cualquier equipo que disponga de un puerto serie, bastará con conectar a la salida un conversor de pulsos ( RS-232 o TTL según convenga ) a lazo de corriente MIDI.
Esquema del circuito MIDI IN
Esquema del circuito MIDI OUT y MIDI THRU

2.4-Nivel lógico
El protocolo MIDI se basa en mensajes, y cada tipo de mensaje está formado por un número diferente de bytes. El status byte es el primer byte del los mensajes MIDI. Todos los mensajes MIDI tienen un status byte que se identifica por ser el único byte que tiene el bit de más peso ( el bit 7 ) a 1. Los demás bytes del mensaje tienen este bit a 0, por lo que sólo adquieren valores del 0x00 ( 0 ) al 0x7F ( 127 ). En cambio, al tener el bit de mas peso a 1, el byte de status siempre tendrá valores comprendidos entre 0x80 ( 128 ) y 0xFF ( 255 ).
  
De estos, los comprendidos en el rango 0x80 ( 128 ) y 0xEF ( 239 ) se corresponden a mensajes que incorporan información de canal ( Voice messages ) y pueden ir dirigidos a cualquiera de los 16 canales MIDI disponibles: los primeros 4 bits del byte indican el código de operación mientras que los 4 bits restantes indican el canal al que se corresponde el comando. El uso de un número de canal permite enviar comandos a diferentes equipos por un mismo cable, de forma que sólo los equipos configurados para atender a un determinado canal escucharan los mensajes correspondientes a ese canal.
  
Los status bytes comprendidos en el rango 0xF0 ( 240 ) a 0xFF ( 255 ) están reservados para mensajes que no incorporan información de canal ( Generic messages ), y se utilizan para enviar información de interés para todos los equipos MIDI. Así cuando hay diferentes dispositivos MIDI encadenados todos escuchan estos mensajes y es su responsabilidad decidir si han de atenderlos o no. Estos mensajes se dividen a su vez en dos tipos: los comprendidos en el rango 0xF0 a 0xF7 denominados System Common messages, y los comprendidos en el rango 0xF8 a 0xFF denominados System Realtime messages.
  
-Estructura de una trama MIDI:
Status byte + Byte 0 + Byte 1 + .... + Byte n



-Rangos del status byte:
0x80 a 0xEF : Voice messages: mensajes dirigidos a canal ( el primer grupo de 4 bits, bits 0 a 3, indica el número de canal )
0xF0 a 0xFF : Generic messages: mensajes genéricos dirigidos a todos los canales. A su vez, los generic messags, se dividen en dos subrangos:
       0xF0 a 0xF7 : System Common messages
       0xF8 a 0xFF: System Realtime messages

Tipos de trama MIDI según el Status Byte

Algunos de los valores del rango no se corresponden con ningún comando estándar por lo que no se utilizan para nada, y deben ser ignorados una vez recibidos.
  
-Detalles de los status byte correspondientes al rango 0x80 a 0xEF ( Voice Messages ):
Status byte: código de operación + canal.
  bits 7...4: código de operación
      0x8= Note off
      0x9= Note on
      0xA= After touch
      0xB= Control change
      0xC= Patch change
      0xD=Channel presure
      0XE=Pitch wheel

  bits 3...0: número de canal Valores posibles para el código de operación:
      0x0 = Canal 1
      0x1 = Canal 2
      0x2 = Canal 3
      ...
      0xE = Canal 15
      0xF = Canal 16

Ejemplos:
   Byte status = 0x82 ( codigo de operación 0x8 numero de canal 0x2 ) se corresponde a la operación Note Off por el canal 2
   Byte status = 0xEA ( codigo de operación 0xE numero de canal 0xA ) se corresponde a la operación Pitch Wheel por el canal 11
  
-Detalles de los status byte correspondientes al rango 0xF0 a 0xFF ( Generic Messages ):
Status byte: 0xF + código de operación.
  bits 7...4: siempre 0xF

  bits 3...0: código de operación:
    de 0 a 7: System Common Messages
    de 8 a F: System Realtime Messages
  
-Envio de mensajes en modo "running status":
"Running status" es una técnica que se utiliza para reducir el número de bytes que se envían a través del bus MIDI. Consiste en no enviar el status byte de un comando MIDI si este es igual al del comando MIDI anterior ( mismo status byte, con mismo código de operación y canal ). Se envía únicamente el data byte, y se supone que el status byte es el mismo que el del mensaje anterior. Los controladores que utilizan el método "running status" sólo envían el status byte en el momento en el que el comando MIDI es diferente al enviado previamente. De este modo si se produce un evento cuya notificación implica el envío del mismo mensaje MIDI de forma consecutiva, usando esta técnica se enviaría únicamente el data byte actualizado del mensaje, pero no el status byte.

Los mensajes del tipo System Realtime (0xF8 a 0xFF) están formados solo por un status byte, es decir, no tienen data byte. Por este motivo, si se recibe el status byte de un mensaje del tipo System Realtime, los siguientes data bytes corresponderán al mensaje recibido antes que este último. Los status bytes de los mensajes System Realtime no afectan al "running status", y al recibirse se procesan, pero los siguientes data bytes se asocian al último Voice Message recibido antes que éste. Los mensajes del tipo System Common (0xF0 a 0xF7) cancelan el "running status" y no pueden implementarse con éste método.

Ejemplos:
Pulsación y liberación de la nota 62 (comando "0x9-Note on") sin utilizar "running status":
  0x90 0x3E 0x52 0x90 0x3E 0x00
con "running status":
  0x90 0x3E 0x52 0x3E 0x00

Variación de presión ( comando "0xD-Channel pressure") sin utilizar "running status":
  0xD0 0x12 0xD0 0x20 0xD0 0x28 0xD0 0x35 0xD0 0x4A 0xD0 0x5A 0xD0 0x45 0xD0 0x40
con "running status":
  0xD0 0x12 0x20 0x28 0x35 0x4A 0x5A 0x45 0x40

Volver a l'índice   Página siguiente (pag 2/4)
Regresar al índice de documentos