Sadržaj:

MIDI komplet bubnjeva na Pythonu i Arduinu: 5 koraka (sa slikama)
MIDI komplet bubnjeva na Pythonu i Arduinu: 5 koraka (sa slikama)

Video: MIDI komplet bubnjeva na Pythonu i Arduinu: 5 koraka (sa slikama)

Video: MIDI komplet bubnjeva na Pythonu i Arduinu: 5 koraka (sa slikama)
Video: Драм-секвенсор Arduino: 8 дорожек, 16 шагов на такт, 8 тактов на паттерн 2024, Juli
Anonim
Image
Image
MIDI komplet bubnjeva na Pythonu i Arduinu
MIDI komplet bubnjeva na Pythonu i Arduinu
MIDI komplet bubnjeva na Pythonu i Arduinu
MIDI komplet bubnjeva na Pythonu i Arduinu

Uvijek sam od malih nogu želio kupiti komplet bubnjeva. Tada sva muzička oprema nije imala sve digitalne aplikacije kao što ih danas imamo u izobilju, pa su cijene zajedno s očekivanjima bile previsoke. Nedavno sam odlučio kupiti najjeftiniji komplet bubnjeva sa eBay -a, s jedinim prioritetom: mogućnost da ga srušim i priključim svoj hardver i softver na uređaj.

Kupnja nije nimalo razočarala: Prijenosni komplet bubnja sa 9 različitih jastučića, dvije papučice za nožni prekidač za kick bubanj i hi-hat i utičnicu za mikro USB. Ono što je zaista demotiviralo, to su izlazni zvukovi (stvarna upotreba ovog kompleta je povezivanje vanjskog zvučnika i uživanje u njemu). Odlučio sam ga pretvoriti u svoj program koji se može programirati putem USB -a, MIDI komplet bubnjeva na bazi Arduina i Korisničko sučelje na osnovi Pythona, za praktičnu upotrebu i jednostavne izmjene poput odabira glasnoće, note i kanala.

Karakteristike uređaja:

  • Niska cijena
  • Stvaranje kompleta bubnjeva od bilo kojeg digitalnog ulaza - čak niza tipki
  • Komunikacijska podrška i napajanje samo putem USB sučelja - Integracija USB u UART pretvarač i Arduino uređaj
  • Minimalni dijelovi za pravilan rad
  • Jednostavno korisničko sučelje zasnovano na Pythonu
  • Potpuna MIDI podrška s podesivom brzinom, notama i Arduino iglicama
  • Spremi i učitaj prilagođene konfiguracije bubnja pohranjene u memoriji uređaja

Idemo dalje do projekta…

Korak 1: Teorija rada

Teorija rada
Teorija rada
Teorija rada
Teorija rada
Teorija rada
Teorija rada

Blok dijagram

Prije svega, fokusirajmo se na strukturu projekta i podijelimo je u zasebne blokove:

Roll-Up bubanj komplet

Glavna jedinica projekta. Sastoji se od 9 zasebnih bubnjeva, gdje je svaki pad niz dugmića koji mijenjaju svoje logičko stanje dok su pritisnuti. Zbog svoje strukture, postoji mogućnost izrade ovog kompleta bubnjeva od bilo koje tipke. Svaki bubanj je spojen na pull-up otpornik na glavnoj elektronskoj ploči, pa dok se bubanj više puta udara, određeni prekidač je vezan za masu kola i logičko NISKO je prisutno na liniji bubnja. Kad nema pritiska, prekidač bubnja je otvoren i zbog povučenog otpornika na vod za napajanje logičko HIGH je prisutno na liniji bubnja. Budući da je svrha projekta stvoriti potpuni digitalni MIDI uređaj, svi analogni dijelovi na glavnoj PCB -u mogu se zanemariti. Važno je napomenuti da komplet bubnjeva ima dvije pedale za kick bubanj i hi-hat, koje su također vezane za pull-up otpornike i dijele istu logiku rada kao i svi jastučići bubnjeva (O tome ćemo govoriti kasnije).

Arduino Pro-Micro

Mozak kompleta bubnjeva. Njegova je svrha otkriti postoji li signal iz bubnja i pružiti odgovarajući MIDI izlaz sa svim potrebnim parametrima: Napomena, brzina i trajanje signala. Zbog digitalne prirode bubnjeva, oni se mogu jednostavno povezati s arduino digitalnim ulazima (ukupno 10 pinova). Kako bismo pohranili sve željene postavke i MIDI informacije, koristit ćemo njegovu memoriju-EEPROM, pa se svaki put kad uključimo uređaj učitavaju MIDI informacije iz EEPROM-a, što ih čini ponovno programiranim i ponovno konfiguriranim. Također, Arduino Pro-Micro dostupan je u vrlo malom pakiranju i može se lako staviti u unutarnje kućište kompleta bubnjeva.

FTDI USB u serijski pretvarač

Da bismo programirali i definirali karakteristike našeg uređaja uz pomoć PC aplikacije, potrebno je pretvoriti USB sučelje u serijsko, jer Arduino Pro-Micro nema USB. Budući da se komunikacija između uređaja temelji na UART -u, FTDI uređaj se koristi u ovom projektu, zbog svoje jednostavnosti upotrebe bez obzira na njegova dodatna svojstva.

PC aplikacija - Python

Što se tiče razvoja korisničkog sučelja i projekata koji se brzo grade, Python je odlično rješenje. Svrha korisničkog sučelja je učiniti znatno prikladnijim redefiniranje MIDI svojstava za naš komplet bubnjeva, pohranjivanje informacija, programskih uređaja i komunikaciju između sistema bez potrebe za kompiliranjem koda iznova i iznova. Budući da koristimo serijsko sučelje za komunikaciju s kompletom bubnjeva, na internetu postoji mnogo besplatnih modula koji podržavaju sve vrste serijske komunikacije. Osim toga, kako će kasnije biti riječi, UART sučelje sastoji se od ukupno tri pina: RXD, TXD i DTR. DTR se koristi za resetiranje na Arduino modulu, pa kada smo zainteresirani za pokretanje MIDI aplikacije ili povezivanje korisničkog sučelja na programski uređaj, nema apsolutno nikakve potrebe za ponovnim priključivanjem USB kabela ili bilo čega drugog.

Korak 2: Dijelovi i instrumenti

Delovi

  • Roll-Up bubanj komplet
  • 2 x Sustain pedale (obično uključene u DK paket).
  • FTDI - USB u serijski pretvarač
  • Arduino Pro Micro
  • Mikro-USB kabl

Instrumenti

  • Lemilica/stanica
  • Lemni lim
  • Jednožilna žica tankog prečnika
  • Pinceta
  • Cutter
  • Kliješta
  • Nož
  • Šrafciger
  • 3D štampač (opcionalno - za prilagođene platforme za pedale)

Softver

  • Arduino IDE
  • Python 3 ili noviji
  • JetBrains Pycharm
  • MIDI sučelje bez dlake
  • loopMIDI

Korak 3: Lemljenje i montaža

Lemljenje i montaža
Lemljenje i montaža
Lemljenje i montaža
Lemljenje i montaža
Lemljenje i montaža
Lemljenje i montaža

Budući da postoje tri modula koja se moraju kombinirati, proces lemljenja i sastavljanja je kratak i jednostavan:

  • Spojite Arduino Pro-Micro s FTDI uređajem, provjerite jesu li veze u skladu s I/O definiranim na svakom uređaju:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Uklonite sve vijke iz plastičnog kućišta bubnja, pazite da se fokusirate na kabel od ploče do ploče i njegove otpornike na izvlačenje
  • Lemljenje tankih žica za Arduino-FTDI modul koje smo prethodno konstruisali:

    • Digitalni ulazi: D [2:11]
    • VBUS
    • D+
    • D-
    • GND
  • Umetnite modul u kućište baterije kako bi žice plutale na istoj strani kao i otpornici na izvlačenje jastučića
  • Lemite sve digitalne ulaze na stezaljke bubnja kao što je prikazano na poslednjoj slici.
  • Lemite mikro-USB sabirnicu (VBUS, D+, D-, GND) na FTDI uređaj, pazite da nema grešaka u trasiranju ovih žica.
  • Pričvrstite Arduino-FTDI modul vrućim ljepilom na kućište baterije
  • Montirajte uređaj odgovarajućim pričvrsnim vijcima

Uspjeli smo, uređaj je sastavljen. Nastavimo sa kodom …

Korak 4: Programiranje A: Arduino

Programiranje A: Arduino
Programiranje A: Arduino

Opišimo našu skicu korak po korak:

Prije svega, potrebno je uključiti dvije potrebne biblioteke za pravilan rad. EEPROM je već unaprijed instaliran u Arduino IDE-u, ali modul debouncer za bubanj mora biti instaliran zasebno

#include #include

Ovi prekidači se uglavnom koriste za otklanjanje grešaka. Ako želite isprobati povezivanje Arduino terminala s jastučićima bubnja i odrediti sve digitalne ulaze, ove prekidače treba definirati

/ * Prekidači za programere: Dekomentirajte željeni način rada za otklanjanje grešaka ili inicijalizaciju * ///#define LOAD_DEFAULT_VALUES // Učitajte konstantne vrijednosti umjesto EEPROM -a //#definirajte PRINT_PADS_PIN_NUMBERS // Ispišite broj pin -a koji je spojen na pad koji je pogođen preko serijskog porta

Konstantna polja predstavljaju sve zadane vrijednosti, uključujući nabrajanje bubnjeva. Da biste pokrenuli uređaj po prvi put, morate znati tačnu vezu Hi-Hat i Kick pedala

/ * Nabrajanje vrste bubnja */

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

/ * Zadane vrijednosti */

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

/ * Trajanje debounce udarca bubnja */

const uint8_t KICK_DB_DURATION = 30;

EEPROM se koristi za spremanje/učitavanje svih podataka koji dolaze iz PC aplikacije. Gore opisani raspon adresa prikazuje tačnu lokaciju za MIDI informacije za svaki pad bubnja

/* Mapiranje adresa EEPROM -a

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

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

Globalne varijable se koriste za određivanje stanja svakog pad -a i u skladu s tim obavljaju MIDI komunikaciju

/ * Globalne varijable */

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

uint8_t uartBuffer [64]; // UART međuspremnik za prikupljanje i pohranjivanje MIDI Data Debouncer udarca (DRUM_PINS [KICK], KICK_DB_DURATION); // Objekat razbijača za isparljivu bool udarnog bubnja previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // prethodna logička stanja bubnjeva nestabilna bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Trenutna logička stanja bubnja

EEPROM funkcije

/* Pohranite postavke u EEPROM*/

void storeEEPROM () {

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 ); za (uint8_t i = 0; i <10; i ++) EEPROM.write (VELOCITIES_ADDR+i, drumVelocities ); }

/* Učitajte postavke sa EEPROM -a*/

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

Inicijalizacija varijabli i način programiranja, u slučaju pedala i Arduino pokretanja, aktiviraju se istovremeno

void enterProgrammingMode () {

bool confirmBreak = false; uint8_t linijaCnt = 0; uint8_t charCnt = 0; char readChar = 0; while (! confirmBreak) {if (Serial.available ()) {uartBuffer [charCnt] = Serial.read (); if (charCnt> = 29) confirmBreak = true; else charCnt ++; }} Serial.println ("OK"); storeEEPROM (); }

void initValues () {

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

Rukovači MIDI komunikacije sa kašnjenjem od 1 ms zadržavanja bilješke

/ * Reproduciraj funkciju MIDI note */

void midiOut (nabroj DRUM_POSITION drumIn) {

if (drumIn == HIHAT) {// Ako je HI-HAT pogođen, potrebno je provjeriti je li pritisnuta pedala ako (! digitalRead (drumPins [HIHAT_PEDAL])) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); kašnjenje (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } else {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); kašnjenje (1); noteOn (0x90, note bubnja [HIHAT], 0); }} else {// Napomena za uobičajeni MIDI prijenos bubnjaOno (0x90, drumNotes [drumIn], drumVelocities [drumIn]); kašnjenje (1); noteOn (0x90, drumNotes [drumIn], 0); }}

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

setup () i loop () funkcije s beskonačnom radnom petljom uređaja:

void setup () {

Serial.begin (115200);

for (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// Beskonačna petlja za otklanjanje grešaka za (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i+2)) {Serial.print ("Pin broj: D"); Serial.print (i + '0'); // Pretvori broj u ASCII znak}}} #else initValues (); / * Režim programiranja: Ako su tokom pokretanja pritisnute dve pedale - režim je aktiviran */ if (! DigitalRead (drumPins [KICK]) &&! DigitalRead (drumPins [HIHAT_PEDAL])) enterProgrammingMode (); #endif}

void loop () {for (uint8_t i = 1; i <9; i = i + 1) {currentState = digitalRead (drumPins ); if (! currentState && previousState ) midiOut (i); // Usporedimo stanja i otkrijemo prednju ivicu previousState = currentState ; } kick.update (); // Kick bubanj koristi prilagođeni algoritam debounce if (kick.edge ()) if (kick.falling ()) midiOut (KICK); }

Korak 5: Programiranje B: Python i korisničko sučelje

Programiranje B: Python i korisničko sučelje
Programiranje B: Python i korisničko sučelje
Programiranje B: Python i korisničko sučelje
Programiranje B: Python i korisničko sučelje
Programiranje B: Python i korisničko sučelje
Programiranje B: Python i korisničko sučelje

Python korisničko sučelje je na prvi pogled malo komplicirano za razumijevanje, pa bismo pokušali objasniti njegove osnove, kako koristiti, koju funkciju ima svako dugme i kako pravilno programirati Arduino uređaj.

Korisničko sučelje - aplikacija

UI je grafički prikaz za našeg programera bubnjeva, što ga čini zaista lakim za korištenje i praktičnim za programiranje Arduino uređaja u bilo koje vrijeme. Korisničko sučelje sastoji se od nekoliko grafičkih modula koji su vezani za njihovu predloženu operaciju. pogledajmo ih jedan po jedan:

  1. Slika seta bubnjeva: Python UI koristi koordinate X-Y slike za određivanje vrste bubnja. Ako je odabrano valjano područje bubnja, pojavit će se sekundarna IO poruka s poljima bilješke, brzine i Arduino terminalom za namjenski jastučić bubnja. Nakon što korisnik provjeri i odobri ove parametre, te se vrijednosti mogu prenijeti izravno na Arduino uređaj.
  2. Slika vanjskog kontrolera: Da biste mogli koristiti MIDI komplet bubnjeva s VST/okruženjem za stvaranje muzike, potrebno je pokrenuti Serial-To-MIDI tumač. Koristio sam Hairless, koji je dostupan besplatno i može se pokrenuti direktno s našeg korisničkog sučelja, samo pritiskom na njegovu sliku.
  3. Lista COM portova: Za komunikaciju s Arduinom, morate navesti njegov priključeni COM port. Lista se osvježava pritiskom na tipku Osvježi.
  4. Učitaj/spremi konfiguraciju: U kodu su definirane zadane MIDI vrijednosti, koje korisnik može izmijeniti interakcijom s korisničkim sučeljem. Konfiguracija je definirana u datoteci config.txt u određenom formatu, koji korisnik može spremiti ili učitati.
  5. Gumb za programiranje uređaja: Da biste pohranili sve promijenjene MIDI vrijednosti u Arduino EEPROM, potrebno je nakon toga pritisnuti dvije nožne pedale (Kick drum i Hi-hat pedala), pričekajte da se prijenos podataka završi. Ako je došlo do problema u komunikaciji, prikazat će se odgovarajući skočni prozor. Ako prijenos uspije, korisnički interfejs će pokazati uspješnu poruku.
  6. Dugme za izlaz: Samo izađite iz aplikacije, uz dozvolu korisnika.

Istaknuti elementi Python koda

U kodu se događa mnogo stvari, pa ćemo proširiti pisane funkcije, a ne cijeli kôd.

Prije svega, za korištenje korisničkog sučelja potrebno je preuzeti nekoliko modula kako bi kod funkcionirao:

uvoz osimport threading import tkinter kao tk iz tkinter uvoz okvir za poruke iz tkinter uvoz * iz PIL uvoza ImageTk, uvoz slike numpy kao np uvoz serijski uvoz glob

Neki moduli su uključeni u zadani Python paket. Nekoliko modula treba instalirati putem PIP alata:

pip install Jastuk

pip install numpy pip install ScreenInfo

Preporučuje se pokretanje aplikacije putem PyCharma. U budućim izdanjima planiram izvoziti izvršnu datoteku za projekt.

Kratko objašnjenje koda

Bilo bi mnogo lakše razumjeti kôd ako bismo njegove redove gledali iz perspektive funkcija i klasa:

1. Glavna funkcija - ovdje počinje kôd

if _name_ == '_main_': drumkit_gui ()

2. Konstante kompleta bubnjeva, koordinate i zadane MIDI informacije

klasa bubnjevi: DRUM_TYPES = ["Kick", "Hihat", "Snare", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Ride", "Hihat Pedal ", "Kontroler"]

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"]

BUBANJA = [36, 40, 42, 51, 49, 55, 47, 45, 43, 48] BUBANJSKE VELIČINE = [110, 100, 100, 110, 110, 110, 110, 110, 110, 110] BUBANJSKE IGRE = [8, 6, 4, 3, 11, 9, 5, 10, 2, 7]

3. UI funkcije - Rukovanje korisničkim sučeljem i grafičkim objektima

def set_active (ui)

def secondary_ui (tip bubnja)

klasa SelectionUi (tk. Frame)

klasa Application (tk. Frame)

def drumkit_gui ()

def event_ui_clicked (događaj)

def getorigin (self, event)

4. Serijska komunikacija

def get_serial_ports ()

def communication_with_arduino (port)

5. Rad s datotekama: Pohranite/učitajte postavke iz txt datoteke

def save_config ()

def load_config ()

6. Pokretanje vanjske aplikacije hairless.exe iz koda pomoću mogućnosti Python Threading

klasa ExternalExecutableThread (threading. Thread)

def run_hairless_executable ()

Da biste pokrenuli kôd, postoji lista datoteka koje je potrebno priložiti u fasciklu projekta:

  • config.txt: Datoteka postavki
  • hairless.exe: MIDI pretvarač bez dlake
  • drumkit.png: Slika koja definira sve bubnjeve na kojima se može kliknuti na našem korisničkom sučelju (mora se preuzeti iz ovog skupa slika)
  • drumgui.py: Kod projekta

To je sve što moramo naglasiti kako bi funkcioniralo. Vrlo je važno dodati datoteke u projekt: sliku bubnja, izvršnu datoteku hairless.exe i datoteku postavki config.txt.

I.. Evo završili smo!:)

Nadam se da će vam ovo uputstvo biti korisno.

Hvala na čitanju!:)

Preporučuje se: