Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Adaptor MIDI USB

Komponen dan persediaan

Arduino Micro
Atau Arduino Leonardo
× 1
6n137 Opto coupler
× 1
1N4148 – Pengalihan Cepat Tujuan Umum
× 1
Kapasitor 100 nF
× 1
Resistor 220 ohm
× 3
Resistor 10k ohm
× 1
Melalui Resistor Lubang, 470 ohm
× 1
LED (generik)
× 1
pemegang yang dipimpin
sesuatu untuk memasang LED dalam wadah plastik
× 1
Konektor Audio / Video DIN, 5 Kontak
ditambah baut dan mur untuk memasang konektor
× 2
Kasus
Kotak plastik untuk memuat semua komponen
× 1
PCB
Sepotong PCB generik
× 1
Pemasangan PCB
Sesuatu untuk memasang PCB ke casing, seperti dudukan nilon
× 1

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Saya mencari di internet cara membuat adaptor USB ke MIDI menggunakan Arduino, tetapi sayangnya saya hanya menemukan solusi yang tidak terlalu bagus (implementasi perangkat lunak atau perangkat keras MIDI yang buruk). Jadi saya memutuskan untuk membuat sendiri dan meletakkan hasilnya di sini di hackster.io.

Saya menggunakan Arduino Leonardo dengan papan tempat memotong roti untuk membangun prototipe pertama. Setelah semuanya berfungsi, saya membuat versi yang disolder menggunakan Arduino Micro. Keduanya didasarkan pada ATmega32u4, yang memiliki USB asli yang memungkinkannya menampilkan dirinya sebagai antarmuka USB MIDI ke PC yang Anda sambungkan.

MIDI menggunakan opto-coupler dan beberapa resistor untuk membuat loop arus yang sepenuhnya terisolasi. Sirkuitnya cukup standar, saya menggunakan 6n137 karena cepat dan tersedia secara luas. Seperti yang ditunjukkan oleh diagram sirkuit, hanya konektor MIDI OUT yang memiliki pin 2 yang terhubung ke ground, ini adalah standar untuk MIDI.

Beberapa foto hasil akhirnya:

Di sisi perangkat lunak saya memutuskan untuk menggunakan perpustakaan Permukaan Kontrol yang sangat baik. Tidak seperti beberapa library lain atau implementasi yang dikodekan secara manual, Control Surface menangani semua aspek berbeda dari protokol MIDI yang agak rumit dengan benar.

Control Surface juga memungkinkan Anda menambahkan semua jenis ekstra. Misalnya, Anda dapat menambahkan beberapa potensiometer, pedal, atau tombol yang terhubung ke input analog / digital untuk menambahkan kontrol MIDI tambahan. Lihat saja situs web Control Surface untuk informasi lebih lanjut, ini sangat mudah dilakukan!

Anda juga dapat mendaftarkan panggilan balik sehingga Anda dapat memproses data sebelum meneruskan dari MIDI ke USB atau arah lainnya. Dalam kasus saya, saya menggunakan ini untuk memperbaiki implementasi MIDI yang rusak dari synthesizer Roland D50 saya. D50 mengirimkan perintah "semua nada tidak aktif" setiap kali tombol terakhir ditekan. Implementasi modern, seperti sebagian besar instrumen VST yang saya gunakan, menafsirkan ini sebagai hard cut-off langsung dari semua catatan yang berjalan. Dengan memfilter "semua nada tidak aktif", D50 menjadi berguna kembali sebagai keyboard master.

Satu masalah yang saya temui dengan perpustakaan Control Surface adalah tidak menangani paket SysEx besar dengan baik. Hal ini mengakibatkan kesalahan saat mencoba menggunakan editor/pustakawan D50, karena paket SysEx yang dikirim agak besar. Saya menambahkan instruksi di judul komentar kode sumber tentang cara memperbaiki masalah ini. Orang yang menulis perpustakaan menunjukkan bahwa masalah ini akan diperbaiki setelah versi 2.x keluar.

Saya menyertakan kode sumber antarmuka USB ke MIDI dasar dan versi dengan pemfilteran "semua catatan tidak aktif".

Anda juga dapat menggunakan perpustakaan lain atau menulis implementasi MIDI Anda sendiri, tentu saja, perangkat keras harus bekerja dengan perpustakaan MIDI apa pun dengan dukungan USB MIDI dan Serial MIDI.

Tips pemecahan masalah:jika Anda tidak dapat membuat antarmuka ini berbicara dengan perangkat MIDI eksternal, maka mungkin Anda menukar pin 4 dan 5. Diagram pin-out konektor terkadang membingungkan karena tidak selalu menunjukkan dengan jelas sisi konektor mana yang Anda lihat.

Saya harap skema dan kode sumber berguna bagi siapa pun di sini. Tolong beri saya acungan jempol jika Anda menyukai proyek ini dan jangan ragu untuk meninggalkan komentar di bawah jika Anda memiliki pertanyaan.

Kode

  • Kode sumber untuk antarmuka MIDI ke USB dasar
  • Kode sumber untuk adaptor MIDI ke USB dengan filter "semua catatan tidak aktif"
Kode sumber untuk antarmuka MIDI ke USB dasarArduino
/* * Adaptor MIDI USB. * * --- * * Untuk mengizinkan paket sysex yang lebih besar, ubah pustaka Control Surface sebagai berikut:* * Dalam:* src\MIDI_Parsers\MIDI_MessageTypes.hpp * change:* uint8_t length; * ke:* size_t panjang; * * Di:* src/Settings/Settings.hpp * ubah:* constexpr size_t SYSEX_BUFFER_SIZE =128; * ke:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Ini harus diperbaiki ketika Control Surface 2.x akan dirilis. * * --- * * Untuk menggunakan nama perangkat USB yang berbeda, edit hardware/arduino/avr/boards.txt di instalasi Arduino IDE Anda menggunakan hak istimewa admin. * Ubah:* leonardo.build.usb_product="Arduino Leonardo" * menjadi:* leonardo.build.usb_product="..." * ubah kembali setelah mengunggah proyek ke perangkat Arduino Anda. */#include  // Sertakan perpustakaan Control SurfaceUSBMIDI_Interface midiusb;// gunakan yang ini sebagai gantinya untuk membuang semua data MIDI ke monitor serial// USBDebugMIDI_Interface midiusb;HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD};// Buat pabrik pipa MIDI untuk menghubungkan antarmuka MIDI satu sama lain dan ke pipa Control SurfaceMIDI_PipeFactory<5>;// Contoh untuk menambahkan pengontrol tambahan:// CCPotentiometer pot ={ A0, MIDI_CC::Expression_Controller };// pin ke mana daya LED terhubungconst int ledPin =10;// setup codevoid setup() { Serial.begin(115200); // nyalakan pinMode LED daya(ledPin, OUTPUT); digitalWrite(ledPin, TINGGI); // meneruskan USB MIDI ke midiusb serial MIDI>> pipa>> midiser; // meneruskan serial MIDI ke midiser USB MIDI>> pipa>> midiusb; // mengirim pesan kontrol suface hanya ke MIDI USB Control_Surface>> pipa>> midiusb; // sambungkan MIDI USB dan serial untuk mengontrol midiser permukaan>> pipa>> Control_Surface; midiusb>> pipa>> Control_Surface; // menginisialisasi Control Surface _after_ menghubungkan antarmuka Control_Surface.begin();}// pemrosesan utama loopvoid loop() { Control_Surface.loop();}
Kode sumber untuk adaptor MIDI ke USB dengan filter "semua catatan tidak aktif"Arduino
/* * Adaptor MIDI USB dengan filter "all notes off". * * --- * * Untuk mengizinkan paket sysex yang lebih besar, ubah pustaka Control Surface sebagai berikut:* * Dalam:* src\MIDI_Parsers\MIDI_MessageTypes.hpp * change:* uint8_t length; * ke:* size_t panjang; * * Di:* src/Settings/Settings.hpp * ubah:* constexpr size_t SYSEX_BUFFER_SIZE =128; * ke:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Ini harus diperbaiki ketika Control Surface 2.x akan dirilis. * * --- * * Untuk menggunakan nama perangkat USB yang berbeda, edit hardware/arduino/avr/boards.txt di instalasi Arduino IDE Anda menggunakan hak istimewa admin. * Ubah:* leonardo.build.usb_product="Arduino Leonardo" * menjadi:* leonardo.build.usb_product="..." * ubah kembali setelah mengunggah proyek ke perangkat Arduino Anda. */#include  // Sertakan perpustakaan Control SurfaceUSBMIDI_Interface midiusb;// gunakan yang ini sebagai gantinya untuk membuang semua data MIDI ke monitor serial// USBDebugMIDI_Interface midiusb;HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD};// Buat pabrik pipa MIDI untuk menghubungkan antarmuka MIDI satu sama lain dan ke pipa Control SurfaceMIDI_PipeFactory<4>;// Contoh untuk menambahkan pengontrol tambahan:// CCPotentiometer pot ={ A0, MIDI_CC::Expression_Controller };// pin ke mana daya LED terhubungconst int ledPin =10;// Panggilan balik MIDI khusus yang mencetak pesan masuk. struct MyMIDI_Callbacks :MIDI_Callbacks { // Panggilan balik untuk pesan saluran (catatan, perubahan kontrol, tikungan nada, dll.). void onChannelMessage(Parsing_MIDI_Interface &midi) menimpa { ChannelMessage cm =midi.getChannelMessage(); if (cm.header ==0xb0 &&cm.data1 ==0x7b) { // mengabaikan pesan "semua catatan tidak aktif" kembali; } else if (cm.header ==0x90 &&cm.data2 ==0x00) { // mengonversi pesan "catatan aktif" dengan kecepatan 0 menjadi pesan "catatan tidak aktif" cm.header =0x80; } midiusb.send(cm); } // Panggilan balik untuk pesan eksklusif sistem void onSysExMessage(Parsing_MIDI_Interface &midi) menimpa { SysExMessage se =midi.getSysExMessage(); // meneruskan pesan eksklusif sistem tanpa perubahan midiusb.send(se); } // Panggilan balik untuk pesan real-time void onRealTimeMessage(Parsing_MIDI_Interface &midi) menimpa { RealTimeMessage rt =midi.getRealTimeMessage(); // meneruskan pesan waktu nyata tanpa perubahan midiusb.send(rt); } } callback;// setup codevoid setup() { Serial.begin(115200); // nyalakan pinMode LED daya(ledPin, OUTPUT); digitalWrite(ledPin, TINGGI); // meneruskan USB MIDI ke midiusb serial MIDI>> pipa>> midiser; // mengirim pesan kontrol suface hanya ke MIDI USB Control_Surface>> pipa>> midiusb; // sambungkan MIDI USB dan serial untuk mengontrol midiser permukaan>> pipa>> Control_Surface; midiusb>> pipa>> Control_Surface; // menginisialisasi Permukaan Kontrol _after_ menghubungkan antarmuka Control_Surface.begin(); // setel metode callback midiser.setCallbacks(callbacks);}// pemrosesan utama loopvoid loop() { Control_Surface.loop();}

Skema

Hanya tab skema yang diisi usb_midi_interface_twiE32gvR3.fzz

Proses manufaktur

  1. Alarm Tanaman Peringatan Haus
  2. Jam Kata Italia
  3. Hanya Tiga Pin untuk Keypad 4x3
  4. Minimal MIDI Drum Kit dengan Printer 3D
  5. Sigfox kWh Meter
  6. Pemantau Suhu Bluetooth
  7. Pengukur Kapasitansi Autorange Sederhana DIY (10pF-10000microF)
  8. Kunci yang Dikendalikan Gerakan
  9. Input Analog Terisolasi untuk Arduino
  10. Ukur waktu reaksi Anda