Sintetizadores

SysEx (IV): Módulos multitímbricos (2)

25/03/2013 por Pablo Fernández-Cid

Continuamos la presentación sobre SysEx en módulos multitímbricos que nos está permitiendo avanzar en aspectos detallados de este tipo de mensajes MIDI. Nos basamos como ejemplo en el SonicCell de Roland, aunque los conceptos, estrategias, problemas y soluciones son aplicables a otros muchos modelos y fabricantes y completan una perspectiva detallada de la gestión de SysEx MIDI para el control de sintes y equipos en vivo.

CheckSum en los mensajes SysEx

[Índice]

En la parte III mencionamos la cuestión de los Checksum en los mensajes SysEx y algunos habéis pedido que entre en más detalle.

Se trata de un byte que acompaña a los datos del SysEx para poder comprobar si ha habido errores en la transmisión (en cuyo caso se descarta el mensaje, no se atiende). No todos los fabricantes hacen uso de este tipo de comprobaciones (personalmente me parece bastante innecesario, puesto que MIDI es muy robusto si se respetan las longitudes máximas de cable). En el caso de Roland (que es lo que estoy usando en los ejemplos) sí aparece (salvo con modelos muy antiguos como el MKS50 que usamos en en anteriores entregas ).

El CheckSum se calcula combinando los valores de los bytes del mensaje SysEx. En el receptor de los mensajes se vuelve a calcular el CheckSum y si no coincide con el recibido es porque se ha producido un error. Entrar en mayor detalle técnico sobre su definición no tiene sentido aquí: normalmente no lo necesitaréis puesto que de nada sirve saber cómo se calcula si luego vuestros controladores no llevan implementado ese cálculo. Es decir: dependemos de que nuestros controladores ya lleven incorporada la posibilidad de generar CheckSum.

Hay que recalcar también que no hay una norma definida sobre cómo calcular el CheckSum y de hecho diferentes fabricantes han optado por distintas soluciones, aunque generalmente se concentra en dos tipos (para entendidos: soluciones tipo XOR y soluciones basadas en complemento a 2). Por ello no debe extrañaros que en los controladores veáis que os dejan escoger entre dos (o a veces más) tipos de cálculo de Checksum.

Además hay fabricantes que extienden el cálculo del CheckSum al mensaje completo (incluido el F0 de arranque de SysEx), otros (como Roland) sólo sobre una parte del mensaje. De forma que una de las cosas que necesitamos saber ‘leer’ en el manual del equipo y llevar a nuestro controlador es esa: dónde empieza a calcularse y dónde acaba, así como en qué posición vamos a insertar el byte de CheckSum (generalmente se inserta al final de la ristra de bytes ‘protegidos’ por el checksum). Como siempre voy a ilustrarlo con un ejemplo: Roland sólo extiende el cálculo del Checksum sobre los bytes de dirección y valor, algo así (usando el ejemplo de los mensajes del SonicCell):

Aquí tenéis un ejemplo (teclado controlador Roland A800Pro) de cómo se configura esto. Las instrucciones de este controlador nos indican que tenemos que escribir SS (Start Sum) en donde queramos que se inicie el cálculo del checksum, y S1 o S2 en la posición donde debe aparecer el valor calculado para el checksum (S1 y S2 se refieren a sendos tipos de cálculo del checksum). Quedaría así (DT era la forma de indicar en ese controlador la posición donde ha de ir el dato):


Los NovationRemote, Roland A800Pro, y TB MIDI Stuff para iPad que vengo usando para ilustrar esta serie cuentan con opciones para definir CheckSums que contemplan los formatos habituales. Hay también ese par de formatos en Novation, y tres en TB MIDI Stuff. Pero los básicos y más empleados son esos dos, con lo que es raro echar en falta otros (de hecho yo nunca he tenido que usar el tercer tipo que añade TB MIDI Stuff -para los hipertécnicos: basado en complemento a uno en vez de complemento a dos-).

Recordatorio

[Índice]

Recuerdo aquí este gráfico que ya presentábamos en la parte III para que no tengáis que volver continuamente a ella. Es una visión ‘conceptual’ del mapa de memoria del SonicCell y nos interesa especialmente el área verde.

Os recuerdo también la tabla que en la parte III denominaba ‘índice’ de la memoria del Sonic Cell (y que es la primera de toda una colección de tablas que forman la descripción del mapa de memoria en el manual):

Vamos a ‘tonear’ los sonidos

[Índice]

En la parte III vimos ejemplos de parámetros que estaban en la sección ‘System’. Vamos ahora con la parte relativa a Tones, Patches y Performances, la más interesante. Si recordáis la arquitectura de este módulo, hasta 4 Tones se reúnen en un Patch, y hasta 16 Patches en una Performance multitímbrica. Cada Patch o Performance contiene también la programación correspondiente a las unidades de efecto que usa.

El mapa de memoria es la clave para localizar el parámetro que deseamos modificar. Hay que ser muy organizado en recorrer por orden las tablas y subtablas necesarias, naciendo desde este ‘índice’ y saltando paso a paso hasta llegar al parámetro deseado, lo vemos con un ejemplo.

Pensemos primero en el modo monotímbrico (el modo Patch). La dirección en el mapa de la memoria ‘temporal’ en la que está el Patch que se usa en este modo es 1F 00 0000 (lo vemos en el ‘índice’). En esa dirección es donde arranca toda la memoria en la que se albergan los parámetros del Patch ‘en uso’.Como podemos esperar, un Patch tiene una estructura que se detalla en tablas posteriores. Concretamente la tabla ‘Patch’:

Vemos como un Patch reúne determinados ajustes propios (Patch Common y Patch TMT) y contiene la definición de los hasta 4 Tones que puede usar el Patch y de los ajustes adecuados para los efectos que han de usarse en ese Patch (MFX, Chorus, Reverb).

El detalle de esas secciones está en nuevas subtablas. Por ejemplo en la referida a ‘Patch Common’ encontraremos el volumen, octava, afinación, legato/ portamento, mono/poly, etc. así como un juego de lo que más adelante llamaré ‘parámetros macro’ (y que serán muy útiles para retocar de un solo golpe los cuatro Tones que componen el Patch). También es aquí donde residen las asignaciones y mapeos de controladores (las clásicas matrices de modulación que permiten encaminar el aftertouch o la rueda hacia donde nos interese). Generalmente serán ajustes que no modificaremos en directo.

Continuando en orden, las subsecciones MFX, Chorus y Reverb son las que contienen los parámetros para sendas unidades de efecto que se usamos con ese Patch. Por ejemplo, si al tocar un patch de órgano quisiéramos tener control del Leslie en potenciómetros y pulsadores externos, deberíamos interesarnos por el detalle de PatchCommon MFX (que es donde estará o podríamos colocar el Leslie, y tendríamos acceso a su veintena de parámetros -lo veremos más adelante-).

Patch TMT es una sección que no se tocará generalmente en directo, así que no entro en ella (contiene la estructura con la que se van a combinar los 4 Tones: si van a combinar sus filtros en serie o en paralelo, y cosas por el estilo).

Y finalmente aparecen los espacios reservados para los 4 Tones del Patch. Un Tone está compuesto, en esencia, de:

  • Oscilador (aquí llamado WG, wave generator) con su propia envolvente (Pitch ENV).
  • Filtro multimodo (TVF, time variable filter) con su propia envolvente (TVF ENV).
  • Amplificador variable (TVA, time variable amplifier) con su propia envolvente (TVA ENV).
  • 2 LFOs programables (en infinidad de maneras, incluso con una ‘secuencia’ definida por pasos).
  • y otros muchos elementos y detalles en los que ni paramos.

En total aproximadamente unos 200 parámetros. El detalle de lo que hay en un Tone se describe en la tabla ‘Patch Tone’ (reproduzco sólo una parte mínima de ella):

(...etc...)

(...etc...)

Vamos ahora a crear mensajes para actuar sobre estos parámetros de los ‘Tone’ que forman parte de un Patch.

Ejemplos de mensajes SysEx para los Tone

[Índice]

Podemos ir recopilando estas direcciones base y ‘offsets’ para obtener la dirección definitiva de cada parámetro y así poder crear el mensaje SysEx oportuno (repasa la parte III si no recuerdas la estructura de los mensajes SysEx del SonicCell).

En la tabla ‘índice’ veíamos:

  • 1F 00 0000 Dirección ‘base’ del patch ‘en uso’

En la tabla ‘Patch’ veíamos:

  • -- 00 20 00 Offset (dentro del patch) para el patchtone 1
  • -- 00 22 00 Offset (dentro del patch) para el patchtone 2
  • -- 00 24 00 Offset (dentro del patch) para el patchtone 3
  • -- 00 26 00 Offset (dentro del patch) para el patchtone 4

En la tabla ‘PatchTone’ veíamos:

  • -- -- 00 00 Offset (dentro delpatchtone) para el Tonelevel (volumen)
  • -- -- 00 48 Offset (dentro delpatchtone) para el TVF CutoffFrequency (frecuencia de corte)

Necesito ‘agrupar’ todas esas direcciones y offsets. Por ejemplo, si quiero poder gobernar con 4 faders la mezcla (el nivel) de los cuatro tones que componen un sonido, puedo usar estos mensajes (repasa la parte III si no recuerdas qué son Dev, Val y CSum):

(Para el Tone1) F0 41 Dev 00 00 25 12 1F 00 20 00 Val Csum F7
(Para el Tone2) F0 41 Dev 00 00 25 12 1F 00 22 00 Val Csum F7
(Para el Tone3) F0 41 Dev 00 00 25 12 1F 00 24 00 Val Csum F7
(Para el Tone4) F0 41 Dev 00 00 25 12 1F 00 26 00 Val Csum F7

Con esos 4 faders (o con un control X-Y) podría controlar la combinación de los 4 tones (lo cual nos recuerda a lo que se comercializó en su día como ‘síntesis vectorial’). Os muestro en vídeo un control XY desde un iPad(con TB MIDI Stuff) usado para gobernar precisamente estos cuatro parámetros. En el eje X se controla el nivel del Tone 1 (con recorrido 0 a 127) y de Tone3 (con recorrido 127 a 0, para que sea complementario) y en el eje Y se hace lo propio con Tone2 y Tone 4.

http://www.youtube.com/watch?v=wfm8akC_vOs

Si quiero poder gobernar el filtro, y dado que en un Patch hay 4 Tones, usaría (fijaos que sólo cambia en el mensaje la dirección)

F0 41 dev 00 00 25 12 1F 00 20 49 Val Csum F7
F0 41 dev 00 00 25 12 1F 00 22 49 Val Csum F7
F0 41 dev 00 00 25 12 1F 00 24 49 Val Csum F7
F0 41 dev 00 00 25 12 1F 00 26 49 Val Csum F7

Ahora que ya sabemos cómo interpretar toda esta maraña de códigos, espero que os parezca un poco más sencillo. Se trata de saber localizar el parámetro deseado, obtener su dirección, y llevarla al formato de mensaje SysEx que nuestro equipo use.

No soy un pulpo: los parámetros ‘macro’

[Índice]

Pero, pensemos un momento. Para gobernar la frecuencia de corte en un Patch ¿tengo que ser capaz de mover 4 controles a la vez? ¡Pero sí sólo tengo dos manos!
El caso práctico anterior es arquetípico. Tengo un patch y quiero controlar el ‘brillo’ a través de la frecuencia de corte del filtro. Pero hay 4 Tones en un Patch. ¿A cuál de los cuatro voy a tocar la frecuencia de corte?

Usar cuatro potenciómetros me da un control enorme, pero quizá no necesito ni quiero tanto, depende del objetivo. Puede ser interesante si uso los 4 Tones para disponer de 4 elementos de sonido como si fueran cuatro sintes superpuestos que aún quiero gobernar individualmente (si lo uso como un ‘stack’ de cuatro sintes). Pero muchas veces no quiero tanto, sólo deseo ajustar el brillo global (y mover 4 pots para eso es demasiado).

Una posibilidad que se nos puede ocurrir es que un solo fader envíe los cuatro mensajes. Pero hay dos problemas:

  1. Si usáis un Remote, un A800Pro o en general casi cualquier superficie de control, sólo os deja especificar un mensaje por cada control (no cuatro). Si usáis soluciones ‘software’ como TB MIDI Stuff para iPad eso no es un problema (puede enviar tantos mensajes combinados como deseéis desde cada control). Pero sigue existiendo el otro problema:
  2. Si usáis un único control para ajustar las cuatro frecuencias de corte, vais a ajustar los cuatro Tones al mismo valor, y eso seguramente no es lo correcto (cada Tone tenía el filtro abierto o cerrado en distinta medida, y usar este control único haría que adopten los cuatro la misma frecuencia de corte, con lo que alteramos el sonido de forma no deseada)

Afortunadamente hay una solución. Dentro de los parámetros de un Patch están disponibles los parámetros detallados de sus 4 Tones, pero también mencionamos una tabla ‘PatchCommon’. Allí, entre otras cosas, encontraremos unas especies de ‘macros’ para los ajustes más frecuentes (como frecuencia de corte, resonancia, ataque, decay, sustain, release,…). Cuando modifico esos parámetros ‘macro’ lo que harán es gobernar simultánemente los correspondientes parámetros en los 4 Tones a la vez (lo veremos en seguida con un vídeo).

Si os fijáis bien, estos parámetros ‘macro’ no se definen como un valor ‘absoluto’ sino como un ‘offset’: al actuar sobre un parámetro ‘macro’ lo que haremos es sumar o restar (mover hacia arriba o hacia abajo) cada uno de correspondientes parámetros en los 4 tones a la vez. Pero no se trata de ajustar un valor concreto e idéntico en ellos, sino de desplazar el valor ‘central’ que existía originalmente en cada Tone del Patch.

Lo podemos ver en este vídeo:

¿Quién nos iba a decir que el SonicCell podría hacer estos sonidos ‘atmospherics’ en constante evolución, verdad? Pues podéis conseguir exactamente lo mismo con casi cualquier módulo/sinte que sea GM o en general multitímbrico. Todo es cuestión de imaginación y de SysEx.

Los mensajes para el control individual de la frecuencia de corte de cada Tone ya los hemos presentado antes. El mensaje para el control ‘simultáneo’ de los 4 (a partir de las posibilidades que ofrece ‘PatchCommon’) es:

F0 41 dev 00 00 25 12 1F 00 00 22 Val Csum F7

Vemos, una vez más, como se trata de entender bien la estructura genérica del mensaje y saber obtener las direcciones de los parámetros deseados. Conseguir que el primer parámetro nos funcione puede llevar algo de tiempo, pero los demás son pan comido.

Parámetros absolutos y relativos (0/127 versus -64/63)

[Índice]

Fijaos en el ejemplo que acabamos de mencionar. El parámetro ‘Frecuencia de corte’ del filtro de un Tone tenía un recorrido 0 a 127, y el valor especifica el valor absoluto de la frecuencia de corte (0 para filtro enteramente cerrado y 127 para enteramente abierto, en el caso de un paso bajo tradicional).

(en ‘Patch Tone’) 00 48 0aaa aaaa TVF Cutoff Frequency (0-127)

Sin embargo el parámetro ‘macro’ que mencionamos había en ‘Patch Common’ es un parámetro que realiza un ajuste ‘relativo’, modifica (hacia arriba o hacia abajo) el valor que estuviera ajustado en el Patch como frecuencia de corte ‘inicial’ en cada uno de los 4 Tones de ese sonido. Y podéis ver en la tabla ‘PatchCommon’ que los valores que admite son descritos de dos maneras: 1 a 127 y -63 a +63

(en ‘Patch Common’) 00 22 0aaa aaaa Cutoff Offset (1-127) -63 - +63

¿Cómo se ve esto a la hora de programar los controladores? En algunos casos los controladores ofrecen escoger un rango 0-127 o -64/63: se trata sólo de cómo mostrarán en su propia pantalla el valor. En realidad los valores que viajan por el cable siguen siendo bytes comprendidos entre 00000000 y 01111111. El que los interpretemos nosotros de una u otra forma (como si esos 128 valores posibles recorrieran el rango 0 a 127 o el rango -64 a 63) no los cambia. Es sólo una conveniencia nuestra para entenderlos mejor.

Recuperemos un ejemplo más sencillo que usamos ya en la primera entrega: el mensaje Universal SysEx para Master Coarse Tune (que desplaza +/-24 semitonos la afinación). En los Novation Remote se puede especificar para los controles el uso de un rango -64/+63 o bien 0/127, sin embargo en el Roland A8000Pro sólo veremos 0/127. Pero no importa: con cualquiera de ellos podemos crear el mensaje.

Aquí os ofrezco el ajuste para ese ‘Master Coarse Tune’ en Remote y en A800Pro (para los valores máximo y mínimo en A800Pro debéis recordar que 28h es 40 decimal, y que 58h es 88 decimal, o más sencillo aún, debéis sumar y restar 24 respecto a 64, dado que 64 decimal es el valor que en la escala 0..127 corresponde al ‘centro’ o ‘cero’ de la escala -64..63).

Otro ejemplo (ahora con un mensaje específico de SonicCell y no con mensajes SysEx universales). En la tabla Patch Common uno de los parámetros es este:

00 11 0aaa aaaa Patch Coarse Tune (16-112) -48 - +48

Como podéis suponer se trata de poder cambiar +/- 48 semitonos la afinación ‘gruesa’. La información del manual es fácil de entender: nos dice (directamente, sin que tengamos nosotros que hacer los cálculos) que podemos usar los valores 16 a 112 para recorrer el intervalo -48 a +48 semitonos. En el Remote especificaríamos formato -64/63 y pondríamos mínimo y máximo -48 y +48. En el A800Pro, dado que siempre especificamos en formato 0/127, usaríamos los valores mínimo y máximo 16 y 112 (que corresponden a 64-48 y 64+48).

En definitiva, se sigue la regla de que el valor 64 (01000000 en binario) se convierte en el 0 cuando debemos interpretar el byte como si tuviera signo. Las primeras veces puede que os rasquéis un poco la cabeza hasta entenderlo y que tengáis que hacer algunas pruebas hasta conseguir que os funcione, pero no es tan difícil si repasáis estos ejemplos que os he dado.

Pulsadores, selectores de valores y botones inc/dec

[Índice]

Muchas veces existen parámetros que no se definen por un rango numérico continuo sino por un conjunto discreto de opciones. Es el típico caso de parámetros que ajustamos no con pots y faders sino con pulsadores o selectores. Por ejemplo el tipo de onda en un LFO. En el SonicCell hay nada menos que 13 formas de onda posibles. ¿Cómo represento eso en mi controlador?

Para que un control tenga este tipo de comportamiento nos basta poder indicar su valor máximo y mínimo (0 y 12 en este caso). Si se trata de un fader o pot ese ajuste hará que en realidad en un recorrido completo sólo envíe 13 posibles mensajes. En cierta medida, hemos convertido el fader o pot en un ‘selector’ (salvo que no notaremos la ‘detención’ en cada una de esas 13 posiciones). Otra alternativa sería contar con sendos botones para cada una de las opciones (haría cómoda e inmediata la selección, pero ocuparíamos un montón de botones para ello).
Pero hay otra opción: en los controladores podemos especificar un ‘rango’ para un botón, y hacer que con cada pulsación se acuda al ‘siguiente’ valor. Para una selección de forma de onda no es mala opción y esos son el tipo de ajustes que veremos a nuestro alcance en los sistemas de control.

Esta es la descripción de ese parámetro en la tabla ‘Part Tone’ y la forma de representarlo en Remote y A800Pro (el mensaje SysEx no os lo pongo, os queda como ejercicio):

Que no os preocupe el que la tabla diga que el formato del byte de datos es 000aaaa (sencillamente sucede que como no pasa del valor 12 no llega a usar los bits altos).

Cuando el control en vez de un pot o fader es un pulsador, podremos generalmente configurar (tal como estáis viendo) el tipo de comportamiento deseado. Por ejemplo en el Remote: un botón que sólo envíe el mensaje cuando sea pulsado (‘Normal’), o que envíe un mensaje al ser pulsado y otro al soltarlo (‘Momentary’), o un botón que cada vez que se pulsa conmuta entre dos valores (‘Toggle’) o un botón que cada vez que se pulsa pasa al ‘siguiente’ valor de un rango (‘Step’).
Con el A800Pro tenemos opciones equivalentes en el desplegable ‘Button Mode’.

Próxima (y definitivamente última) entrega

[Índice]

Aunque pensaba haber hecho una serie a 4 partes, finalmente será necesaria una quinta. Esa entrega (ahora sí, última) ya está lista, así que se publicará en breve. En ella se atienden:

- Control de las unidades de efecto
- Valores con más de 7 bits (más allá del 0-127)
- Gestión de combinaciones multitímbricas (performances)
- Usos de SysEx con las partes dedicadas a batería y percusión (generalmente la parte ‘10’)

Estoy convencido de que especialmente la parte de control de efectos y de control de los mapas de batería/percusión os va a dejar deseosos de poneros manos a la obra sobre vuestros equipos en cuanto la leáis, pueden conseguirse cosas muy atractivas. Os espero allí.

Te puede interesar