martes, 13 de julio de 2010

Los estados corrientes de MIDI

MIDI
MIDI (Musical Instrument Digital Interface) es una interfaz multinivel (físico y enlace) ideado en 1982 que transmite información musical entre dispositivos compatibles. La forma de transmisión es mediante una comunicación serie.
La idea principal es que se transmite información musical, no de audio. Los mensajes que se transmiten los dispositivos son del tipo "toca esta nota" y "sube el volumen".
Lo más curioso del protocolo de enlace es que siempre se transmiten bytes, pero los hay de dos tipos.
  • Los que tienen a 1 su bit más significativo son los llamados "códigos de estado".
  • Los que tienen a 0 su bit más significativo son los datos de esos códigos de estado.
¿Y cómo funciona todo esto? Imaginemos que queremos tocar una nota. El código de estado para enviar una nota es (en binario) 0b10010000. Después hemos de introducir los datos. Dos para tocar una nota: 0b00111100 que indica la nota do central y 0b01010000 que es una velocidad de nota de 80.
La secuencia enviada por el cable sería:
  • 0b10010000 Código de estado: tocar nota
  • 0b00111100 Nota do central
  • 0b01010000 Volumen 80
El uso del bit que distingue entre datos y estados es fundamental si conectamos un cable MIDI en mitad de una transmisión. Inicialmente se ignoran todos los datos hasta llegar al primer estado y a partir de ahí "enganchamos" y empezamos a trabajar.


Comprimiendo datos MIDI
La distinción entre códigos de estado y datos tiene otra función de compresión de la información. Es el llamado "running status" o, en una traducción a vuelapluma, los estados corrientes. Es bien sencillo. Si queremos transmitir dos notas, ¿para qué repetir el código de estado? Se asume el anterior. Entonces, la siguiente secuencia tendría este significado:
  • 0b00010011 Dato inesperado: se ignora.
  • 0b10010000 Código de estado: tocar nota
  • 0b00111100 Nota do central
  • 0b01010000 Velocidad 80
  • 0b01000000 ¡Repetimos código de estado! Nota mi
  • 0b00111100 Velocidad 80
  • 0b01000011 ¡Repetimos código de estado! Nota sol
  • 0b00111100 Velocidad 80
  • 0b10000000 Código de estado: parar nota
  • 0b00111001 Nota la
  • 0b01000000 Velocidad 64
  • 0b10010000 Código de estado: tocar nota
  • 0b01001000 Nota do (siguiente octava)
  • 0b01010000 Velocidad 80
Más compresión
Finalmente, existe un ligero cambio en el significado de "tocar nota" para comprimir más aún los datos. Debido a que lo más común es tocar nota y parar nota, es posible parar notas usando velocidad cero en "tocar nota". De esta manera se evita enviar el código de estado para parar nota y volverlo a enviar para seguir tocando. El único inconveniente de este sistema es que no puedes decir la velocidad del parado de la nota que se toma por defecto 64.
Con este truco la secuencia de arriba quedaría:
  • 0b00010011 Dato inesperado: se ignora.
  • 0b10010000 Código de estado: tocar nota
  • 0b00111100 Nota do central
  • 0b01010000 Velocidad 80
  • 0b01000000 ¡Repetimos código de estado! Nota mi
  • 0b00111100 Velocidad 80
  • 0b01000011 ¡Repetimos código de estado! Nota sol
  • 0b00111100 Velocidad 80
  • 0b00111001 ¡Repetimos código de estado! Nota la
  • 0b00000000 Velocidad 0 = parar nota la
  • 0b01001000 ¡Repetimos código de estado! Nota do+
  • 0b01010000 Velocidad 80
A lo largo de la transmisión esta pequeña compresión ahorra muchos bytes que, en una línea serie a velocidades de 1982, es una gran diferencia.
Desgraciadamente, estos detalles perduran en el tiempo hasta hoy en día y, de vez en cuando, le da algún que otro quebradero de cabeza a los desarrolladores.

0 comentarios:

Publicar un comentario en la entrada