Página 1 de 1

uart2midi

Enviado: 07 jun 2026, 11:35
por CyberX
Até agora as minhas incursões pelo MIDI têm sido apenas com o MINDSTORMS EV3, uma vez que o kernel linux do ev3dev reconhece todo o tupo de adaptadores USB MIDI, instrumentos e controladores que tenho vindo a acumular.

Agora que o pybricks já tem uma classe UART bastante evoluída, decide experimentar.

UART é basicamente uma porta série, como as antigas COM do tempo em que se usavam ratos e modems RS232. Ainda persiste nos Raspberry Pi, Arduinos e milhentos gadgets IoT.

A norma MIDI nasceu como um protocolo série, 8 bits sem paridade mais um stop bit (8N1). A única diferença relativamente a outros protocolos série ainda em uso é a velocidade: 31250 baud/s em vez dos habituais múltiplos de 9600.
Felizmente o Pybricks permite escolher o baud rate e a UART dos microcontroladores escolhidos pela LEGO não tem qualquer problema com este valor.

Restava apenas a questão do MIDI original não prever que dezenas de anos depois os microcontroladores iam usar alimentações de 3.3 Volt e níveis lógicos dependentes disso. Mas a utilização ainda é possível, desde com alguns acertos previstos nas revisões mais recentes da norma. Por exemplo para ligar o pino TX a um ficha MIDI DIN 5 convencional são necessárias 2 resistências.

Bem: um cabo Powered Up, 2 resistências, meia dúzia de linhas de código e temos um hub LEGO a enviar instruções MIDI para um sintetizador.

Na prova de conceito limitei-me a espetar as resistências e o fio de massa na ficha DIN 5 F do sintetizador. Mas depois arranjei uma cabo MIDI com ficha DIN 5 M de um lado e jack TRS M do outro (de há uns anos para cá os fabricantes começaram a usar fichas jacks por serem muito menos volumosos que as fichas DIN e provavelmente tb muito mais baratos). Foi só ligar as ditas resistências e a massa a uma ficha TRS F e pronto, temos um cabo.



o programa do video gera notas aleatórias num intervalo ajustável pelo motor da esquerda; o motor do meio ajusta a duração das notas e o motor da direita ajusta o intervalo entre cada nota.

Código: Selecionar todos

from pybricks.hubs import TechnicHub
from pybricks.parameters import Port
from pybricks.tools import wait
from pybricks.iodevices import UARTDevice
from urandom import randint
from pybricks.pupdevices import Motor

hub = TechnicHub()
ser = UARTDevice(Port.A, baudrate=31250)

mB = Motor(Port.B)
mC = Motor(Port.C)
mD = Motor(Port.D)

mB.reset_angle(0)
mC.reset_angle(0)
mD.reset_angle(0)

ba = bytearray(3)

print()
while True:
  # read motors
  note_range = 6 + 12 * int(mB.angle() / 40)
  note_length = 100 + int(mC.angle() * 5)
  tempo = 100 + int(mD.angle() * 5)

  print('Note Range:  ', note_range)
  print('Note Length: ', note_length)
  print('Tempo:       ', tempo)
  print()

  # pick a random note to play
  x = randint(60 - note_range, 60 + note_range)

  # play note
  ba[0] = 144
  ba[1] = x
  ba[2] = 127
  ser.write(ba)

  wait(note_length)

  # stop note
  ba[0] = 128
  ba[1] = x
  ba[2] = 0
  ser.write(ba)

  # pause between notes
  wait(tempo)
Agora só me falta o oposto: receber instruções MIDI. Também não é difícil mas por razões de segurança a norma requer um optoisolador entre a rede MIDI e o receptor, de preferência de um tipo com uma reação bastante mais rápida que aqueles que eu tinha na gaveta de spares.

Chegaram ontem, espero poder experimentar isto os próximos dias.

Para o Alexandre Campos: sim, com pybricks podes ligar um hub Powered Up a um RCX, só precias ajustar os níveis 3V3 para o habitual TTL de 5V.