Isi kandungan:

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

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

Video: Kit Drum MIDI di Python dan Arduino: 5 Langkah (dengan Gambar)
Video: Bikin drum elektrik di mousepad ( Lengkap dengan Source Code ) 2024, November
Anonim
Image
Image
MIDI Drum Kit pada Python dan Arduino
MIDI Drum Kit pada Python dan Arduino
MIDI Drum Kit pada Python dan Arduino
MIDI Drum Kit pada Python dan Arduino

Saya selalu mahu membeli drum kit sejak saya kecil. Pada masa itu, semua peralatan muzik tidak mempunyai semua aplikasi digital seperti yang kita miliki sekarang, oleh itu harganya dan jangkaan terlalu tinggi. Baru-baru ini saya telah memutuskan untuk membeli drum kit termurah dari eBay, dengan satu-satunya keutamaan: Keupayaan untuk meruntuhkannya dan melampirkan perkakasan dan perisian saya sendiri ke peranti.

Pembelian sama sekali tidak mengecewakan: Roll-up drum kit mudah alih dengan 9 pad suara yang berbeza, pedal suis dua kaki untuk kick drum dan hi-hat dan soket kuasa mikro-USB. Apa yang benar-benar demotivasi, itu adalah bunyi output (Penggunaan sebenar untuk kit ini adalah untuk menyambungkan pembesar suara luaran dan menikmatinya). Oleh itu, saya memutuskan untuk menukarnya ke program saya sendiri melalui USB, drum kit MIDI berdasarkan Arduino dan User Interface berdasarkan Python, untuk penggunaan yang mudah dan pengubahsuaian yang mudah seperti, kelantangan, nota dan pilihan saluran.

Ciri-ciri peranti:

  • Harga rendah
  • Membuat drum kit dari sebarang input digital - sebilangan besar butang tekan
  • Sokongan komunikasi dan bekalan kuasa hanya melalui antara muka USB - Integrasi USB ke penukar UART dan peranti Arduino
  • Bahagian minimum untuk operasi yang betul
  • UI berasaskan Python yang mudah digunakan
  • Lengkapkan sokongan MIDI dengan kelajuan, nota dan pin Arduino yang boleh disesuaikan
  • Simpan & Muatkan konfigurasi drum tersuai yang disimpan dalam memori peranti

Mari teruskan ke projek …

Langkah 1: Teori Operasi

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

Gambarajah blok

Pertama sekali, mari fokus pada struktur projek, dan bahagikannya kepada blok yang berasingan:

Roll-Up Drum Kit

Unit utama projek. Ini terdiri daripada 9 pad drum yang berasingan, di mana setiap pad adalah susunan butang yang mengubah keadaan logiknya semasa dipukul. Kerana strukturnya, ada kemungkinan untuk membina drum kit ini dari mana-mana butang tekan. Setiap pad drum disambungkan ke perintang penarik pada papan elektronik utama, oleh itu semasa pad drum dipukul berulang kali, suis tertentu diikat ke tanah litar dan LOW logik terdapat pada garis pad drum. Apabila tidak ada tekanan yang dikenakan, suis drum pad terbuka dan kerana penarik tarik ke saluran kuasa, HIGH logik hadir pada garis pad drum. Kerana tujuan projek ini adalah untuk membuat peranti MIDI digital yang lengkap, semua bahagian analog pada PCB utama dapat diabaikan. Penting untuk diperhatikan, bahawa drum kit mempunyai dua pedal untuk kick drum dan hi-hat, yang juga diikat pada pull-up resistors dan berkongsi logik operasi yang sama dengan semua drum pad (Kami akan membincangkannya sedikit kemudian).

Arduino Pro-Mikro

Otak drum kit. Tujuannya adalah untuk mengesan sama ada ada isyarat yang keluar dari drum pad dan memberikan output MIDI yang sesuai dengan semua parameter yang diperlukan: Catatan, halaju dan jangka masa isyarat. Kerana sifat digital pad drum, alat ini hanya dapat diikat dengan input digital arduino (jumlah 10 pin). Untuk menyimpan semua tetapan dan maklumat MIDI yang diinginkan, kami akan menggunakan memori - EEPROM, oleh itu setiap kali kami menghidupkan peranti, maklumat MIDI dimuat dari EEPROM, membuatnya dapat diprogram ulang dan dapat dikonfigurasi ulang. Juga, Arduino Pro-Micro tersedia dalam pakej yang sangat kecil dan dapat dialokasikan dengan mudah dalam kotak dalaman drum kit.

FTDI USB To Serial Converter

Untuk memprogram dan menentukan fitur peranti kami dengan bantuan aplikasi PC, perlu mengubah antara muka USB menjadi siri, kerana Arduino Pro-Micro tidak memiliki USB. Oleh kerana komunikasi antara peranti berdasarkan UART, peranti FTDI digunakan dalam projek ini, kerana kesederhanaan penggunaannya tanpa mempedulikan sifat tambahannya.

Aplikasi PC - Python

Untuk pembangunan antara muka pengguna dan projek yang cepat dibina, Python adalah penyelesaian yang luar biasa. Tujuan aplikasi UI adalah untuk menjadikannya lebih mudah untuk mentakrifkan semula sifat MIDI untuk drum kit kami, menyimpan maklumat, peranti program dan membuat komunikasi antara sistem tanpa perlu menyusun kod berulang-ulang. Kerana kami menggunakan antara muka bersiri untuk berkomunikasi dengan drum kit, ada banyak modul percuma di seluruh internet, yang menyokong segala jenis komunikasi bersiri. Sebagai tambahan, seperti yang akan dibincangkan kemudian, antara muka UART terdiri daripada tiga pin: RXD, TXD dan DTR. DTR digunakan untuk melakukan reset pada modul Arduino, oleh itu ketika kita berminat untuk menjalankan aplikasi MIDI atau menghubungkan UI ke perangkat program, sama sekali tidak perlu memasang kembali kabel USB atau apa pun.

Langkah 2: Bahagian dan Alat

Bahagian

  • Roll-Up Drum Kit
  • 2 x Pedal Berkekalan (Biasanya, termasuk dalam pakej DK).
  • FTDI - Penukar Serial USB Ke
  • Arduino Pro Mikro
  • Kabel Mikro-USB

Instrumen

  • Besi solder / Stesen
  • Timah Pematerian
  • Kawat Teras Tunggal Diameter Tipis
  • Pinset
  • Pemotong
  • Plier
  • Pisau
  • Pemacu Skru
  • Pencetak 3D (Pilihan - untuk platform pedal yang disesuaikan)

Perisian

  • Arduino IDE
  • Python 3 atau Lebih Tinggi
  • JetBrains Pycharm
  • Antara muka MIDI tanpa rambut
  • gelungMIDI

Langkah 3: Pematerian dan Pemasangan

Pematerian dan Pemasangan
Pematerian dan Pemasangan
Pematerian dan Pemasangan
Pematerian dan Pemasangan
Pematerian dan Pemasangan
Pematerian dan Pemasangan

Oleh kerana terdapat tiga modul yang harus digabungkan, proses pematerian dan pemasangan adalah pendek dan sederhana:

  • Pasang bersama Arduino Pro-Micro dengan peranti FTDI, pastikan sambungan mematuhi I / O yang ditentukan pada setiap peranti:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Tanggalkan semua skru dari penutup plastik drum, pastikan anda dapat memfokuskan pada kabel pad-to-board, dan perintang penariknya
  • Kawat nipis solder untuk modul Arduino-FTDI yang telah kami bina sebelumnya:

    • Input digital: D [2:11]
    • VBUS
    • D +
    • D-
    • GND
  • Masukkan modul di dalam casing bateri sehingga wayar melayang di sisi yang sama dengan perintang penarik
  • Selesaikan semua input digital ke terminal pad drum seperti yang ditunjukkan pada gambar terakhir.
  • Memasukkan bas mikro-USB (VBUS, D +, D-, GND) ke peranti FTDI, pastikan bahawa tidak ada kesilapan menelusuri wayar ini.
  • Pasang modul Arduino-FTDI dengan pelekat panas ke casing bateri
  • Pasang peranti dengan pemasangan skru yang sesuai

Kami telah melakukannya, peranti dipasang. Mari teruskan kodnya …

Langkah 4: Pengaturcaraan A: Arduino

Pengaturcaraan A: Arduino
Pengaturcaraan A: Arduino

Mari Huraikan lakaran kami langkah demi langkah:

Pertama sekali, perlu memasukkan dua perpustakaan yang diperlukan untuk operasi yang betul. EEPROM sudah terpasang di Arduino IDE, tetapi modul debouncer untuk kick drum mesti dipasang secara berasingan

#sertakan #sertakan

Suis ini digunakan terutamanya dalam urutan debug. Sekiranya anda ingin mencuba sambungan terminal Arduino ke pad drum, dan menentukan semua input digital, suis ini harus ditentukan

/ * Suis Pembangun: Mod yang tidak diinginkan untuk debug atau inisialisasi * /// # define LOAD_DEFAULT_VALUES // Muatkan nilai malar dan bukannya EEPROM // # define PRINT_PADS_PIN_NUMBERS // Cetak nombor pin yang disambungkan ke pad yang dipukul melalui port bersiri

Medan berterusan mewakili semua nilai lalai, termasuk penghitungan pad drum. Untuk menjalankan peranti untuk pertama kalinya, perlu diketahui sambungan tepat pedal Hi-Hat dan Kick

/ * Penghitungan jenis dram * /

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

/ * Nilai lalai * /

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};

/ * Tempoh debit Kick 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 maklumat 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 | Velocities | 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;

Pemboleh ubah global digunakan untuk menentukan keadaan setiap pad, dan melakukan komunikasi MIDI dengan sewajarnya

/ * Pembolehubah Global * /

uint8_t drumNotes [10], drumVelocities [10], drumPins [10]; // Pemboleh ubah MIDI

uint8_t uartBuffer [64]; // Penyangga UART untuk mengumpulkan dan menyimpan tendangan Penolak Data MIDI (DRUM_PINS [KICK], KICK_DB_DURATION); // Objek debouncer untuk kick drum volatile bool sebelumnyaState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Drum pad logik sebelumnya menyatakan arus bool tidak stabilState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Keadaan logik semasa Drum pad

Fungsi EEPROM

/ * Tetapkan stor di EEPROM * /

batal kedaiEEPROM () {

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

/ * Muatkan tetapan dari EEPROM * /

beban kosongEEPROM () {untuk (uint8_t i = 0; i <10; i ++) drumNotes = EEPROM.read (NOTES_ADDR + i); untuk (uint8_t i = 0; i <10; i ++) drumPins = EEPROM.read (PINS_ADDR + i); untuk (uint8_t i = 0; i <10; i ++) drumVelocities = EEPROM.read (VELOCITIES_ADDR + i); }

Permulaan pemboleh ubah dan mod pengaturcaraan, untuk pedal dan boot Arduino diaktifkan secara serentak

batal enterProgrammingMode () {

bool confirmBreak = salah; uint8_t lineCnt = 0; uint8_t charCnt = 0; char readChar = 0; sementara (! confirmBreak) {if (Serial.available ()) {uartBuffer [charCnt] = Serial.read (); jika (charCnt> = 29) confirmBreak = benar; lain-lain charCnt ++; }} Serial.println ("OK"); kedaiEEPROM (); }

batal initValues () {

#ifdef LOAD_DEFAULT_VALUES memcpy (drumNotes, DRUM_NOTES, 10); memcpy (drumVelocities, DRUM_VELOCITIES, 10); memcpy (drumPins, DRUM_PINS, 10); #else loadEEPROM (); #endif}

Penangan Komunikasi MIDI dengan kelewatan masa penahanan nota 1ms

/ * Mainkan fungsi nota MIDI * /

batal midiOut (enum DRUM_POSITION drumIn) {

if (drumIn == HIHAT) {// Jika HI-HAT terkena, perlu dilakukan pemeriksaan apakah pedal ditekan jika (! digitalRead (drumPins [HIHAT_PEDAL])) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); kelewatan (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } lain {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); kelewatan (1); noteOn (0x90, drumNotes [HIHAT], 0); }} lain {// Catatan penghantaran MIDI drum biasaOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); kelewatan (1); noteOn (0x90, drumNotes [drumIn], 0); }}

kekosongan nota On (int cmd, int pitch, int velocity) {Serial.write (cmd); Serial.write (nada); Serial.write (halaju); }

fungsi setup () dan loop () dengan gelung operasi peranti tanpa batas:

batal persediaan () {

Serial.begin (115200);

untuk (uint8_t i = 0; i <10; i ++) {pinMode (i + 2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS sementara (benar) {// Gelung debug tanpa batas untuk (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i + 2)) {Serial.print ("Pin No: D"); Serial.print (i + '0'); // Tukar nombor menjadi watak ASCII}}} #else initValues (); / * Mod pengaturcaraan: Sekiranya dua pedal ditekan semasa boot - mod diaktifkan * / jika (! DigitalRead (drumPins [KICK]) &&! DigitalRead (drumPins [HIHAT_PEDAL])) enterProgrammingMode (); #endif}

gelung void () {untuk (uint8_t i = 1; i <9; i = i + 1) {currentState = digitalRead (drumPins ); jika (! currentState && sebelumnyaState ) midiOut (i); // Bandingkan keadaan dan mengesan kelebihan terdahuluState = currentState ; } kick.update (); // Kick drum menggunakan algoritma debounce tersuai jika (kick.edge ()) if (kick.falling ()) midiOut (KICK); }

Langkah 5: Pengaturcaraan B: Python & Antaramuka Pengguna

Pengaturcaraan B: Python & Antaramuka Pengguna
Pengaturcaraan B: Python & Antaramuka Pengguna
Pengaturcaraan B: Python & Antaramuka Pengguna
Pengaturcaraan B: Python & Antaramuka Pengguna
Pengaturcaraan B: Python & Antaramuka Pengguna
Pengaturcaraan B: Python & Antaramuka Pengguna

Antaramuka Pengguna Python agak rumit untuk difahami pada pandangan pertama, oleh itu kami akan cuba menjelaskan asasnya, cara menggunakan, fungsi apa yang dimiliki oleh setiap butang dan cara memprogramkan peranti Arduino dengan betul.

Antara Muka Pengguna - Aplikasi

UI adalah gambaran grafik untuk programmer drum kit kami, menjadikannya sangat mudah digunakan dan senang untuk memprogram peranti Arduino kapan saja. UI terdiri daripada beberapa modul grafik yang terikat dengan operasi yang dicadangkan mereka. mari kita ulas satu demi satu:

  1. Drum Set Image: Python UI menggunakan koordinat gambar X-Y untuk menentukan jenis drum mana yang dipilih. Sekiranya wilayah drum yang sah dipilih, mesej IO sekunder muncul, dengan medan nota, halaju dan terminal Arduino untuk pad drum khusus. Setelah parameter ini disahkan oleh pengguna dan disetujui, nilai-nilai ini dapat dihantar terus ke peranti Arduino.
  2. Imej Pengawal Luaran: Untuk dapat menggunakan drum kit MIDI dengan persekitaran pembuatan VST / Muzik, terdapat keperluan untuk menjalankan jurubahasa Serial-To-MIDI. Saya telah menggunakan Hairless, yang tersedia secara percuma dan boleh dijalankan terus dari UI kami, hanya dengan menekan gambarnya.
  3. Senarai Port COM: Untuk berkomunikasi dengan Arduino, perlu menentukan port COM yang dilampirkan. Senarai disegarkan dengan menekan butang Refresh.
  4. Muat / Simpan Konfigurasi: Terdapat nilai MIDI lalai yang ditentukan dalam kod, yang dapat diubah suai oleh pengguna melalui berinteraksi dengan UI. Konfigurasi ditentukan dalam file config.txt dalam format tertentu, yang dapat disimpan atau dimuat oleh pengguna.
  5. Butang Peranti Program: Untuk menyimpan semua nilai MIDI yang diubah dalam Arduino EEPROM, perlu menekan dua pedal kaki (Kick drum dan Hi-hat pedal) setelah itu, tunggu penghantaran data selesai. Sekiranya terdapat masalah komunikasi, pop-up yang betul akan ditunjukkan. Sekiranya penghantaran berjaya, UI akan menunjukkan mesejnya yang berjaya.
  6. Butang Keluar: Keluar saja dari aplikasi, dengan izin pengguna.

Sorotan Kod Python

Terdapat banyak perkara yang berlaku dalam kod, jadi kami akan memperluas fungsi tertulis dan bukannya pada keseluruhan kod.

Pertama sekali, untuk menggunakan UI, perlu memuat turun beberapa modul untuk membuat kod berfungsi:

import osimport threading import tkinter sebagai tk dari tkinter import messagebox dari tkinter import * dari PIL import ImageTk, Imej import numpy sebagai np import siri import glob

Sebilangan modul termasuk dalam pakej Python lalai. Beberapa modul harus dipasang melalui alat PIP:

pip memasang Bantal

pip install numpy pip install ScreenInfo

Sangat disarankan untuk menjalankan aplikasi melalui PyCharm. Dalam siaran masa depan, saya merancang untuk mengeksport sesuatu yang boleh dilaksanakan untuk projek tersebut.

Penjelasan Kod Ringkas

Akan lebih mudah untuk memahami kodnya jika kita melihat garisnya dari perspektif fungsi dan kelas:

1. Fungsi utama - di sini kodnya bermula

jika _nama_ == '_main_': drumkit_gui ()

2. Pemalar, koordinat dan maklumat MIDI lalai Drum Kit

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

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

COORDINATES_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 = ["Kick", "Snare", "Hihat", "Ride", "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 - Pengendalian antara muka pengguna dan objek grafik

def set_active (ui)

def sekunder_ui (drum_type)

SelectionUi kelas (tk. Frame)

Permohonan kelas (tk. Frame)

def drumkit_gui ()

def event_ui_clicked (acara)

def getorigin (diri, acara)

4. Komunikasi bersiri

def get_serial_ports ()

def commun_with_arduino (pelabuhan)

5. Bekerja dengan fail: Simpan / Muatkan tetapan dari fail txt

def save_config ()

def load_config ()

6. Menjalankan aplikasi luaran tanpa rambut.exe dari kod menggunakan keupayaan Python Threading

kelas ExternalExecutableThread (threading. Thread)

def run_hairless_executable ()

Untuk menjalankan kod, terdapat senarai fail yang harus dilampirkan ke folder projek:

  • config.txt: Fail tetapan
  • hairless.exe: Penukar MIDI tanpa rambut
  • drumkit.png: Gambar yang menentukan semua pad drum yang boleh diklik di UI kami (Harus dimuat turun dari set gambar langkah ini)
  • drumgui.py: Kod projek

Itu semua yang perlu kita tekankan untuk menjayakannya. Sangat penting untuk menambah fail ke projek: drum set image, hairless.exe executable dan setting config.txt file.

Dan.. Di sini kita telah selesai!:)

Semoga anda mendapat petunjuk yang berguna ini.

Terima kasih untuk membaca!:)

Disyorkan: