Daftar Isi:

MIDI Drum Kit di Python dan Arduino: 5 Langkah (dengan Gambar)
MIDI Drum Kit di Python dan Arduino: 5 Langkah (dengan Gambar)

Video: MIDI Drum Kit di Python dan Arduino: 5 Langkah (dengan Gambar)

Video: MIDI Drum Kit di Python dan Arduino: 5 Langkah (dengan Gambar)
Video: DIY Electronic Drums - Arduino MIDI Drums 2024, November
Anonim
Image
Image
Kit Drum MIDI dengan Python dan Arduino
Kit Drum MIDI dengan Python dan Arduino
Kit Drum MIDI dengan Python dan Arduino
Kit Drum MIDI dengan Python dan Arduino

Saya selalu ingin membeli drum kit sejak saya masih kecil. Saat itu, semua peralatan musik tidak memiliki semua aplikasi digital seperti yang kita miliki saat ini, sehingga harga dan ekspektasi terlalu tinggi. Baru-baru ini saya memutuskan untuk membeli drum kit termurah dari eBay, dengan satu-satunya prioritas: Kemampuan untuk meruntuhkannya dan memasang perangkat keras dan perangkat lunak saya sendiri ke perangkat.

Pembeliannya sama sekali tidak mengecewakan: Kit drum roll-up portabel dengan 9 bantalan suara yang berbeda, dua pedal sakelar kaki untuk kick drum dan soket daya hi-hat dan micro-USB. Apa yang benar-benar menurunkan motivasi, itu adalah suara output (Penggunaan sebenarnya untuk kit ini adalah untuk menghubungkan speaker eksternal dan menikmatinya). Jadi, saya memutuskan untuk mengubahnya menjadi programmable saya sendiri melalui USB, MIDI drum kit berbasis Arduino dan User Interface berbasis Python, untuk penggunaan praktis dan modifikasi mudah seperti, volume, nada dan pilihan saluran.

Fitur perangkat:

  • Harga rendah
  • Membuat drum kit dari input digital apa pun - bahkan berbagai tombol tekan
  • Dukungan komunikasi dan catu daya hanya melalui antarmuka USB - Integrasi konverter USB ke UART dan perangkat Arduino
  • Suku cadang mininum untuk pengoperasian yang benar
  • UI berbasis Python yang mudah digunakan
  • Dukungan MIDI lengkap dengan kecepatan yang dapat disesuaikan, catatan, dan pin Arduino
  • Simpan & Muat konfigurasi drum khusus yang disimpan di memori perangkat

Mari kita lanjutkan ke proyek…

Langkah 1: Teori Operasi

Teori Operasi
Teori Operasi
Teori Operasi
Teori Operasi
Teori Operasi
Teori Operasi

Diagram Blok

Pertama-tama, mari kita fokus pada struktur proyek, dan membaginya menjadi blok-blok terpisah:

Perangkat Drum Roll-Up

Unit utama proyek. Ini terdiri dari 9 bantalan drum terpisah, di mana setiap bantalan adalah serangkaian tombol yang mengubah status logikanya saat dipukul. Karena strukturnya, ada kemungkinan untuk membuat drum kit khusus ini dari tombol tekan apa pun. Setiap drum pad terhubung ke resistor pull-up pada papan elektronik utama, sehingga saat drum pad dipukul berulang kali, sakelar khusus diikat ke ground sirkuit dan logika LOW hadir pada jalur drum pad. Ketika tidak ada tekanan yang diberikan, sakelar bantalan drum terbuka dan karena resistor pull-up ke saluran listrik, logika TINGGI hadir pada saluran bantalan drum. Karena tujuan dari proyek ini adalah untuk membuat perangkat MIDI digital yang lengkap, semua bagian analog pada PCB utama dapat diabaikan. Penting untuk diperhatikan, bahwa drum kit memiliki dua pedal untuk kick drum dan hi-hat, yang juga terikat pada resistor pull-up dan memiliki logika operasi yang sama dengan semua bantalan drum (Kita akan membahasnya nanti.).

Arduino Pro-Mikro

Otak dari drum kit. Tujuannya adalah untuk mendeteksi apakah ada sinyal yang keluar dari drum pad dan memberikan output MIDI yang sesuai dengan semua parameter yang diperlukan: Catatan, kecepatan dan durasi sinyal. Karena sifat digital pad drum, mereka dapat dengan mudah diikat ke input digital arduino (total 10 pin). Untuk menyimpan semua pengaturan yang diinginkan dan informasi MIDI, kita akan menggunakan memorinya - EEPROM, maka setiap kali kita menyalakan perangkat, informasi MIDI dimuat dari EEPROM, membuatnya dapat diprogram ulang dan dikonfigurasi ulang. Juga, Arduino Pro-Micro tersedia dalam paket yang sangat kecil dan dapat dialokasikan dengan mudah di dalam kotak drum kit.

FTDI USB ke Konverter Serial

Untuk memprogram dan menentukan fitur perangkat kami dengan bantuan aplikasi PC, perlu mengubah antarmuka USB menjadi serial, karena Arduino Pro-Micro tidak memiliki USB. Karena komunikasi antar perangkat didasarkan pada UART, perangkat FTDI digunakan dalam proyek ini, karena kesederhanaan penggunaannya terlepas dari properti tambahannya.

Aplikasi PC - Python

Dalam hal pengembangan antarmuka pengguna dan proyek pembangunan cepat, Python adalah solusi yang luar biasa. Tujuan dari aplikasi UI adalah untuk membuatnya lebih nyaman untuk mendefinisikan ulang properti MIDI untuk drum kit kami, menyimpan informasi, perangkat program dan membuat komunikasi antar sistem tanpa perlu mengkompilasi kode berulang-ulang. Karena kita menggunakan antarmuka serial untuk berkomunikasi dengan drum kit, ada banyak modul gratis di seluruh internet, yang mendukung semua jenis komunikasi serial. Selain itu, seperti yang akan dibahas nanti, antarmuka UART terdiri dari total tiga pin: RXD, TXD dan DTR. DTR digunakan untuk melakukan reset pada modul Arduino, sehingga ketika kita tertarik untuk menjalankan aplikasi MIDI atau menghubungkan UI ke perangkat program, sama sekali tidak perlu memasang kembali kabel USB atau apapun.

Langkah 2: Suku Cadang dan Instrumen

Bagian

  • Perangkat Drum Roll-Up
  • 2 x Sustain Pedal (Biasanya sudah termasuk dalam paket DK).
  • FTDI - Konverter USB Ke Serial
  • Arduino Pro Mikro
  • Kabel Micro-USB

Instrumen

  • Besi Solder/Stasiun
  • Timah solder
  • Kawat Inti Tunggal Diameter Tipis
  • Pinset
  • Pemotong
  • tang
  • Pisau
  • Obeng
  • Printer 3D (Opsional - untuk platform pedal yang disesuaikan)

Perangkat lunak

  • Arduino IDE
  • Python 3 atau Lebih Tinggi
  • JetBrains Pycharm
  • Antarmuka MIDI tanpa rambut
  • loopMIDI

Langkah 3: Solder dan Perakitan

Solder dan Perakitan
Solder dan Perakitan
Solder dan Perakitan
Solder dan Perakitan
Solder dan Perakitan
Solder dan Perakitan

Karena ada tiga modul yang harus digabungkan, proses penyolderan dan perakitan menjadi singkat dan sederhana:

  • Pasang bersama Arduino Pro-Micro dengan perangkat FTDI, pastikan koneksi sesuai dengan I/O yang ditentukan pada setiap perangkat:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Lepaskan semua sekrup dari wadah plastik drum, pastikan Anda dapat fokus pada kabel pad-to-board, dan resistor pull-upnya
  • Solder kabel tipis untuk modul Arduino-FTDI yang telah kami buat sebelumnya:

    • Masukan digital: D[2:11]
    • VBUS
    • D+
    • D-
    • GND
  • Masukkan modul ke dalam wadah baterai sehingga kabel akan mengambang di sisi yang sama dengan resistor pull-up bantalan
  • Solder semua input digital ke terminal drum pad seperti yang ditunjukkan pada gambar terakhir.
  • Solder bus micro-USB (VBUS, D+, D-, GND) ke perangkat FTDI, pastikan tidak ada kesalahan saat menelusuri kabel ini.
  • Pasang modul Arduino-FTDI dengan lem panas ke casing baterai
  • Pasang perangkat dengan pemasangan sekrup yang sesuai

Kami sudah melakukannya, perangkat sudah dirakit. Mari kita lanjutkan ke kode…

Langkah 4: Pemrograman A: Arduino

Pemrograman A: Arduino
Pemrograman A: Arduino

Mari Jelaskan sketsa kami langkah demi langkah:

Pertama-tama, ada kebutuhan untuk memasukkan dua perpustakaan yang diperlukan untuk operasi yang tepat. EEPROM sudah diinstal sebelumnya di Arduino IDE, tetapi modul debouncer untuk kick drum harus diinstal secara terpisah

#sertakan #sertakan

Sakelar ini digunakan terutama dalam urutan debugging. Jika Anda ingin mencoba koneksi terminal Arduino ke bantalan drum, dan menentukan semua input digital, sakelar ini harus ditentukan

/* Developer Switch: Batalkan komentar mode yang diinginkan untuk debugging atau inisialisasi *///#define LOAD_DEFAULT_VALUES // Muat nilai konstan alih-alih EEPROM //#define PRINT_PADS_PIN_NUMBERS // Cetak nomor pin yang terhubung ke pad yang dipukul melalui port serial

Bidang konstan mewakili semua nilai default, termasuk enumerasi pad drum. Untuk menjalankan perangkat untuk pertama kalinya, perlu diketahui koneksi yang tepat dari pedal Hi-Hat dan Kick

/* Pencacahan tipe drum */

enum DRUM_POSITION { KICK = 0, SNARE, HIHAT, RIDE, CYMBAL1, CYMBAL2, TOM_HIGH, TOM_MID, TOM_LO, HIHAT_PEDAL };

/* Nilai dasar */

const uint8_t DRUM_NOTES[10] = { 36, 40, 42, 51, 49, 55, 47, 45, 43, 48}; const uint8_t DRUM_VELOCITIES[10] = { 110, 100, 100, 110, 110, 110, 110, 110, 110, 110}; const uint8_t DRUM_PINS[10] = { 8, 6, 4, 3, 11, 9, 5, 10, 2, 7 };

/* Durasi debounce tendangan drum */

const uint8_t KICK_DB_DURATION = 30;

EEPROM digunakan untuk menyimpan/memuat semua data yang berasal dari aplikasi PC. Rentang alamat yang dijelaskan di atas, menunjukkan lokasi yang tepat untuk informasi MIDI untuk setiap drum pad

/* Pemetaan alamat EEPROM

Catatan: |0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09|

Pin: |0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13| Kecepatan |0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23| */ const uint8_t NOTES_ADDR = 0x00; const uint8_t VELOCITIES_ADDR = 0x14; const uint8_t PINS_ADDR = 0x0A;

Variabel global digunakan untuk menentukan status setiap pad, dan melakukan komunikasi MIDI yang sesuai

/* Variabel Global */

uint8_t drumNotes[10], drumVelocities[10], drumPins[10]; // Variabel MIDI

uint8_t uartBuffer[64]; // UART Buffer untuk mengumpulkan dan menyimpan MIDI Data Debouncer kick(DRUM_PINS[KICK], KICK_DB_DURATION); // Objek debouncer untuk kick drum volatile bool PreviousState[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Logika drum pad sebelumnya menyatakan volatile bool currentState[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Status logika drum pad saat ini

Fungsi EEPROM

/* Simpan pengaturan di EEPROM*/

batalkan tokoEEPROM() {

memcpy(drumNotes, uartBuffer, 10); memcpy(drumPins, uartBuffer + 10, 10); memcpy(drumVelocities, uartBuffer + 20, 10); for (uint8_t i = 0; i < 10; i++) EEPROM.write(NOTES_ADDR + i, drumNotes); for (uint8_t i = 0; i < 10; i++) EEPROM.write(PINS_ADDR + i, drumPins); for (uint8_t i = 0; i < 10; i++) EEPROM.write(VELOCITIES_ADDR + i, drumVelocities); }

/* Memuat pengaturan dari EEPROM*/

void loadEEPROM() { for (uint8_t i = 0; i < 10; i++) drumNotes = EEPROM.read(NOTES_ADDR + i); for (uint8_t i = 0; i < 10; i++) drumPins = EEPROM.read(PINS_ADDR + i); for (uint8_t i = 0; i < 10; i++) drumVelocities = EEPROM.read(VELOCITIES_ADDR + i); }

Inisialisasi variabel dan mode pemrograman, dalam hal pedal dan boot Arduino diaktifkan secara bersamaan

batal enterProgrammingMode() {

bool confirmBreak = salah; uint8_t lineCnt = 0; uint8_t charCnt = 0; char readChar = 0; while(!confirmBreak) { if (Serial.available()) { uartBuffer[charCnt] = Serial.read(); if (charCnt >= 29) confirmBreak = true; lain charCnt++; } } Serial.println("Oke"); simpanEEPROM(); }

batal initValues() {

#ifdef LOAD_DEFAULT_VALUES memcpy(drumNotes, DRUM_NOTES, 10); memcpy(kecepatan drum, DRUM_VELOCITIES, 10); memcpy(drumPins, DRUM_PINS, 10); #else loadEEPROM(); #berakhir jika }

Penangan Komunikasi MIDI dengan penundaan waktu penahanan catatan 1 ms

/* Memutar fungsi not MIDI */

void midiOut(enum DRUM_POSITION drumIn) {

if (drumIn == HIHAT) { // Jika HI-HAT dipukul, perlu dilakukan pemeriksaan apakah pedal ditekan jika (!digitalRead(drumPins[HIHAT_PEDAL])) { noteOn(0x90, drumNotes[HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); penundaan (1); noteOn(0x90, drumNotes[HIHAT_PEDAL], 0); } else { noteOn(0x90, drumNotes[HIHAT], drumVelocities[HIHAT]); penundaan (1); noteOn(0x90, drumNotes[HIHAT], 0); } } else { // Catatan transmisi MIDI drum reguler(0x90, drumNotes[drumIn], drumVelocities[drumIn]); penundaan (1); noteOn(0x90, drumNotes[drumIn], 0); } }

void noteOn(int cmd, int pitch, int velocity) { Serial.write(cmd); Serial.write(pitch); Serial.write(kecepatan); }

setup() dan loop() berfungsi dengan loop operasi perangkat tak terbatas:

batalkan pengaturan() {

Serial.begin(115200);

for (uint8_t i = 0; i < 10; i++) { pinMode(i + 2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while(true) { // Loop debug tak terbatas untuk (uint8_t i = 0; i < 10; i++) { if (!digitalRead(i + 2)) { Serial.print("No Pin: D"); Serial.print(i + '0'); // Konversi angka menjadi karakter ASCII } } } #else initValues(); /* Mode pemrograman: Jika dua pedal ditekan saat boot - mode diaktifkan */ if (!digitalRead(drumPins[KICK]) && !digitalRead(drumPins[HIHAT_PEDAL])) enterProgrammingMode(); #berakhir jika }

void loop() { for (uint8_t i = 1; i < 9; i = i + 1) { currentState = digitalRead(drumPins); if (!currentState && sebelumnyaState) midiOut(i); // Bandingkan status dan deteksi tepi jatuh beforeState = currentState; } kick.update(); // Kick drum menggunakan algoritma debounce khusus if (kick.edge()) if (kick.falling()) midiOut(KICK); }

Langkah 5: Pemrograman B: Python & Antarmuka Pengguna

Pemrograman B: Python & Antarmuka Pengguna
Pemrograman B: Python & Antarmuka Pengguna
Pemrograman B: Python & Antarmuka Pengguna
Pemrograman B: Python & Antarmuka Pengguna
Pemrograman B: Python & Antarmuka Pengguna
Pemrograman B: Python & Antarmuka Pengguna

Antarmuka Pengguna Python sedikit rumit untuk dipahami pada pandangan pertama, oleh karena itu kami akan mencoba menjelaskan dasar-dasarnya, cara menggunakannya, fungsi apa yang dimiliki setiap tombol dan bagaimana memprogram perangkat Arduino dengan benar.

Antarmuka Pengguna - Aplikasi

UI adalah representasi grafis untuk programmer drum kit kami, membuatnya sangat mudah digunakan dan nyaman untuk memprogram perangkat Arduino kapan saja. UI terdiri dari beberapa modul grafis yang terkait dengan operasi yang disarankan. mari kita tinjau satu per satu:

  1. Gambar Drum Set: Python UI menggunakan koordinat gambar XY untuk menentukan jenis drum yang dipilih. Jika wilayah drum yang valid dipilih, pesan IO sekunder muncul, dengan bidang not, kecepatan, dan terminal Arduino untuk pad drum khusus. Setelah parameter ini diverifikasi oleh pengguna dan disetujui, nilai-nilai ini dapat ditransmisikan langsung ke perangkat Arduino.
  2. Gambar Pengontrol Eksternal: Agar dapat menggunakan drum kit MIDI dengan lingkungan pembuatan VST/Musik, ada kebutuhan untuk menjalankan penerjemah Serial-To-MIDI. Saya telah menggunakan Hairless, yang tersedia secara gratis dan dapat dijalankan langsung dari UI kami, hanya dengan menekan gambarnya.
  3. Daftar Port COM: Untuk berkomunikasi dengan Arduino, perlu menentukan port COM yang terpasang. Daftar sedang di-refresh dengan menekan tombol Refresh.
  4. Muat/Simpan Konfigurasi: Ada nilai MIDI default yang ditentukan dalam kode, yang dapat dimodifikasi oleh pengguna melalui interaksi dengan UI. Konfigurasi didefinisikan dalam file config.txt dalam format tertentu, yang dapat disimpan atau dimuat oleh pengguna.
  5. Tombol Perangkat Program: Untuk menyimpan semua nilai MIDI yang dimodifikasi di Arduino EEPROM, perlu menekan dua pedal kaki (Kick drum dan pedal Hi-hat) setelah itu, tunggu pengiriman data selesai. Jika ada masalah komunikasi, pop-up yang tepat akan ditampilkan. Jika transmisi berhasil, UI akan menampilkan pesan berhasil.
  6. Tombol Keluar: Keluar saja dari aplikasi, dengan izin pengguna.

Sorotan Kode Python

Ada banyak hal yang terjadi dalam kode, jadi kami akan memperluas fungsi tertulis daripada keseluruhan kode.

Pertama-tama, untuk menggunakan UI, Anda perlu mengunduh beberapa modul, agar kodenya berfungsi:

import osimport threading import tkinter as tk dari tkinter import messagebox dari tkinter import * from PIL import ImageTk, Image import numpy as np import serial import glob

Beberapa modul disertakan dalam paket Python default. Beberapa modul harus diinstal melalui alat PIP:

pip menginstal Bantal

pip install numpy pip install ScreenInfo

Sangat disarankan untuk menjalankan aplikasi melalui PyCharm. Dalam rilis mendatang, saya berencana untuk mengekspor executable untuk proyek tersebut.

Penjelasan Kode Singkat

Akan jauh lebih mudah untuk memahami kode jika kita melihat barisnya dari perspektif fungsi dan kelas:

1. Fungsi utama - di sini kode dimulai

if _name_ == '_main_': drumkit_gui()

2. Konstanta Drum Kit, koordinat, dan informasi MIDI default

Drum kelas: DRUM_TYPES = ["Kick", "Hihat", "Snare", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Ride", "Hihat Pedal ", "Pengendali"]

KOORDINAT_X = [323, 117, 205, 173, 565, 271, 386, 488, 487, 135, 79]

KOORDINAT_Y = [268, 115, 192, 40, 29, 107, 104, 190, 71, 408, 208] DIMS_WIDTH = [60, 145, 130, 120, 120, 70, 70, 130, 120, 70, 145] DIMS_LENGTH = [60, 60, 80, 35, 35, 40, 40, 70, 35, 100, 50]

DRUM_ENUM = ["Tendangan", "Snare", "Hihat", "Naik", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Hihat Pedal"]

DRUM_NOTES = [36, 40, 42, 51, 49, 55, 47, 45, 43, 48] DRUM_VELOCITIES = [110, 100, 100, 110, 110, 110, 110, 110, 110, 110] DRUM_PINS = [8, 6, 4, 3, 11, 9, 5, 10, 2, 7]

3. Fungsi UI - Penanganan antarmuka pengguna dan objek grafis

def set_aktif(ui)

def secondary_ui(tipe_drum)

kelas SeleksiUi(tk. Frame)

Aplikasi kelas (tk. Frame)

def drumkit_gui()

def event_ui_clicked(acara)

def getorigin(diri sendiri, peristiwa)

4. Komunikasi serial

def get_serial_ports()

def berkomunikasi_dengan_arduino(port)

5. Bekerja dengan file: Simpan/Muat pengaturan dari file txt

def save_config()

def load_config()

6. Menjalankan aplikasi eksternal hairless.exe dari kode menggunakan kemampuan Python Threading

kelas ExternalExecutableThread(threading. Thread)

def run_hairless_executable()

Untuk menjalankan kode, ada daftar file yang harus dilampirkan ke folder proyek:

  • config.txt: File pengaturan
  • hairless.exe: Konverter MIDI tanpa rambut
  • drumkit.png: Gambar yang mendefinisikan semua bantalan drum yang dapat diklik di UI kami (Harus diunduh dari kumpulan gambar langkah ini)
  • drumgui.py: Kode proyek

Itu semua yang perlu kita tekankan untuk membuatnya bekerja. Sangat penting untuk menambahkan file ke proyek: gambar set drum, executable hairless.exe dan file pengaturan config.txt.

Dan.. Di sini kita sudah selesai!:)

Harap Anda akan menemukan instruksi ini berguna.

Terima kasih sudah membaca!:)

Direkomendasikan: