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

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Komponen dan Perlengkapan

Alat dan Mesin yang Diperlukan

Aplikasi dan Layanan Online

Tentang Proyek

Ringkasan

Sebagian besar tutorial dan proyek pengontrol MIDI hanya berdasarkan penjelasan tentang kerja Arduino, tetapi tidak begitu tentang menggunakannya di dalam DAW itu sendiri. Saya ingin membuat tutorial dengan semua hal yang diperlukan di satu tempat. Dengan proyek ini, saya ingin membantu pemula untuk lebih memahami proses pembuatan dan penggunaan pengontrol, dan saya harap ini akan berguna bagi seseorang.

Saya ingin membuat pengontrol MIDI sejak lama dan akhirnya saya melakukannya dan sekarang saya akan membagikan proyek ini dengan Anda. Saya menggunakan Arduino Uno yang tidak memiliki kemampuan untuk mengirim pesan MIDI melalui USB, jadi program khusus harus digunakan untuk itu (akan dijelaskan nanti dalam teks).

Bagian-bagian berikut akan menggambarkan rangkaian listrik, kode Arduino, serta cara menghubungkan ke komputer dan DAW, dalam hal ini Ableton.

Rangkaian

Ini adalah rangkaian yang sangat sederhana. Saya menggunakan 9 tombol push, tetapi tidak dalam matriks, karena saya ingin kemampuan untuk menekan beberapa tombol sekaligus (lebih mudah dan saya memiliki pin digital yang tidak terpakai - saya menggunakan 9, dalam matriks akan menjadi 6).

Tombol 3 ==> D2 Tombol 2 ==> D3 Tombol 1 ==> D4 Tombol 6 ==> D5 Tombol 5 ==> D6 Tombol 4 ==> D7 Tombol 9 ==> D8 Tombol 8 ==> D9 Tombol 7 ==> D10 

Pemetaan MIDI

Saya mendefinisikan 9 nada MIDI, dari 36 hingga 45, dan NOTE_ON dan NOTE_OFF.

Tutorial MIDI ini akan membantu Anda memahami bagaimana Anda dapat menggunakan bahasa MIDI untuk mengontrol perangkat apa pun yang menggunakan protokol MIDI.

#define NOTE_ONE 36 #define NOTE_TWO 37 // Definisikan semua nada di sini. #define NOTE_ON_CMD 0x90 #define NOTE_OFF_CMD 0x80 #define MAX_MIDI_VELOCITY 127 

MIDI melalui USB

Karena Arduino Uno tidak dapat mengirim nada MIDI ke DAW sendiri, kita harus menggunakan dua program tambahan - LoopMidi dan Hairless MIDI<->Serial Bridge.

Dengan LoopMidi kita membuat port MIDI virtual yang dapat kita gunakan di Hairless Midi untuk terhubung dengan port Arduino.

Penjelasan Kode

Saya membuat kelas Button dan saya menggunakannya seperti ini:

int NUMBER_BUTTONS = 9; Button Button1(4, NOTE_ONE); Button Button2(3, NOTE_TWO); Button Button3(2, NOTE_THREE); Button Button4(7, NOTE_FOUR); Button Button5(6, NOTE_FIVE); Button Button6(5, NOTE_SIX); Button Button7(10, NOTE_SEVEN); Button Button8(9, NOTE_EIGHT); Button Button9(8, NOTE_NINE); Button *Buttons[] {&Button1,&Button2,&Button3,&Button4,&Button5,&Button6,&Button7,&Button8,&Button9}; 

Untuk mempelajari lebih lanjut tentang implementasi tombol, lihat Buttons.cpp.

Karena kita tidak menggunakan resistor apa pun tetapi hanya menghubungkan tombol ke pin digital dan ground, kita menggunakan INPUT_PULLUP daripada INPUT.

//Buttons.cpp pinMode(_pin, INPUT_PULLUP); 

Salah satu bagian yang sedikit sulit dari hal ini adalah Anda tidak mencari sinyal HIGH seperti yang mungkin Anda anggap – tombol Anda akan memberikan LOW (0) saat ditekan.

 // Tombol ditekan if (state == 0) { midiNoteOn(Buttons[i]->Note,127); } // Tombol tidak ditekan if (state == 1) { } 

Ini juga berarti status tombol awal adalah 1, bukan 0.

//Buttons.cpp _state = 1; 

Setiap pesan NOTE ON memerlukan pesan NOTE OFF yang sesuai. Saat tombol ditekan, itu mengirim pesan NOTE_ON. Saat tombol dilepas, itu mengirim pesan NOTE_OFF, jadi selain status awal, saya menambahkan status terakhir yang diingat ke dalam kode.

//Buttons.cpp _lastState = 1; 

Kita hanya mengirim pesan MIDI jika status saat ini berbeda dari status terakhir.

//Buttons.cpp if(state!= _lastState) { //.... } 

Gunakan dua fungsi ini untuk mengirim pesan MIDI. Parameter fungsi adalah note dan midiVelocity (saya menggunakan kecepatan maksimum).

void midiNoteOn(byte note, byte midiVelocity) { Serial.write(NOTE_ON_CMD); Serial.write(note); Serial.write(midiVelocity); } void midiNoteOff(byte note, byte midiVelocity) { Serial.write(NOTE_OFF_CMD); Serial.write(note); Serial.write(midiVelocity); } 

Saya menempatkan logika program dalam fungsi updateButtons.

void updateButtons() { for (int i = 0; i < NUMBER_BUTTONS; i++) { int state = Buttons[i]->getButtonState(); // Tombol ditekan if (state == 0) { midiNoteOn(Buttons[i]->Note,127); } // Tombol tidak ditekan if (state == 1) midiNoteOff(Buttons[i]->Note,0); } } 

Fungsi dipanggil di dalam metode loop.

void loop() { if (NUMBER_BUTTONS != 0) updateButtons(); } 

Gunakan Pengontrol Anda dengan DAW (Ableton Live)

Sebagai pemula dalam menggunakan DAW, saya tidak tahu cara menghubungkan apa pun di sana. Saya ketika menghubungkan Korg Nanokey saya, Ableton mengenalinya sendiri dan saya dapat menggunakan pengontrol segera. Ini (tentu saja) bukan kasus dengan pengontrol Arduino, karena itu bukan perangkat HID dan PC masih mengenalinya sebagai Arduino.

Saya akan menunjukkan kepada Anda di sini cara menghubungkan dan menggunakan pengontrol MIDI Arduino Anda di Ableton Live 10.

Buka loopMIDI dan buat port MIDI virtual baru seperti pada gambar berikut.

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Buka hairless-midiserial dan tetapkan Serial port, MIDI Out dan MIDI In seperti pada gambar berikut. Untuk Serial port, kita memilih port Arduino Uno, dan untuk MIDI in dan out kita menggunakan port MIDI virtual yang kita buat pada langkah sebelumnya.

Atur baudrate ke laju yang sama dalam sketsa Arduino Anda. Buka File>Preferences, dan di sana Anda harus menetapkan baudrate.

Jika semuanya dilakukan dengan benar, Anda dapat mendebug pesan MIDI yang dikirim oleh pengontrol. Tekan tombol pada pengontrol dan periksa pesan MIDI masuk di Hairless MIDI.

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Jangan menutup Hairless MIDI!

Buka Ableton Live, dan buka tab Options, kemudian Preferences. Tab Link MIDI harus terlihat seperti pada contoh ini.

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Untuk memeriksa apakah semuanya terhubung dengan baik dan Ableton membaca pesan MIDI, kita akan melihat di sudut kanan atas Ableton. Kotak atas harus berkedip saat tombol pada pengontrol ditekan seperti yang ditunjukkan dalam contoh berikut.

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Pengontrol siap digunakan!

Pilih track MIDI. Di bagian Monitor pilih In, bukan Auto, dan di MIDI to pilih output speaker Anda. Anda seharusnya dapat mendengar keyboard Anda sekarang. Hal yang sama harus dilakukan untuk Drum rack.

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Proyek Saya yang Selesai

Saya menggunakan kotak speaker lama untuk proyek ini dan beberapa plastik yang saya temukan di rumah. Saya memotong kedua plat plastik sesuai ukuran casing dan membuat lubang untuk tombol dan satu LED yang akan saya tambahkan nanti.

Saya juga memiliki speaker lama lain dengan casing yang sama yang akan saya gunakan untuk pengontrol MIDI lain, kali ini dengan knob dan joystick.

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live
Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

To-do

- Tombol longpress untuk beralih ke mode CC.

Kode

MidiDrumPad.inoArduino
#include "Buttons.h" //------Notes------------- #define NOTE_ONE 36 #define NOTE_TWO 37 #define NOTE_THREE 38 #define NOTE_FOUR 39 #define NOTE_FIVE 40 #define NOTE_SIX 41 #define NOTE_SEVEN 42 #define NOTE_EIGHT 43 #define NOTE_NINE 44 #define NOTE_ON_CMD 0x90 #define NOTE_OFF_CMD 0x80 #define MAX_MIDI_VELOCITY 127 //------------------------ int NUMBER_BUTTONS = 9; Button Button1(4, NOTE_ONE); Button Button2(3, NOTE_TWO); Button Button3(2, NOTE_THREE); Button Button4(7, NOTE_FOUR); Button Button5(6, NOTE_FIVE); Button Button6(5, NOTE_SIX); Button Button7(10, NOTE_SEVEN); Button Button8(9, NOTE_EIGHT); Button Button9(8, NOTE_NINE); Button *Buttons[] {&Button1,&Button2,&Button3,&Button4,&Button5,&Button6,&Button7,&Button8,&Button9}; int red_light_pin= 11; int green_light_pin = 12; int blue_light_pin = 13; void setup() { Serial.begin(9600); } void loop() { if (NUMBER_BUTTONS != 0) updateButtons(); } void updateButtons() { for (int i = 0; i < NUMBER_BUTTONS; i++) { int state = Buttons[i]->getButtonState(); // Button is pressed if (state == 0) { midiNoteOn(Buttons[i]->Note,127); } // Button is not pressed if (state == 1) { midiNoteOff(Buttons[i]->Note,0); } } } void RGB_color(int red_light_value, int green_light_value, int blue_light_value) { analogWrite(red_light_pin, red_light_value); analogWrite(green_light_pin, green_light_value); analogWrite(blue_light_pin, blue_light_value); } // Send MIDI note ON void midiNoteOn(byte note, byte midiVelocity) { Serial.write(NOTE_ON_CMD); Serial.write(note); Serial.write(midiVelocity); } //Send MIDI note OFF void midiNoteOff(byte note, byte midiVelocity) { Serial.write(NOTE_OFF_CMD); Serial.write(note); Serial.write(midiVelocity); } 
Buttons.cppArduino
#include "Buttons.h" Button::Button(int pin, short note) { _pin = pin; pinMode(_pin, INPUT_PULLUP); _state = 1; _lastState = 1; Note = note; } int Button::getButtonState() { int returnValue = -1; int state = digitalRead(_pin); if(state == _lastState) return 5; if(state!= _lastState) { if(state == 0) { returnValue = 0; } else { returnValue = 1; } } _lastState = state; return returnValue; } 
Buttons.hArduino
#ifndef Buttons_h #define Buttons_h #include <Arduino.h> //Button (Pin Number, Note Number) class Button { public: Button(int pin, short note); int getButtonState(); int Note; private: int _pin; short _note; int _state; int _lastState; }; #endif 
Anda dapat mengunduh kode dari Github saya
https://github.com/sadreactonly/MidiDrumpad

Skematik

Unopad: Pengontrol MIDI Arduino yang Mulus untuk Ableton Live

Proses manufaktur

  1. Mengontrol Kecerahan LED dengan PWM melalui Tombol Push pada Arduino Mega
  2. Buat Game Gyroskop Real-Time dengan Arduino Nano & Sensor MPU-6050
  3. Proyek Sensor Suhu & Kelembaban DHT11 dengan Indikator LED dan Speaker Piezo
  4. Bangun Iron Man Arduino: Komponen, Sensor, dan Panduan Langkah demi Langkah
  5. Bangun Sensor Halangan Sederhana dengan Arduino – Tutorial Mudah LED IR & Fotodioda
  6. Find Me: Pelacak Item Cerdas dengan Arduino dan Bluetooth
  7. Pengontrol Kelembapan Arduino DIY dengan Relay – Pengaturan Tegangan Tinggi yang Aman
  8. Membuat Kubus LED 4x4x4 dengan Arduino Uno & 1Sheeld – Proyek LED Interaktif
  9. Volant Joystick Arduino Kustom untuk Gaming
  10. Arduino 101: Buat Podometer dengan Sensor DHT11 & Tampilan LCD