Sintetizadores

SysEx (I): el MIDI más ‘SexSy’

Celebrando los 30 años de MIDI, arrancamos una mini-serie sobre los mensajes de sistema exclusivo (system exclusive o ‘SysEx’), que permiten personalizar al máximo el control y la expresividad que podemos obtener de nuestros equipos. ‘SysEx’ es la sal y el picante de MIDI. ¿Vas a renunciar a probarlo?

SysEx nos permite recuperar el lema “un parámetro, un control” que estaba presente de forma innata en los sintetizadores analógicos de antaño. Incluso nuestros equipos más cerrados (como tantos sintes y efectos en módulo que sólo pueden editarse con software desde ordenador) admiten vía SysEx el control y retoque del sonido detallado (pudiendo usar diversos controladores y sus mandos físicos), a menudo haciendo aflorar funciones inalcanzables de otra forma.

En este primer artículo tendremos que pecar un poco del lado de la teoría. Es cierto que se trata de una parte de MIDI desatendida por muchos porque exige una cierta mentalidad y conocimiento técnico, pero a cambio de un esfuerzo, no pequeño pero abordable para cualquiera, la recompensamerece la pena.

Recordatorio sobre la norma MIDI

Supondremos en estos artículos que ya conocéis los fundamentos de MIDI. Si necesitáis recordarlos, tenéis disponible un tutorial en https://www.hispasonic.com/reportajes/protocolo-midi/13 (además de otras muchas fuentes y manuales gratuitos, como este de Roland). Si manejáis el inglés podéis ir directamente a la web de la MMA (MIDI ManufacturersAssociation, que es la responsable del mantenimiento de la norma) y su sección tutorial: http://www.midi.org/aboutmidi/tutorials.php

Los que queráis refrescar la estructura de los mensajes MIDI podéis encontrarla en: http://www.midi.org/techspecs/midimessages.php

Hago un brevísimo recordatorio orientado hacia lo que nos interesa aquí (dejando de lado muchas cuestiones y detalles). Esencialmente MIDI define diversos tipos de mensajes que un equipo puede enviar a otro. Los mensajes (como en tantos otros sistemas digitales) están compuestos por bytes (grupos de 8 bits), y lo más frecuente es que los mensajes MIDI se formen con tres bytes (aunque los hay de más y de menos).

El primer byte de cada mensaje actúa como una ‘cabecera’ que describe el tipo acción y los demás completan los detalles. Por ejemplo, un primer byte puede decir que hay que activar una nota en el canal midi 3y los dos siguientes informarán respectivamente de cuál es la nota y de la velocidad (o fuerza) con la que debe sonar.
Para distinguir fácilmente los bytes de ‘cabecera’ de mensaje, cumplen en MIDI una característica: tienen su bit más alto a 1. Los demás bytes de cada mensaje tienen a 0 ese bit alto.Un mensaje será por tanto un byte tipo 1xxxxxxx que puede ir seguido de varios de tipo 0xxxxxxx.

Para los mensajes más habituales (como los de nota, pitch bend, controladores, cambios de programa, aftertouch, etc.) descripciones básicas como las que encontraréis en los enlaces proporcionados son suficientes. Son fáciles de entender. Por ejemplo

1001cccc 0nnnnnnn 0vvvvvvv son los tres bytes de un mensaje de encendido de nota

Este mensaje corresponde a encender la nota número ‘nnnnnnn’ con velocidad ‘vvvvvvv’ en el canal ‘cccc’.

  • ‘cccc’ es el espacio (de 4 bits) en el que se especifica el número de canal, que puede estar entre 0000 y 1111, valores binarios que corresponden a valores decimales 0 a 15 (asociados a los canales MIDI 1 a 16; sí: el canal MIDI 1 se indica físicamente en los mensajes con un valor 0, y el canal 16 mediante el valor 15).
  • El byte ‘0nnnnnnn’ especifica el número de notaque se debe interpretar (y puede valer entre 00000000 y 01111111, o lo que es lo mismo, en decimal, entre 0 y 127).
  • El byte ‘0vvvvvvv’ especifica la velocidad (fuerza) con la que se debe ectivar/desactivar esa nota (de nuevo entre 0 y 127).

Así, 10010000 01000000 01111111 es un ‘note on’ en el canal MIDI 1 para la nota 64 (el do central) y a tope de velocidad (127).

Otro ejemplo: 1011cccc 0nnnnnnn 0vvvvvvv son los tres bytes de un mensaje de controlador (como la rueda de modulación, el breath control, los pedales de expresión o sostenido, etc.), en los que ‘cccc’ especifica el canal, ‘0nnnnnnn’ es el número de controlador, y ‘0vvvvvvv’ es el valor o posición del controlador. Volveremos a hablar de ellos cuando veamos que son insuficientes para el grado de control que podemos desear desarrollar en muchos equipos.

Los mensajes SysEx: para qué

Los mensajes ‘SysEx’ dentro de MIDI son la parte más excéntrica (aunque también la más versátil). Son, por su propia definición, mensajes que no están predefinidos ni siguen siempre una misma estructura. Cada fabricante, y para cada modelo de equipo, define mensajes SysEx específicos, y por tanto el detalle de los mismos debe estudiarse para cada instrumento. Esencialmente sólo está definido cómo empiezan y cómo acaban (para poder distinguirlos de los demás), el resto lo define cada fabricante. Estos mensajes se detallan para cada equipo ya sea en la guía de usuario o en un documento aparte de especificaciones MIDI (‘MIDI specification’, ‘SysEx Implementation’, ‘Detailed MIDI Specification’ o semejantes). Pero lo cierto es que entendidos los mensajes SysEx de uno o dos equipos, los demás son pan comido. La curva de aprendizaje para manejarlos es larga al principio, pero una vez superada estás en condiciones de trabajar con cualquier nuevo aparato y exprimir al máximo su potencial.

Sobre los usos previstos para los mensajes SysEx, la norma MIDI cita que

Permiten a los fabricantes crear sus propios mensajes y por tanto

  • hacer accesible cualquier funcionalidad de sus equipos a través de MIDI
  • modificar los parámetros de un sonido (dando opción a ‘tocar’ cualquiera de los elementos del motor de síntesis o efecto, aunque no exista un control físico externo en el equipo)
  • realizar volcados de datos (como cuando cargamos o transferimos bancos de programas hacia un ordenador)

Establecen un mecanismo para la futura especificación de nuevos mensajes MIDI no previstos en su definición inicial (asegurando que MIDI pueda crecer hacia nuevas áreas). Por ejemplo se han podido contemplar cosas tan dispares como

  • volcado de muestras vía MIDI (SDS: sample dump standard)
  • código de tiempo MIDI (MTC: MIDI Time Code)
  • diversos otros mensajes que amplían la norma MIDI con funciones no previstas inicialmente

Ejemplos

Como motivación he preparado varios vídeos breves (disculpas por su -mala- calidad) mostrando algunos usos que doy habitualmente a los mensajes SysEx. Os resumo también en texto algunas de las virtudes de SysEx.

  • Posibilidad de usar superficies de control (con pots, faders y botones) para poder ‘moldear’ con las manos y desde controles físicos cualquier parámetro interno del equipo.

  • Acceso a parámetros completamente inalcanzables desde los controles y menús del propio equipo (por ejemplo, se da mucho con la programación de efectos en sintes y pianos, no todos sus parámetros están alcanzables en los menús pero sí vía SysEx)

  • Combinar múltiples sonidos superpuestos en un único canal MIDI, pero aún así pudiendo retocar niveles, filtros, y lo que haga falta independientemente para cada uno (útil para manejar combinaciones multitímbricas en directo)

  • Una transposición más transparente (sin desplazamiento de las divisiones de teclado)

  • Posibilita en grabaciones MIDI una automatización que no se refiera sólo a los parámetros tradicionales de la mezcla, sino a los de la síntesis o los efectos. Algo habitual en soluciones plug-in pero que podemos también hacer con equipos hardware a través de mensajes SysEx.
  • Otro uso típico es el de volcar las programaciones de sonidos ya sea hacia ordenador (para tener copia de seguridad o cargar nuevos bancos, etc.) o incluso dentro de las propias pistas MIDI en el secuenciador (para retener la definición de los sonidos grabada en el propio tema en el secuenciador –y no depender de tener cargados la programación de los sonidos en el equipo-)

Y un largo etcétera.

¿Esto qué Hex? El formato hexadecimal

Si vamos a trabajar en SysEx es necesario entender el formato hexadecimal, porque acaba siendo el más cómodo y se usa con frecuencia en los manuales. Aunque al principio cuesta es un formato sencillo de entender y aprender.
Si pensamos en un byte, como por ejemplo 00100101 (escrito en binario), podemos estudiarlo dividido en dos grupos de 4 bits, que serían en el ejemplo 0010 y 0101. La notación hexadecimal lo que hace es sustituir cada grupo de cuatro bits por un solo carácter (usamos las primeras letras para ir más allá del 9) de la siguiente manera:

Bits (valor decimal) dígito hexadecimal
0000 (0) 0
0001 (1) 1
0010 (2) 2
0011 (3) 3
0100 (4) 4
0101 (5) 5
0110 (6) 6
0111 (7) 7
1000 (8) 8
1001 (9) 9
1010 (10) A
1011 (11) B
1100 (12) C
1101 (13) D
1110 (14) E
1111 (15) F

Así, para representar un byte (8 bits), en lugar de escribir una larga ristra de bits, podemos escribir sólo dos caracteres hexadecimales. Veamos algunos ejemplos:
00000000 = 00h (la ‘h’ la usamos para indicar que es un valor hexadecimal);
00000010 = 02h
00100110 = 26h
10010011 = 93h
10100011 = A3h
01111111 = 7Fh
11110000 = F0h
11110111 = F7h
11111111 = FFh

Pensando en términos de MIDI, los diferentes tipos de mensaje se distinguen por su primer byte, que puede ser

  • 80h (.. hasta 8Fh): apagado de nota (note off) en los canales 1 (hasta 16)
  • 90h (.. hasta 9Fh): encendido de nota (note on) en los canales 1 (hasta 16)
  • A0h (.. hasta AFh): ‘aftertouch’ polifónico en los canales 1 (hasta 16) –muy pocos teclados generan este tipo de información: exige que cada tecla produzca individualmente su propio ‘aftertouch’ en lugar de existir uno común para todas-
  • B0h (.. hasta BFh): cambio de un controlador en los canales 1 (hasta 16)
  • C0h (.. hasta CFh): cambio de programa en los canales 1 (hasta 16)
  • D0h (.. hasta DFh): ‘aftertouch’ de canal (que actúa sobre cualquier nota) en los canales 1 (hasta 16)
  • E0h (.. hasta EFh) es ‘pitch bend’ en los canales 1 (hasta 16)
  • F0h (.. hasta FFh): los bytes que empiezan por F son para otros usos en los que no hay distinción del canal MIDI como por ejemplo las señales MIDI Clock y Start/Stop/Continue; y otras varias (remitimos a las fuentes ya citadas para más detalle). Nos interesan aquí F0 (arranque de un SysEx) y F7 (marca de final de SysEx).

Como ejemplo, el mensaje que antes vimos para un encendido de nota (10010000 01000000 01111111) se escribiría en hexadecimal como 90 40 7F -he suprimido la indicación de la ‘h’ para simplificar-).

Lo que nos importa del formato hexadecimal es convivir con él. Que no nos extrañe leerlo. A la hora de usar control SysEx bastará con que sepamos ‘copiar’ los bytes que el manual de cada equipo establezca. Casi un ‘corta y pega’ desde los manuales hacia nuestros controladores, pero que tenemos que saber leer y manejar sin miedo.

Estructura de un mensaje SysEx

Un mensaje SysEx MIDI es una ristra de bytes que comienza con F0h (11110000). Detrás de él vendrá un número cualquiera de bytes, pero que tendrán su bit alto a 0 (serán de tipo 0xxxxxxx). Para indicar el final de un mensaje de SysEx, se utiliza otro byte de los que comienzan por 1, concretamente F7h (11110111). En definitiva un mensaje de SysEx arranca con F0h, acaba con F7h y entre medias lleva un contenido de bytes 0xxxxxxx en número variable según el mensaje de que se trate.

Si el mensaje es para retocar un parámetro (por ejemplo para activar/desactivar un ‘Leslie’ en una unidad de efecto o para ajustar el ‘decay’ en una envolvente) bastarán unos pocos bytes. Si el mensaje es un volcado de todo un programa (o incluso de todo un banco de programas, o el contenido íntegro de un equipo) será, lógicamente, mucho más extenso.

Ya hemos dicho que los mensajes ‘SysEx’ suelen ser específicos para cada modelo y fabricante. Lo primero que se indica detrás de F0h en un mensaje SysEx es precisamente cuál es el fabricante, lo que se llama el ‘identificador’ (ID) del fabricante. El código de fabricante lo asigna la organización que gestiona MIDI (el MMA).
Los códigos 01h hasta 1Fh se reservaron para fabricantes americanos, del 20h a 3Fh para Europa y de 40h hasta 5Fh para Japón. El rango 60h-7Fh se reservó inicialmente para usos futuros. Así todos los mensajes SysEx de Sequential empiezan con F0h 01h; el F0h 21h corresponde a SIEL; Roland usa F0h 41h ; Korg F0h 42h; Yamaha F0h 43h; etc.

El código 00h quedó inicialmente reservado y es el que se ha usado para permitir un mayor número de IDs de fabricante (con sólo un byte sólo ‘caben’ poco más de un centenar). Si el ID empieza con 00h hay que considerar los dos bytes siguientes para completar un ID largo. De esa forma se dispone de un nuevo espacio que va desde 00h 00h00h hasta 00h 7Fh 7Fh, y que tiene hueco para más de 15000 fabricantes adicionales.

El formato de los mensajes SysEx será de este tipo

11110000 0iiiiiii [0iiiiiii 0iiiiiii] 0ddddddd … 0ddddddd 11110111

Donde además del primer y último bytes (F0h y 7Fh respectivamente) aparecen 1 [opcionalmente 3] bytes para identificación del fabricante y un número indeterminado de bytes de datos (que hemos señalado como 0ddddddd … 0ddddddd).

Los mensajes ‘universal SysEx’

Aunque el verdadero poder de SysEx es el que corresponde a los mensajes 100% ‘exclusivos’ (aquellos que cada fabricante define para cada modelo de equipo), para poder empezar con algo más sencillo, hablaremos aquí de los ‘universal SysEx‘, que serán ya de utilidad práctica.
Son mensajes que usan el formato de los mensajes de sistema exclusivo pero que se han definido por la MMA con una estructura y significado concreto. Cualquier fabricante y equipo puede reconocer/generar estos menajes (respetando su significado): no son ‘exclusivos’ para un fabricante, aunque siguen el formato de los mensajes ‘SysEx’.

Para señalar que un mensaje SysEx en vez de ser para un fabricante concreto es ‘universal’, se han reservado losID de fabricante 7E y 7F. Haremos un rápido resumen centrado en presentar algo que pueda ser útil a todos (nuevamente el detalle más completo en: http://www.midi.org/techspecs/midimessages.php y sobre todo, en el manual de cada aparato, donde podréis conocer todos los mensajes que acepta y genera un equipo concreto).

Universal SysEx non-realtime

Los mensajes de tipo F0h 7Eh… son mensajes SysEx universales de tipo ‘no tiempo real’, se trata de mensajes que no tienen que ver con la ejecución ‘en directo’ de un tema. Por ejemplo son los que se usan en el MIDI Sample Dump Standard (una forma -lentísima- de enviar ‘samples’ a través de MIDI y que usaban algunos samplers antiguos para transferir muestras hacia/desde ordenador). También para algunos comandos de MTC (MIDI Time Code) como los referidos a ajustar los puntos de pinchazo (punch-in / punch-out). Existen también mensajes de este tipo para realizar microafinación de la escala (y que siendo universales harán que todos los instrumentos pasen a aplicar la escala tal como la hayamos definido, sin tener que ajustarla uno por uno). Hay también mensajes de activación y desactivación del modo General MIDI (y también del modo DLS, para ‘downloadable sounds’). Y podríamos seguir con otros muchos usos. En el manual de vuestros equipos estará especificado cuáles de estos mensajes genera/reconoce cada máquina.

Universal SysEx realtime

Los mensajes de tipo F0h 7Fh… son mensajes de sistema exclusivo universal para uso en tiempo real durante la interpretación. Un ejemplo son los comandos de MTC (MIDI Time Code) que informan del avance del tiempo (el equivalente MIDI del código SMPTE). Los comandos MSC (MIDI Show Control) también usan ‘real-time universal SysEx’ para control de montajes audiovisuales y multimedia. Acudid al enlace que dimos más arriba para conocer otros.

Nos vamos a centrar en un grupo de estos mensajes al que podréis encontrar utilidad: Master Volume, Master Balance, Master Fine Tuning, Master CourseTuning. Son cuatro mensajes que permiten regular el volumen, balance, afinación en cents, y afinación en semitonos de cualquier dispositivo MIDI que los reciba y los sepa interpretar. Veamos el primero de ellos.

Nuestro primer mensaje SysEx: ‘Master volume’

Los mensajes de controlador (CCs) habituales solo actúan sobre un canal MIDI (y nos permiten regular la mezcla entre canales). No existe un mensaje de controlador previsto para gobernar el volume global (de todos los sonidos a la vez). Esa carencia queda resuelta con este mensaje:

F0 7F 7F 04 01 ll mm F7

que pasamos a desgranar:

F0 Comienzo de SysEx

7F Señala que es un SysEx universal de tipo realtime

7F Aquí podría venir un valor cualquiera entre 00h y 7Fh (hablaremos de ello el próximo día). De momento nos basta saber que si vale 7Fh cualquier sintetizador que reciba este mensaje lo atenderá (una especie de ‘oídlo todos, que nadie se haga el sordo’).

04
01
Estos dos bytes con valores 04 y 01 definen este mensaje como destinado a modificar el volumen global

LLh (un byte de tipo 0lllllll)
MMh (un byte de tipo 0mmmmmmm)
El valor del volumen deseado se especifica fraccionado en dos trozos: ‘MM’(entre 00h y 7Fh) es el trozo más significativo y ‘LL’ (entre 00h y 7Fh) el resto. Entre ambos forman un número de 14 bits mmmmmmmlllllll. De esa forma el control del volumen no está limitado a 128 posibles valores (como sucedería con un único byte de tipo 0xxxxxxx), sino que tiene una mayor resolución (tiene 16384 escalones, suficientemente fino para permitir ajustes detallados).

F7 Final del SysEx

En realidad el control del volumen no necesita ser tan exquisito, de forma que habitualmente se pone a ceros LL y sólo tiene contenido útil MM. De tal forma que se suele usar para controlar el volumen global un mensaje de este tipo:

F0 7F 7F 04 01 00 xx F7

donde xx representa el volumen deseado entre 127 (7Fh) para el máximo y 0 (00h) para el mínimo.

Si tenemos cualquier controlador que pueda generar SysEx (comentaremos alternativas en otra entrega de la serie) podremos escribir ese mensaje y conseguir que el movimiento de un ‘fader’ o de un potenciómetro genere precisamente ese tipo de control: un volumen ‘maestro’ que controlará simultáneamente el volumen de todos los canales MIDI en todos los dispositivos que tengamos conectados y recibiendo este mensaje. De golpe, y a toque de un único control, gobierno el volumen de todos mis aparatos MIDI.
Programad un ‘fader’ o un ‘pot’ con el mensaje F0 7F 7F 04 0100xx F7 en un Behringer BCR, un NovationRemote SL, un Roland A800Pro, la app TB MIDI Stuff (para iPad), o tantos otros dispositivos con capacidad para generar SysEx. Asunto resuelto.

‘Master Fine Tuning’

Podríamos haber hecho también un ajuste de ‘panorámica’ global con: F0 7F 7F 04 02 ll mm F7, lo cual (no os lo negaré) parece poco interesante . Pero pensad ahora en este:

F0 7F 7F 04 03 ll mm F7 (Master Fine Tuning)

Os han contratado para acompañar a un instrumentista, el cual dice que toca afinado a La=445 Hz y no acepta de ningún modo La=440.¿Vais a empezar a retocar uno a uno vuestro sintes para la nueva afinación?Aún peor: ¿y si en la segunda parte de la gala viene otra persona y sí toca en La=440Hz? ¿Os da tiempo en el descanso a rehacer todo sin errores?
Lo dicho antes: programad un control que genere el mensaje ‘Master Fine Tuning’ y se acabó el problema.

‘Master Course Tuning’ y la transposición ideal

De acuerdo: he ido a un ejemplo enrevesado (casi todos usamos 440Hz.). Voy con otro (y este sí que me pasa a menudo): lo que comentaba al principio respecto a la transposición. Si (como yo acostumbro) habéis realizado un gran esfuerzo de programación para conseguir ‘splits’ y ‘layers’ que os permitan tocar todos los sonidos necesarios desde un único teclado controlador, no podéis fiaros del habitual ‘transpose’ del controlador. Volved sobre el vídeo: los puntos de división cambian de lugar cuando aplicáis la transposición que ofrecen los teclados.

Con el mensaje F0 7F 7F 04 04 ll mm F7 (Master Course Tuning) podéis modificar en semitonos (hacia arriba y hacia abajo) la afinación de todos los instrumentos MIDI que tengáis conectados. Al toque de un control transponéis todo vuestro arsenal de sintes a otra tonalidad y estáis listos para empezar, con la tranquilidad de saber que las divisiones siguen en su sitio.

Aún no hemos visto los dientes al lobo

Realmente no hemos ni arañado la potencia magnífica que se puede alcanzar con el uso de los mensajes SysEx. Sólo hemos mencionado unos (muy pocos) mensajes ‘SysEx universal’, que precisamente por ser universales no son la parte interesante de algo que quiere ser ‘exclusivo’. Pero con este primer artículo nos hemos preparado para poder entender lo que nos viene encima en el próximo.

Si algo no habéis entendido, preguntad. Intentaré aclarar lo que haga falta para que no os desenganchéis y podáis aprovechar lo próximo que escriba. Si ya no os aterroriza ver escrito F07F 7F 04 0400 xx F7, vamos por buen camino.

Pablo Fernández-Cid
EL AUTOR

Pablo no puede callar cuando se habla de tecnologías audio/música. Doctor en teleco. Ha creado diversos dispositivos hard y soft y realizado programaciones para músicos y audiovisuales. Toca ocasionalmente en grupo por Madrid (teclados, claro).

¿Te gustó este artículo?
65
Comentarios

Regístrate o para poder comentar