uart2midi

Para os mais especializados em mecânica e electrónica em LEGO.
Responder
Avatar do Utilizador
CyberX
Sócio
Sócio
Mensagens: 4536
Registado: 10 mar 2014, 20:09
Localização: Mira Sintra
Contacto:

uart2midi

Mensagem 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.
Jorge Pereira
«De génio, criança e louco... porquê só 1 pouco?»
Avatar do Utilizador
CyberX
Sócio
Sócio
Mensagens: 4536
Registado: 10 mar 2014, 20:09
Localização: Mira Sintra
Contacto:

Re: uart2midi

Mensagem por CyberX »

CyberX Escreveu: 07 jun 2026, 11:35 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.
Tive finalmente oportunidade de experimentar isto e funciona bem mas como estou a usar uma breadboard não me atrevo ainda a levar isto de um lado para o outro para não se soltar nada, primeiro vou tentar soldar isto numa PCB básica. Mas funciona, ligo a um teclado MIDI e vejo as mensagems a chegar (por exemplo Note ON quando uma tecla de piano é primida e Note OFF quando é libertada).

Em breve uma demo decente.

A quem por aqui anda, qual é a diferença entre uart2midi/midi2uart e os dispositivos custom que fiz há uns meses a emular devices LEGO com Raspberry Pi Picos (midi2pu e pu2midi)?

- primeiro menos electrónica logo supostamente mais simples e barato;
- segundo zero programação externa ao LEGO em si - electrónica clássica, sem microcontroladores;
- terceiro, derivado do segundo: a library de Arduino que usei para custom devices não está perfeita, por vezes crasha. Além disso quando a adaptei ao MIDI não permitia muitas notas em simultâneo (ou seja muitas mensagens em sequência rápida); com isto a única limitação é o buffer interno do próprio Hub LEGO que não será problema ao ritmo relativamente baixo que o MIDI usa;
Jorge Pereira
«De génio, criança e louco... porquê só 1 pouco?»
Responder