sábado, 24 de marzo de 2012

Prueba de sonido: Ardsynth_test

Ahora que nuestra clase ardsynth funciona correctamente y recibimos eventos MIDI podemos empezar a probar algún pequeño programa para comprobar que nuestro sistema puede reproducir sonidos sencillos.
Sintetizador analógico - Cables y módulos (se parece al Pure Data, ¿no?)

Ardsynth_test.pd

Para ello hemos creado un nuevo patch (programa) en Pure Data en el que hemos instanciado un objeto de la clase ardsynth, que es una representación virtual del Arduino y el cual nos transfiere los eventos MIDI ya empaquetados en mensajes inteligibles por el lenguaje.

Como se puede ver en la imagen, tenemos un objeto recieve $0-ardsynth-out que es el que lanza los eventos recibidos. En primer lugar separamos los mensajes cuyo byte de comando sea mayor que 248 (explicación de la estructura de los mensajes MIDIaquí), ya que pertenecen a instrucciones que no necesitamos (salvo los que sean iguales a 254, que redirigimos a un módulo diferente).

Una vez separados los mensajes, realizamos 3 tareas diferentes en nuestro programa:
  • Separamos los 3 bytes de los mensajes que llegan del flujo de instrucciones ya filtradas y los pasamos por un subpatch llamado 'pd simple note synth', que cumple la función de un pequeño sintetizador monofónico (sólo puede hacer sonar una única nota a la vez).
'pd simple note synth'
  • Dirigimos también el flujo de instrucciones útiles a otro subpatch llamado 'pd printMidi', el cual se encarga de mostrar por consola el contenido de los mensajes de una forma más visual, asociando el valor de los bytes de los mensajes a los nombres de las correspondientes acciones (de esta forma, el mensaje 144-60-88 aparece en pantalla como "Channel 0-Note ON-60-88").
'pd printMidi': primer diseño

Active sensing

La tercera y última tarea que el programa realiza es el control de un recurso del protocolo MIDI llamado Active Sensing. Citando a la especificación:
"Active Sensing. Use of this message is optional. When initially sent, the receiver will expect to receive another Active Sensing message each 300ms (max), or it will be assume that the connection has been terminated. At termination, the receiver will turn off all voices and return to normal (non-active sensing) operation."

Los mensajes utilizados para el Active Sensing son precisamente los que tienen el número 254 como byte de comando que hemos redirigido antes. Introduciéndolos en nuestro subpatch 'pd active sensing' conseguimos generar una señal que nos indica si hay realmente un dispositivo MIDI conectado al Arduino o no.


'pd active sensing'

Este tipo de mensaje es enviado por muchos dispositivos MIDI para informar al resto de elementos conectados a él de que sigue activo. Para mostrar su utilidad, ponemos un ejemplo:

Imagina que tenemos un controlador MIDI, como un piano controlador (que no genera sonidos, sino únicamente mensajes MIDI), conectado a varios dispositivos que generan sonidos a partir de los mensajes que el piano les manda (en la imagen, a un ordenador y a un módulo sintetizador).

Si pulsamos una tecla en el piano (enviamos un mensaje NoteON) y apagamos el piano antes de soltarla, el resto de dispositivos a los que les ha llegado el mensaje sabrán que tienen que tocar una nota (gracias al mensaje NoteON), pero no sabrán cuando dejar de hacerlo porque no van a recibir ningún mensaje NoteOFF, ya que el piano está apagado.

De esa forma, el ordenador y el sintetizador estarían tocando indefinidamente esa nota, pero como poseemos un sistema que sabe si el piano está conectado o no, podemos hacer que cuando dejen de notar la presencia del controlador dejen de tocar cualquier nota que les hubiera mandado previamente.

No hay comentarios:

Publicar un comentario