Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

USB MIDI-adapter

Componenten en benodigdheden

Arduino Micro
Of Arduino Leonardo
× 1
6n137 Opto-koppeling
× 1
1N4148 – Snel schakelen voor algemeen gebruik
× 1
Condensator 100 nF
× 1
Weerstand 220 ohm
× 3
Weerstand 10k ohm
× 1
Through Hole-weerstand, 470 ohm
× 1
LED (generiek)
× 1
led-houder
iets om de LED in de plastic behuizing te monteren
× 1
DIN audio-/videoconnector, 5 contacten
plus bouten en moeren om de connectoren te monteren
× 2
Case
Een plastic behuizing waarin alle componenten passen
× 1
PCB
Een stuk generieke PCB
× 1
PCB-bevestigingen
Iets om uw PCB op de behuizing te monteren, zoals nylon afstandhouders
× 1

Apps en online services

Arduino IDE

Over dit project

Ik zocht op internet hoe ik een USB naar MIDI-adapter kon bouwen met behulp van een Arduino, maar helaas vond ik alleen oplossingen die niet zo geweldig waren (slechte MIDI-software of hardware-implementaties). Dus besloot ik mijn eigen te bouwen en het resultaat hier op hackster.io te plaatsen.

Ik gebruikte een Arduino Leonardo met een breadboard om het eerste prototype te bouwen. Toen alles werkte, bouwde ik in plaats daarvan een gesoldeerde versie met behulp van een Arduino Micro. Beide zijn gebaseerd op de ATmega32u4, die native USB heeft waardoor het zichzelf kan presenteren als een USB MIDI-interface voor de pc waarop je het aansluit.

MIDI gebruikt een opto-coupler en enkele weerstanden om een ​​volledig geïsoleerde stroomlus te creëren. Het circuit is vrij standaard, ik gebruikte een 6n137 omdat het snel en overal verkrijgbaar is. Zoals aangegeven in het schakelschema, heeft alleen de MIDI OUT-connector pin 2 verbonden met de grond, dit is standaard voor MIDI.

Enkele foto's van het eindresultaat:

Aan de softwarekant besloot ik de uitstekende Control Surface-bibliotheek te gebruiken. In tegenstelling tot sommige andere bibliotheken of handmatig gecodeerde implementaties, verwerkt Control Surface alle verschillende aspecten van het ietwat complexe MIDI-protocol correct.

Met Control Surface kun je ook allerlei extra's toevoegen. U kunt bijvoorbeeld een aantal potentiometers, pedalen of knoppen toevoegen die zijn aangesloten op de analoge / digitale ingangen om extra MIDI-besturingen toe te voegen. Kijk maar eens op de Control Surface-website voor meer informatie, dat is heel eenvoudig!

U kunt ook callbacks registreren, zodat u de gegevens kunt verwerken voordat u van MIDI naar USB of andersom gaat. In mijn geval heb ik dit gebruikt om de kapotte MIDI-implementatie van mijn Roland D50-synthesizer te repareren. De D50 stuurt elke keer dat de laatste toets wordt ingedrukt een "alle noten uit"-commando. Moderne implementaties, zoals de meeste VST-instrumenten die ik gebruik, interpreteren dit als een onmiddellijke harde afsluiting van alle lopende nootsustains. Door de "alle noten uit" te filteren, wordt de D50 weer bruikbaar als masterkeyboard.

Een probleem dat ik tegenkwam met de Control Surface-bibliotheek, is dat deze grote SysEx-pakketten niet goed aankan. Dit resulteerde in fouten bij het gebruik van een D50-editor/bibliothecaris, omdat deze nogal grote SysEx-pakketten verzond. Ik heb instructies toegevoegd in de commentaarkop van de broncode om dit probleem op te lossen. De persoon die de bibliotheek heeft geschreven, gaf aan dat dit probleem zou worden opgelost zodra de 2.x-versie uitkomt.

Ik heb zowel de basisbroncode van de USB naar MIDI-interface toegevoegd als een versie met "alle noten uit" filtering.

Je kunt natuurlijk ook andere bibliotheken gebruiken of je eigen MIDI-implementatie schrijven, de hardware zou moeten werken met elke MIDI-bibliotheek met USB MIDI en Seriële MIDI-ondersteuning.

Tip voor het oplossen van problemen:als het je niet lukt om deze interface met externe MIDI-apparaten te laten praten, dan heb je misschien pinnen 4 en 5 verwisseld. De pin-out-diagrammen van de connector kunnen soms verwarrend zijn omdat ze niet altijd duidelijk aangeven naar welke kant van de connector je kijkt.

Ik hoop dat de schema's en broncode nuttig zijn voor iedereen hier. Geef me een duimpje omhoog als je dit project leuk vindt en laat gerust een reactie achter als je vragen hebt.

Code

  • Broncode voor basis MIDI-naar-USB-interface
  • Broncode voor MIDI-naar-USB-adapter met "alle noten uit"-filter
Broncode voor basis MIDI-naar-USB-interfaceArduino
/* * USB MIDI-adapter. * * --- * * Om grotere sysex-pakketten toe te staan, wijzigt u de Control Surface-bibliotheek als volgt:* * In:* src\MIDI_Parsers\MIDI_MessageTypes.hpp * wijziging:* uint8_t length; * tot:* size_t lengte; * * In:* src/Settings/Settings.hpp * wijzigen:* constexpr size_t SYSEX_BUFFER_SIZE =128; * tot:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Dit zou opgelost moeten zijn wanneer Control Surface 2.x wordt uitgebracht. * * --- * * Om een ​​andere USB-apparaatnaam te gebruiken, bewerkt u hardware/arduino/avr/boards.txt in uw Arduino IDE-installatie met beheerdersrechten. * Wijzig:* leonardo.build.usb_product="Arduino Leonardo" * in:* leonardo.build.usb_product="..." * verander het terug nadat u het project naar uw Arduino-apparaat heeft geüpload. */#include  // Voeg de Control Surface-bibliotheekUSBMIDI_Interface midiusb toe;// gebruik deze in plaats daarvan om alle MIDI-gegevens naar de seriële monitor te dumpen// USBDebugMIDI_Interface midiusb;HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD};// Create een MIDI-pipe-factory om de MIDI-interfaces met elkaar en met de Control SurfaceMIDI_PipeFactory<5>-pipes te verbinden;// Voorbeeld voor het toevoegen van extra controllers:// CCPotentiometer pot ={ A0, MIDI_CC::Expression_Controller };// pin waarop de voeding LED is aangeslotenconst int ledPin =10;// setup codevoid setup() {Serial.begin(115200); // zet de power LED pinMode aan (ledPin, OUTPUT); digitalWrite (ledPin, HOOG); // doorstuur MIDI USB naar MIDI seriële midiusb>> pijpen>> midiser; // doorstuur MIDI serieel naar MIDI USB midiser>> pijpen>> midiusb; // stuur controle suface berichten alleen naar MIDI USB Control_Surface>> pipes>> midiusb; // sluit zowel MIDI USB als serieel aan om oppervlakte midiser>> pijpen>> Control_Surface te besturen; midiusb>> pijpen>> Control_Surface; // initialiseer Control Surface _after_ het aansluiten van de interfaces Control_Surface.begin();}// hoofdverwerking loopvoid loop() { Control_Surface.loop();}
Broncode voor MIDI-naar-USB-adapter met "alle noten uit"-filterArduino
/* * USB MIDI-adapter met "alle noten uit" filter. * * --- * * Om grotere sysex-pakketten toe te staan, wijzigt u de Control Surface-bibliotheek als volgt:* * In:* src\MIDI_Parsers\MIDI_MessageTypes.hpp * wijziging:* uint8_t length; * tot:* size_t lengte; * * In:* src/Settings/Settings.hpp * wijzigen:* constexpr size_t SYSEX_BUFFER_SIZE =128; * tot:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Dit zou opgelost moeten zijn wanneer Control Surface 2.x wordt uitgebracht. * * --- * * Om een ​​andere USB-apparaatnaam te gebruiken, bewerkt u hardware/arduino/avr/boards.txt in uw Arduino IDE-installatie met beheerdersrechten. * Wijzig:* leonardo.build.usb_product="Arduino Leonardo" * in:* leonardo.build.usb_product="..." * verander het terug nadat u het project naar uw Arduino-apparaat heeft geüpload. */#include  // Voeg de Control Surface-bibliotheekUSBMIDI_Interface midiusb toe;// gebruik deze in plaats daarvan om alle MIDI-gegevens naar de seriële monitor te dumpen// USBDebugMIDI_Interface midiusb;HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD};// Create een MIDI-pipe-factory om de MIDI-interfaces met elkaar en met de Control SurfaceMIDI_PipeFactory<4>-pipes te verbinden;// Voorbeeld voor het toevoegen van extra controllers:// CCPotentiometer pot ={ A0, MIDI_CC::Expression_Controller };// pin waarop de voeding LED is aangeslotenconst int ledPin =10;// Aangepaste MIDI-callback die inkomende berichten afdrukt.struct MyMIDI_Callbacks:MIDI_Callbacks {// Callback voor kanaalberichten (noten, besturingswijziging, pitchbend, enz.). void onChannelMessage (Parsing_MIDI_Interface &midi) overschrijven { ChannelMessage cm =midi.getChannelMessage(); if (cm.header ==0xb0 &&cm.data1 ==0x7b) { // negeer "alle notities uit" berichten retourneren; } else if (cm.header ==0x90 &&cm.data2 ==0x00) { // converteer "note on" berichten met een snelheid van 0 naar "note off" berichten cm.header =0x80; } midiusb.send(cm); } // Terugbellen voor systeemexclusieve berichten ongeldig onSysExMessage (Parsing_MIDI_Interface &midi) overschrijven { SysExMessage se =midi.getSysExMessage(); // stuur systeemexclusieve berichten door zonder wijzigingen midiusb.send(se); } // Terugbellen voor realtime berichten ongeldig onRealTimeMessage (Parsing_MIDI_Interface &midi) overschrijven { RealTimeMessage rt =midi.getRealTimeMessage(); // stuur realtime berichten door zonder wijzigingen midiusb.send(rt); } } callbacks;// setup codevoid setup() { Serial.begin(115200); // zet de power LED pinMode aan (ledPin, OUTPUT); digitalWrite (ledPin, HOOG); // doorstuur MIDI USB naar MIDI seriële midiusb>> pijpen>> midiser; // stuur controle suface berichten alleen naar MIDI USB Control_Surface>> pipes>> midiusb; // sluit zowel MIDI USB als serieel aan om oppervlakte midiser>> pijpen>> Control_Surface te besturen; midiusb>> pijpen>> Control_Surface; // initialiseer Control Surface _after_ het aansluiten van de interfaces Control_Surface.begin(); // stel de callback-methoden in midiser.setCallbacks(callbacks);}// main processing loopvoid loop() { Control_Surface.loop();}

Schema's

Alleen het schematabblad is ingevuld usb_midi_interface_twiE32gvR3.fzz

Productieproces

  1. Dorstalarm plantalarm
  2. Italiaanse Word Clock
  3. Slechts drie pinnen voor een 4x3-toetsenbord
  4. Minimale MIDI-drumkit met 3D-printer
  5. Sigfox kWh-meter
  6. Bluetooth-temperatuurmeter
  7. DIY Simple Autorange Capacitance Meter (10pF-10000microF)
  8. Gebarengestuurd slot
  9. The Companion IC
  10. Een geïsoleerde analoge ingang voor Arduino
  11. Meet je reactietijd