Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

USB-MIDI-Adapter

Komponenten und Verbrauchsmaterialien

Arduino Micro
Oder Arduino Leonardo
× 1
6n137 Optokoppler
× 1
1N4148 – Allzweck-Schnellwechsel
× 1
Kondensator 100 nF
× 1
Widerstand 220 Ohm
× 3
Widerstand 10k Ohm
× 1
Durchgangslochwiderstand, 470 Ohm
× 1
LED (generisch)
× 1
LED-Halter
etwas, um die LED im Kunststoffgehäuse zu montieren
× 1
DIN-Audio-/Video-Anschluss, 5 Kontakte
plus Schrauben und Muttern zur Montage der Anschlüsse
× 2
Fall
Ein Kunststoffkoffer für alle Komponenten
× 1
PCB
Ein Stück generische Leiterplatte
× 1
PCB-Halterungen
Etwas, um Ihre Leiterplatte am Gehäuse zu befestigen, wie Nylon-Abstandshalter
× 1

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Ich habe im Netz gesucht, wie man einen USB-zu-MIDI-Adapter mit einem Arduino baut, aber leider habe ich nur Lösungen gefunden, die nicht so toll waren (schlechte MIDI-Software- oder Hardware-Implementierungen). Also beschloss ich, mein eigenes zu bauen und das Ergebnis hier auf hackster.io zu stellen.

Ich habe einen Arduino Leonardo mit einem Steckbrett verwendet, um den ersten Prototyp zu bauen. Als alles funktionierte, baute ich stattdessen eine gelötete Version mit einem Arduino Micro. Beide basieren auf dem ATmega32u4, der über natives USB verfügt, sodass es sich als USB-MIDI-Interface für den PC präsentieren kann, an den Sie es anschließen.

MIDI verwendet einen Optokoppler und einige Widerstände, um eine vollständig isolierte Stromschleife zu erzeugen. Die Schaltung ist ziemlich Standard, ich habe eine 6n137 verwendet, da sie schnell und weit verbreitet ist. Wie aus dem Schaltplan hervorgeht, ist nur der MIDI OUT-Anschluss Pin 2 mit Masse verbunden, dies ist Standard für MIDI.

Einige Fotos des Endergebnisses:

Softwareseitig habe ich mich für die hervorragende Control Surface-Bibliothek entschieden. Im Gegensatz zu einigen anderen Bibliotheken oder manuell codierten Implementierungen verarbeitet Control Surface alle verschiedenen Aspekte des etwas komplexen MIDI-Protokolls korrekt.

Mit Control Surface können Sie auch alle Arten von Extras hinzufügen. Sie könnten zum Beispiel einige Potentiometer, Pedale oder Taster hinzufügen, die mit den analogen / digitalen Eingängen verbunden sind, um zusätzliche MIDI-Steuerungen hinzuzufügen. Schauen Sie einfach auf der Control Surface-Website nach, um weitere Informationen zu erhalten. Es ist wirklich einfach!

Sie können auch Callbacks registrieren, um die Daten zu verarbeiten, bevor sie von MIDI zu USB oder in die andere Richtung weitergeleitet werden. In meinem Fall habe ich dies verwendet, um die defekte MIDI-Implementierung meines Roland D50-Synthesizers zu reparieren. Der D50 sendet jedes Mal, wenn die letzte Taste gedrückt wird, einen "Alle Noten aus"-Befehl. Moderne Implementierungen, wie die meisten der von mir verwendeten VST-Instrumente, interpretieren dies als sofortigen harten Cut-Off aller laufenden Noten. Durch das Filtern des "Alle Noten aus" wird das D50 wieder als Masterkeyboard nützlich.

Ein Problem, auf das ich bei der Control Surface-Bibliothek gestoßen bin, ist, dass sie große SysEx-Pakete nicht gut verarbeitet. Dies führte zu Fehlern beim Versuch, einen D50-Editor/Bibliothekar zu verwenden, da dieser ziemlich große SysEx-Pakete sendete. Ich habe in der Kommentarüberschrift des Quellcodes Anweisungen zur Behebung dieses Problems hinzugefügt. Die Person, die die Bibliothek geschrieben hat, hat angegeben, dass dieses Problem behoben wird, sobald die 2.x-Version herauskommt.

Ich habe sowohl den grundlegenden USB-zu-MIDI-Interface-Quellcode als auch eine Version mit "Alle Noten aus"-Filterung eingefügt.

Sie können natürlich auch andere Bibliotheken verwenden oder Ihre eigene MIDI-Implementierung schreiben, die Hardware sollte mit jeder MIDI-Bibliothek mit USB-MIDI- und Serial-MIDI-Unterstützung funktionieren.

Tipp zur Fehlerbehebung:Wenn Sie dieses Interface nicht dazu bringen können, mit externen MIDI-Geräten zu kommunizieren, dann haben Sie vielleicht die Pins 4 und 5 vertauscht. Die Pinbelegungsdiagramme der Anschlüsse können manchmal verwirrend sein da sie nicht immer klar anzeigen, welche Seite des Anschlusses Sie gerade betrachten.

Ich hoffe, die Schaltpläne und der Quellcode sind für jeden hier draußen nützlich. Bitte geben Sie mir einen Daumen hoch, wenn Ihnen dieses Projekt gefällt, und hinterlassen Sie unten einen Kommentar, wenn Sie Fragen haben.

Code

  • Quellcode für grundlegende MIDI-zu-USB-Schnittstelle
  • Quellcode für MIDI-zu-USB-Adapter mit "Alle Noten aus"-Filter
Quellcode für grundlegende MIDI-zu-USB-SchnittstelleArduino
/* * USB-MIDI-Adapter. * * --- * * Um größere Sysex-Pakete zuzulassen, ändern Sie die Control Surface-Bibliothek wie folgt:* * In:* src\MIDI_Parsers\MIDI_MessageTypes.hpp * change:* uint8_t length; * bis:* size_t Länge; * * In:* src/Settings/Settings.hpp * Änderung:* constexpr size_t SYSEX_BUFFER_SIZE =128; * nach:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Dies sollte behoben werden, wenn Control Surface 2.x veröffentlicht wird. * * --- * * Um einen anderen USB-Gerätenamen zu verwenden, bearbeiten Sie hardware/arduino/avr/boards.txt in Ihrer Arduino IDE-Installation mit Administratorrechten. * Ändern Sie:* leonardo.build.usb_product="Arduino Leonardo" * in:* leonardo.build.usb_product="..." * ändern Sie es zurück, nachdem Sie das Projekt auf Ihr Arduino-Gerät hochgeladen haben. */#include  // Binden Sie die Control Surface-Bibliothek einUSBMIDI_Interface midiusb; // Verwenden Sie stattdessen diese, um alle MIDI-Daten auf den seriellen Monitor zu übertragen // USBDebugMIDI_Interface midiusb;HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD};// Create eine MIDI-Pipe-Factory, um die MIDI-Interfaces untereinander und mit den Control SurfaceMIDI_PipeFactory<5>-Pipes zu verbinden; // Beispiel für das Hinzufügen zusätzlicher Controller:// CCPotentiometer pot ={ A0, MIDI_CC::Expression_Controller }; // Pin, an dem die Stromversorgung LED ist verbundenconst int ledPin =10; // setup codevoid setup () { Serial.begin (115200); // schalten Sie die Power-LED ein PinMode (ledPin, OUTPUT); digitalWrite (ledPin, HIGH); // MIDI USB an MIDI Serial Midiusb weiterleiten>> Rohre>> Midiser; // MIDI-Seriell an MIDI-USB-Midiser weiterleiten>> Rohre>> Midiusb; // Steueroberflächen-Meldungen nur an MIDI senden USB Control_Surface>> Pipes>> Midiusb; // Verbinden Sie sowohl MIDI USB als auch seriell, um den Midiser zu steuern>> Rohre>> Control_Surface; midiusb>> Rohre>> Control_Surface; // Control Surface initialisieren _nach_ dem Verbinden der Interfaces Control_Surface.begin();} // Hauptverarbeitung loopvoid loop() { Control_Surface.loop();}
Quellcode für MIDI-zu-USB-Adapter mit "Alle Noten aus"-FilterArduino
/* * USB-MIDI-Adapter mit "Alle Noten aus"-Filter. * * --- * * Um größere Sysex-Pakete zuzulassen, ändern Sie die Control Surface-Bibliothek wie folgt:* * In:* src\MIDI_Parsers\MIDI_MessageTypes.hpp * change:* uint8_t length; * bis:* size_t Länge; * * In:* src/Settings/Settings.hpp * Änderung:* constexpr size_t SYSEX_BUFFER_SIZE =128; * nach:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Dies sollte behoben werden, wenn Control Surface 2.x veröffentlicht wird. * * --- * * Um einen anderen USB-Gerätenamen zu verwenden, bearbeiten Sie hardware/arduino/avr/boards.txt in Ihrer Arduino IDE-Installation mit Administratorrechten. * Ändern Sie:* leonardo.build.usb_product="Arduino Leonardo" * in:* leonardo.build.usb_product="..." * ändern Sie es zurück, nachdem Sie das Projekt auf Ihr Arduino-Gerät hochgeladen haben. */#include  // Binden Sie die Control Surface-Bibliothek einUSBMIDI_Interface midiusb; // Verwenden Sie stattdessen diese, um alle MIDI-Daten auf den seriellen Monitor zu übertragen // USBDebugMIDI_Interface midiusb;HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD};// Create eine MIDI-Pipe-Factory, um die MIDI-Interfaces untereinander und mit den Control SurfaceMIDI_PipeFactory<4>-Pipes zu verbinden; // Beispiel für das Hinzufügen zusätzlicher Controller:// CCPotentiometer pot ={ A0, MIDI_CC::Expression_Controller }; // Pin, an dem die Stromversorgung LED is connectedconst int ledPin =10; // Benutzerdefinierter MIDI-Callback, der eingehende Nachrichten druckt.struct MyMIDI_Callbacks :MIDI_Callbacks { // Callback für Kanalnachrichten (Noten, Control Change, Pitch Bend, etc.). void onChannelMessage(Parsing_MIDI_Interface &midi) override { ChannelMessage cm =midi.getChannelMessage(); if (cm.header ==0xb0 &&cm.data1 ==0x7b) {// Ignoriere "alle Notizen aus" Meldungen return; } else if (cm.header ==0x90 &&cm.data2 ==0x00) {// Konvertieren von "Note on"-Nachrichten mit einer Geschwindigkeit von 0 in "Note off"-Nachrichten cm.header =0x80; } midiusb.send(cm); } // Callback für systemexklusive Nachrichten void onSysExMessage(Parsing_MIDI_Interface &midi) override { SysExMessage se =midi.getSysExMessage(); // systemexklusive Nachrichten ohne Änderungen weiterleiten midiusb.send(se); } // Callback für Echtzeitnachrichten void onRealTimeMessage(Parsing_MIDI_Interface &midi) override { RealTimeMessage rt =midi.getRealTimeMessage(); // Echtzeitnachrichten ohne Änderungen weiterleiten midiusb.send(rt); } } Rückrufe; // Codevoid-Setup einrichten () { Serial.begin (115200); // schalten Sie die Power-LED ein PinMode (ledPin, OUTPUT); digitalWrite (ledPin, HIGH); // MIDI USB an MIDI Serial Midiusb weiterleiten>> Rohre>> Midiser; // Steueroberflächen-Meldungen nur an MIDI senden USB Control_Surface>> Pipes>> Midiusb; // Verbinden Sie sowohl MIDI USB als auch seriell, um den Midiser zu steuern>> Rohre>> Control_Surface; midiusb>> Rohre>> Control_Surface; // Control Surface initialisieren _nach_ die Schnittstellen verbinden Control_Surface.begin(); // setze die Callback-Methoden midiser.setCallbacks(callbacks);} // Hauptverarbeitung loopvoid loop() { Control_Surface.loop();}

Schaltpläne

Nur die Registerkarte Schaltplan wird ausgefüllt usb_midi_interface_twiE32gvR3.fzz

Herstellungsprozess

  1. Pflanzenalarm bei Durstalarm
  2. italienische Wordclock
  3. Nur drei Pins für eine 4x3-Tastatur
  4. Minimales MIDI-Drum-Kit mit 3D-Drucker
  5. Sigfox-kWh-Zähler
  6. Bluetooth-Temperaturüberwachung
  7. Selbstgemachter einfacher Autorange-Kapazitätsmesser (10pF-10000microF)
  8. Gestengesteuerte Sperre
  9. Ein isolierter Analogeingang für Arduino
  10. Messen Sie Ihre Reaktionszeit