Bot una UART de hardware y el "bit banging" de software logran lo mismo: poner señales altas y bajas en un pin digital que emana del microcontrolador.
Esa señal no es adecuada para MIDI, ni para RS-232; tiene que ser acondicionada para conducir la línea correctamente.
MIDI se diferencia de RS-232. RS-232 se basa en niveles de tensión, mientras que MIDI se basa en un bucle de corriente. En realidad, MIDI no se define en términos de una especificación de corrientes o tensiones, sino mediante un diagrama de circuito de referencia.
Para manejar una línea MIDI, se proporciona una fuente de corriente que enciende y apaga un LED dentro de un optoacoplador en el otro extremo. Cuando no fluye corriente, se trata de una marca, o un 1. Un cero se indica con una fuente de corriente de 5 mA.
Puedes alimentar la corriente desde el lado de alta utilizando un circuito de transistores PNP. Un voltaje bajo de su controlador a la base del transistor encenderá los 5 mA; un nivel alto lo apagará.
Muchos de los circuitos que se pueden encontrar en Internet utilizan ingenuamente un transistor NPN, precedido de un inversor lógico, lo cual es una completa tontería porque si no tienes ya inversores en tu circuito, necesitas un chip completamente nuevo (que normalmente proporciona seis de los inversores).
Si estás manejando la comunicación en software, el tema de la inversión es discutible, por supuesto, ya que puedes invertir la lógica tú mismo, pero tiene más sentido diseñar un circuito que pueda ser reutilizado posteriormente con una UART sin necesidad de un inversor.
La tasa es de 31.250 kbps. Si lo haces por software, tienes que utilizar bucles de sincronización o cualquier otra técnica que se ajuste a esta tasa con la mayor precisión posible. Esto fue elegido para MIDI porque los relojes de 1Mhz son comunes, y 31.250 kHz es 1 MHz dividido por 32. Las tasas de baudios en serie, como 38400, no son buenos divisores de una frecuencia redonda de MHz. Un reloj de 1Mhz tiene que ser escalado a 24Mhz antes de ser divisible por 38400.
Como en la comunicación RS-232, cuando no se transmite nada, la línea está en estado 1. Por lo tanto, en MIDI esto significa que no hay flujo de corriente. MIDI utiliza el formato 8N1 para enmarcar los bytes individuales: un byte se codifica en diez bits: un bit de inicio cuyo valor es 0, 8 bits de datos y un bit de parada cuyo valor es 1. Así, se pueden transmitir 3125 bytes por segundo (tasa de bits dividida por diez).
En otras palabras, la comunicación de cada byte comienza cuando la corriente es conducida para señalar un cero. A continuación, le siguen ocho bits más que no son más que cambios de nivel sincronizados uniformemente desde el inicio del cero inicial. A continuación, la línea vuelve a ser 1 durante un periodo de reloj (el bit de parada) antes de que se pueda transmitir otro byte. El otro byte puede transmitirse después de una pausa adicional arbitraria, una pausa que no es un múltiplo de ningún reloj, por lo que se trata de asíncrono comunicación en serie.