Sintetizador MIDI de 16 teclas con polifonía de 16 voces

6 julio, 2010

En este artículo os presentamos un proyecto que puede servir a cualquiera para introducirse en el mundo del MIDI mediante microcontroladores.

Se trata de un teclado de 16 teclas que puede enviar secuencias MIDI con polifonía de 16 voces, diseñado por el amigo Luis Ortiz, que nos lo envía para compartirlo con vosotros.

 


 

¿Porqué un sintetizador MIDI?

El protocolo MIDI ha sido ampliamente aceptado y utilizado por músicos y compositores desde su concepción en 1983. La transferencia de datos MIDI es un método muy eficiente para la representación de la interpretación musical, y esto hace que el protocolo MIDI sea un protocolo atractivo, no sólo para compositores o intérpretes sino para aplicaciones informáticas en las que se generan sonidos, como juegos de ordenador o aplicaciones multimedia.

Gracias a la publicación de la especificación General MIDI, ampliamente aceptada en sistemas PC/MIDI, con soporte para la mayoría de los sistemas operativos existentes en la actualidad, y al bajo coste de los sintetizadores musicales, el protocolo MIDI se ha extendido usándose en un amplio rango de posibilidades.

Este protocolo ofrece una conversión estandarizada de la música como datos. La información MIDI se transmite en mensajes MIDI, los cuales pueden indicar a un sintetizador la forma en la que interpretar una pieza de música. El sintetizador que recibe los mensajes MIDI debe generar los sonidos con los que interpretar dicha pieza.

La transmisión de datos MIDI es unidireccional asíncrona, con una velocidad de 31.25 Kbit/sec, transmitiendo 10 bits por byte (bit de comienzo, 8 bits de datos y un bit de parada). El interfaz MIDI en un instrumento digital posee tres conectores diferentes, nombrados como IN, OUT y THRU. La trama de datos MIDI normalmente es generada por un controlador MIDI, como un teclado MIDI (objetivo de nuestro proyecto), con el que poder interpretar nuestra pieza favorita, transformando nuestra interpretación musical en datos MIDI en tiempo real. La salida MIDI de un controlador MIDI se transmite a otros dispositivos usando el conector MIDI OUT.

¿Cuál es nuestro objetivo?

Nuestro primer objetivo es pasarlo bien con lo que hacemos así que no es nuestra finalidad hacer un prototipo comparable a un modelo comercial, sino adentrarnos en este mundo de una forma sencilla, didáctica y práctica.

Explicado lo anterior, usaremos un microcontrolador tipo 16F877A para crear un teclado MIDI maestro (teclado mudo), con el que interpretar lo que queramos dentro de las 16 teclas de las que dispondremos.

Así el microcontrolador se encarga de verificar cada una de las teclas, crear el mensaje MIDI a enviar, y enviarlo en función de la tecla o de las teclas pulsadas.

Si no se pulsa ninguna tecla el sistema no realiza acción alguna.

MIDI

Como puedes comprobar, hemos utilizado una entrenadora comercial, la EasiPIC4. Pero el esquema para que cualquiera pueda montarlo es bien sencillo:

MIDI Esquema

Programa

Este es el código que cargamos en el microcontrolador

program MidiSynth
dim pressed_released, note as byte
dim Flag as boolean[16]
sub procedure  snd_midi_on_msg(dim note_played as byte)
Uart1_Write($90)
Uart1_Write(note_played+36)
Uart1_Write(127)
end sub
sub procedure snd_midi_off_msg(dim note_muted as byte)
Uart1_write($90)
Uart1_Write(note_muted+36)
Uart1_Write(0)
end sub
main:
TRISB=255
TRISD=255
PORTB=0
PORTD=0
pressed_released = 0
for note=0 to 15 step +1
Flag[note]=0
next note
note=0
Uart1_Init(31250)
While true
for pressed_released=0 to 7 step +1
if ((portb.pressed_released=1) AND (Flag[pressed_released]=0)) then
note=pressed_released
snd_midi_on_msg(pressed_released)
Flag[note]=1
end if
if ((portd.pressed_released=1) AND (Flag[pressed_released+8]=0)) then
note=pressed_released+8
snd_midi_on_msg(note)
Flag[note]=1
end if
if ((portb.pressed_released=0) AND (Flag[pressed_released]=1)) then
note=pressed_released
snd_midi_off_msg(pressed_released)
Flag[note]=0
end if
if ((portd.pressed_released=0) AND (Flag[pressed_released+8]=1)) then
note=pressed_released+8
snd_midi_off_msg(note)
Flag[note]=0
end if
next pressed_released
Wend
end.

Con este programa verificamos qué tecla se ha pulsado, si la tecla estaba pulsada o estaba en reposo, y en función del estado anterior al estado presente, el sistema genera el mensaje MIDI correspondiente o se queda a la espera de un nuevo cambio en el teclado.
Para ello hacemos un barrido constante de los pines de los puertos PORTB y PORTD del microcontrolador. Posteriormente, en función de la tecla del puerto que hayamos pulsado se calcula el valor de la nota pulsada o liberada (pressed_released).

Si la tecla estaba en reposo se enviará el mensaje snd_midi_on_msg(note), mediante el procedimiento del mismo nombre con el valor calculado para la variable “note”. Con este mensaje iniciamos la generación del dato MIDI y en función del instrumento que hayamos seleccionado en un módulo generador de sonidos MIDI, o en un ordenador, oiremos el sonido correspondiente a la nota pulsada.

Si la tecla estaba pulsada y se libera, se enviará el mensaje snd_midi_off_msg(note), haciendo que cese el sonido que hemos producido manteniendo la tecla pulsada.

Para la creación del cable de conexión entre el microcontrolador y un interfaz MIDI-USB, como el usado para este proyecto, es mejor que el esquema del circuito, ya que si el cable para la transmisión de los datos lo soldáis al pin equivocado no oiremos nada, debido a que el mensaje no llega al receptor.

Y como para muestra un botón, os dejamos el siguiente video.

Gracias Luis

Share

Etiquetas: , , ,