Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Adaptador USB MIDI

Componentes e suprimentos

Arduino Micro
Ou Arduino Leonardo
× 1
6n137 Opto coupler
× 1
1N4148 - Troca rápida para fins gerais
× 1
Capacitor 100 nF
× 1
Resistor 220 ohm
× 3
Resistor 10k ohm
× 1
Resistor de furo passante, 470 ohm
× 1
LED (genérico)
× 1
suporte de led
algo para montar o LED na caixa de plástico
× 1
Conector de áudio / vídeo DIN, 5 contatos
mais parafusos e porcas para montar os conectores
× 2
Case
Uma caixa de plástico para acomodar todos os componentes
× 1
PCB
Um pedaço de PCB genérico
× 1
Suportes PCB
Algo para montar sua PCB na caixa, como isolantes de náilon
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto


Pesquisei na rede como construir um adaptador USB para MIDI usando um Arduino, mas infelizmente só encontrei soluções que não eram tão boas (softwares de MIDI ou implementações de hardware ruins). Então decidi construir o meu próprio e colocar o resultado aqui no hackster.io.

Usei um Arduino Leonardo com uma placa de ensaio para construir o primeiro protótipo. Depois que tudo estava funcionando, construí uma versão soldada usando um Arduino Micro. Ambos são baseados no ATmega32u4, que possui USB nativo permitindo que se apresente como uma interface USB MIDI para o PC ao qual você o conecta.

O MIDI usa um optoacoplador e alguns resistores para criar um loop de corrente totalmente isolado. O circuito é bastante normal, usei um 6n137 porque é rápido e amplamente disponível. Conforme indicado pelo diagrama de circuito, apenas o conector MIDI OUT tem o pino 2 conectado ao terra, esse é o padrão para MIDI.

Algumas fotos do resultado final:

No lado do software, decidi usar a excelente biblioteca do Control Surface. Ao contrário de algumas outras bibliotecas ou implementações codificadas manualmente, o Control Surface lida corretamente com todos os diferentes aspectos do protocolo MIDI um tanto complexo.

Superfície de controle também permite adicionar todos os tipos de extras. Você pode, por exemplo, adicionar alguns potenciômetros, pedais ou botões conectados às entradas analógicas / digitais para adicionar controles MIDI extras. Basta dar uma olhada no site do Control Surface para obter mais informações, é realmente fácil de fazer!

Você também pode registrar retornos de chamada para que possa processar os dados antes de passar de MIDI para USB ou outra direção. No meu caso, usei isso para consertar a implementação de MIDI quebrada do meu sintetizador Roland D50. O D50 envia um comando "todas as notas desligadas" cada vez que a última tecla é pressionada. Implementações modernas, como a maioria dos instrumentos VST que uso, interpretam isso como um corte imediato de todas as notas de execução sustentadas. Ao filtrar "todas as notas", o D50 se torna útil novamente como um teclado mestre.

Um problema que encontrei com a biblioteca Control Surface é que ela não lida bem com grandes pacotes SysEx. Isso resultou em erros ao tentar usar um editor / bibliotecário D50, pois enviava pacotes SysEx bastante grandes. Eu adicionei instruções no título do comentário do código-fonte sobre como corrigir esse problema. A pessoa que escreveu a biblioteca indicou que esse problema seria corrigido assim que a versão 2.x fosse lançada.

Incluí o código-fonte básico da interface USB para MIDI e uma versão com filtragem "todas as notas desativadas".

Você também pode usar outras bibliotecas ou escrever sua própria implementação MIDI, é claro, o hardware deve funcionar com qualquer biblioteca MIDI com suporte a MIDI USB e MIDI serial.

Dica para solução de problemas:se você não consegue fazer esta interface falar com dispositivos MIDI externos, talvez você tenha trocado os pinos 4 e 5. Os diagramas de pinagem do conector podem ser confusos às vezes porque nem sempre indicam claramente de que lado do conector você está visualizando.

Espero que os esquemas e o código-fonte sejam úteis para todos aqui. Por favor, me dê um joinha se você gostou deste projeto e fique à vontade para deixar um comentário abaixo se você tiver alguma dúvida.

Código

  • Código-fonte para interface básica de MIDI para USB
  • Código-fonte do adaptador MIDI para USB com filtro "todas as notas desligadas"
Código-fonte para MIDI básico para interface USB Arduino
 / * * Adaptador USB MIDI. * * --- * * Para permitir pacotes sysex maiores, modifique a biblioteca da Superfície de Controle da seguinte maneira:* * In:* src \ MIDI_Parsers \ MIDI_MessageTypes.hpp * change:* uint8_t length; * para:* size_t length; * * Em:* src / Settings / Settings.hpp * alterar:* constexpr size_t SYSEX_BUFFER_SIZE =128; * para:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Isso deve ser corrigido quando o Control Surface 2.x for lançado. * * --- * * Para usar um nome de dispositivo USB diferente, edite hardware / arduino / avr / boards.txt na instalação do Arduino IDE usando privilégios de administrador. * Alterar:* leonardo.build.usb_product ="Arduino Leonardo" * para:* leonardo.build.usb_product ="..." * altere-o de volta depois de enviar o projeto para seu dispositivo Arduino. + uma fábrica de tubos MIDI para conectar as interfaces MIDI entre si e aos tubos de Control SurfaceMIDI_PipeFactory <5>; // Exemplo para adicionar controladores extras:// CCPotentiometer pot ={A0, MIDI_CC ::Expression_Controller}; // pino para o qual o poder LED está conectadoconst int ledPin =10; // configuração codevoid setup () {Serial.begin (115200); // liga o LED de alimentação pinMode (ledPin, OUTPUT); digitalWrite (ledPin, HIGH); // encaminha MIDI USB para MIDI serial midiusb>> pipes>> midiser; // encaminha o serial MIDI para o midiizador USB MIDI>> pipes>> midiusb; // envia mensagens de suface de controle apenas para MIDI USB Control_Surface>> tubos>> midiusb; // conecta MIDI USB e serial para controlar midiser de superfície>> tubos>> Control_Surface; midiusb>> tubos>> Control_Surface; // inicializa a superfície de controle _após_ conectando as interfaces Control_Surface.begin ();} // loopvoid de processamento principal () {Control_Surface.loop ();} 
Código-fonte do adaptador MIDI para USB com filtro "all notes off" Arduino
 / * * Adaptador USB MIDI com filtro "todas as notas desligadas". * * --- * * Para permitir pacotes sysex maiores, modifique a biblioteca da Superfície de Controle da seguinte maneira:* * In:* src \ MIDI_Parsers \ MIDI_MessageTypes.hpp * change:* uint8_t length; * para:* size_t length; * * Em:* src / Settings / Settings.hpp * alterar:* constexpr size_t SYSEX_BUFFER_SIZE =128; * para:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Isso deve ser corrigido quando o Control Surface 2.x for lançado. * * --- * * Para usar um nome de dispositivo USB diferente, edite hardware / arduino / avr / boards.txt na instalação do Arduino IDE usando privilégios de administrador. * Alterar:* leonardo.build.usb_product ="Arduino Leonardo" * para:* leonardo.build.usb_product ="..." * altere-o de volta depois de enviar o projeto para seu dispositivo Arduino. + uma fábrica de tubos MIDI para conectar as interfaces MIDI entre si e aos tubos de Control SurfaceMIDI_PipeFactory <4>; // Exemplo para adicionar controladores extras:// CCPotentiometer pot ={A0, MIDI_CC ::Expression_Controller}; // pino para o qual o poder LED está conectadoconst int ledPin =10; // Retorno de chamada MIDI personalizado que imprime mensagens recebidas.struct MyMIDI_Callbacks:MIDI_Callbacks {// Retorno de chamada para mensagens de canal (notas, alteração de controle, pitch bend, etc.). void onChannelMessage (Parsing_MIDI_Interface &midi) override {ChannelMessage cm =midi.getChannelMessage (); if (cm.header ==0xb0 &&cm.data1 ==0x7b) {// ignorar o retorno das mensagens de "todas as notas desligadas"; } else if (cm.header ==0x90 &&cm.data2 ==0x00) {// converter mensagens "note on" com velocidade de 0 em mensagens "note off" cm.header =0x80; } midiusb.send (cm); } // Retorno de chamada para mensagens exclusivas do sistema void onSysExMessage (Parsing_MIDI_Interface &midi) override {SysExMessage se =midi.getSysExMessage (); // encaminha mensagens exclusivas do sistema sem alterações midiusb.send (se); } // Retorno de chamada para mensagens em tempo real void onRealTimeMessage (Parsing_MIDI_Interface &midi) sobrescrever {RealTimeMessage rt =midi.getRealTimeMessage (); // encaminha mensagens em tempo real sem alterações midiusb.send (rt); }} callbacks; // configurar codevoid setup () {Serial.begin (115200); // liga o LED de alimentação pinMode (ledPin, OUTPUT); digitalWrite (ledPin, HIGH); // encaminha MIDI USB para MIDI serial midiusb>> pipes>> midiser; // envia mensagens de suface de controle apenas para MIDI USB Control_Surface>> pipes>> midiusb; // conecta MIDI USB e serial para controlar midiser de superfície>> tubos>> Control_Surface; midiusb>> tubos>> Control_Surface; // inicializa a superfície de controle _após_ conectando as interfaces Control_Surface.begin (); // definir os métodos de retorno de chamada midiser.setCallbacks (callbacks);} // loopvoid de processamento principal loop () {Control_Surface.loop ();} 

Esquemas

Apenas a guia esquemática é preenchida usb_midi_interface_twiE32gvR3.fzz

Processo de manufatura

  1. Alarme de planta de alerta de sede
  2. Word Clock italiano
  3. Apenas três pinos para um teclado 4x3
  4. Kit de bateria MIDI mínimo com impressora 3D
  5. Medidor Sigfox kWh
  6. Monitor de temperatura Bluetooth
  7. Medidor de capacitância DIY Simple Autorange (10pF-10000microF)
  8. Bloqueio controlado por gestos
  9. Uma entrada analógica isolada para Arduino
  10. Meça seu tempo de reação