Hola,
Hace un tiempo con un PIC16F84 armé una batería MIDI, además hice un receptor MIDI que enciende leds de acuerdo a la nota presionada. La idea era luego hacer un Dimmer recibiendo mensajes de Controladores Continuos, pero eso no lo terminé.
La mayor parte de la información la conseguí en:
http://www.harmony-central.com/MIDI/La norma MIDI es similar al RS-232, pero con niveles invertidos, en RS-232 la linea en reposo está siempre en 1, al enviar un bit se pone a 0, en MIDI es al revés. Además la velocidad de transmisión es alta: 31250 bits por segundo (cada bit dura 32 usec), con 1 bit de start, 8 bits de datos y 1 bit de stop (en notación RS-232 seria: 31250,N,8,1).
La mayoría de las PC tienen un Puerto MIDI en el puerto de Joystick:
DB15 Señal
8 VCC (5V)
12 MIDI TX (salida TTL de la PC)
15 MIDI_RX (entrada TTL de la PC)
5 GND
Para desarrollar el receptor MIDI podrias conectar el pic a este puerto y con un programa hacer que la PC envíe mensajes MIDI.
Para enviar los mensajes MIDI desde la PC podrías utilizar un secuenciador (Cakewalk Pro Audio, Cubase VST, el Sound Forge también puede enviar MIDI), el problema es que es un poco complicado aprender a utilizarlos.
Para ver los mensajes MIDI te conviene utilizar el "MIDI Monitor" que te permite ver los bytes en hexa que llegan o salen de un puerto MIDI:
http://www.harmony-central.com/Software/Windows/midimonitor.htmlOtra utilidad muy buena se llama Hubi"s MIDI loopback:
http://members.nextra.at/hubwin//midi.htmlEn RS-232 cuando una aplicación abre un puerto, ninguna otra lo puede utilizar, lo mismo pasa con MIDI, pero con este loopback se puede compartir el mismo puerto desde varios programas.
Los mensajes MIDI vienen en varias categorías por ejemplo al presionar una tecla en un teclado MIDI, este envía un mensaje "Note On" que se traduce en 3 bytes: 1 byte de STATUS 0x9X (donde el LSB lleva el canal) y dos bytes de DATOS, donde el primer byte de datos es la tecla presionada y el ultimo es la fuerza con que se presionó que se traduce al volumen con que debe sonar la nota.
ej:
0x90 0x3C 0x40 Note On/Canal 0, Middle C, Volumen 0x40.
0x91 0x3C 0x20 Note On/Canal 1, Middle C, a mitad de volumen que el anterior.
Al soltar la tecla se genera un "Note Off", similar al anterior pero el byte de STATUS es 0x8X, y el 2do byte de datos siempre debe ser 0x00.
ej:
0x80 0x3C 0x00 Note Off/Canal 0, Middle C, fuerza 0.
Para ver todos los otros tipos de mensajes MIDI fijate la Especificación MIDI:
http://www.borg.com/~jglatt/tech/midispec.htmFinalmente para conectar el PIC a cualquier dispositivo MIDI, deberías agregarle un puerto MIDI. El hardware MIDI utiliza lazos de corriente para enviar la información, esto permite mucha inmunidad al ruido y grandes longitudes de cable. Hay tres conectores normalizados marcados como MIDI IN, MIDI OUT y MIDI THRU. Un excelente referente son las interfaces MIDI para PC:
http://www.harmony-central.com/MIDI/interface.htmlEn tu caso, ya que solo querés recibir MIDI solo deberías armar el conector MIDI IN. Los optoacopladores a veces son difíciles de conseguir, el problema es que los optos comunes no tienen suficiente velocidad, sin embargo con algunas modificaciones se pueden usar 4N35 comunes.
Luego sigo con otras herramientas, técnicas y sugerencias.
Espero que te sirva.
Téc. Claudio J. Pérez
Ciberar-Sistemas & Desarrollos
Jujuy-Argentina