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, Studeni
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 glazbena oprema nije imala sve digitalne aplikacije kakvih danas imamo u izobilju, pa su cijene zajedno s očekivanjima bile previsoke. Nedavno sam odlučio kupiti najjeftiniji komplet bubnjeva s eBaya, s jedinim prioritetom: mogućnost rušenja i priključivanja vlastitog hardvera i softvera na uređaj.

Kupnja nije bila nimalo razočaravajuća: Prijenosni komplet bubnjeva s 9 različitih zvučnih 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). Stoga sam ga odlučio pretvoriti u svoj program koji se može programirati putem USB -a, MIDI komplet bubnjeva na temelju Arduina i Korisničko sučelje na temelju Pythona, za praktičnu uporabu i jednostavne izmjene poput odabira glasnoće, bilješki i kanala.

Značajke uređaja:

  • Niska cijena
  • Izrada kompleta bubnjeva iz bilo kojeg digitalnog ulaza - čak i 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 temeljeno na Pythonu
  • Potpuna MIDI podrška s podesivom brzinom, notom i Arduino iglicama
  • Spremi i učitaj prilagođene konfiguracije bubnja pohranjene u memoriji uređaja

Idemo dalje prema projektu…

Korak 1: Teorija rada

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

Blok dijagram

Prije svega, usredotočimo se na strukturu projekta i podijelimo je u zasebne blokove:

Roll-Up bubanj set

Glavna jedinica projekta. Sastoji se od 9 zasebnih jastučića za bubnjeve, gdje je svaki pad niz gumba koji mijenjaju svoje logičko stanje dok su pogođeni. Zbog svoje strukture postoji mogućnost izrade ovog kompleta bubnjeva od bilo kojeg gumba. Svaki bubanj je spojen na pull-up otpornik na glavnoj elektroničkoj ploči, pa dok se bubanj više puta udara, određeni prekidač je vezan za masu kruga i logičko NISKO je prisutno na liniji bubnja. Kada nema primijenjenog pritiska, prekidač bubnja je otvoren i zbog vučnog 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 podatke, koristit ćemo njegovu memoriju-EEPROM, stoga se svaki put kad uključimo uređaj učitavaju MIDI informacije iz EEPROM-a, što ga č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č

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

PC aplikacija - Python

Što se tiče razvoja korisničkog sučelja i projekata koji se brzo izrađuju, Python je izvrsno rješenje. Svrha aplikacije sučelja je učiniti znatno prikladnijim redefiniranje MIDI svojstava za naš komplet bubnjeva, pohranjivanje podataka, programskih uređaja i komunikaciju između sustava bez potrebe za sastavljanjem koda uvijek iznova. Budući da za komunikaciju s kompletom bubnjeva koristimo serijsko sučelje, 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 s programskim uređajem, nema apsolutno nikakve potrebe za ponovnim priključivanjem USB kabela ili bilo čega drugog.

Korak 2: Dijelovi i instrumenti

Dijelovi

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

Instrumenti

  • Lemilica/stanica
  • Limenka za lemljenje
  • Jednožilna žica tankog promjera
  • Pinceta
  • Rezač
  • Klešte
  • Nož
  • Odvijač
  • 3D pisač (izborno - 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, provjerite možete li se usredotočiti na kabel od ploče do ploče i njegove otpornike na izvlačenje
  • Lemljenje tankih žica za Arduino-FTDI modul koje smo prethodno konstruirali:

    • 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 posljednjoj slici.
  • Lemite mikro-USB sabirnicu (VBUS, D+, D-, GND) na FTDI uređaj, pazite da nema grešaka u traženju 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. Idemo dalje prema kodu …

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 knjižnice za pravilan rad. EEPROM je već unaprijed instaliran u Arduino IDE-u, ali modul debouncer za bubanj mora biti instaliran zasebno

#include #include

Ovi se prekidači uglavnom koriste za ispravljanje pogrešaka. Ako želite isprobati priključke Arduino terminala na jastučiće bubnjeva i odrediti sve digitalne ulaze, ti prekidači trebaju biti definirani

/ * Prekidači za programere: Uklonite komentar s željenog načina za ispravljanje pogreš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 putem serijskog porta

Konstantna polja predstavljaju sve zadane vrijednosti, uključujući nabrajanje bubnjeva. Kako biste uređaj pokrenuli po prvi put, morate znati toč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 BUBANJSKE NAPOMENE [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 otpuštanja bubnja */

const uint8_t KICK_DB_DURATION = 30;

EEPROM se koristi za spremanje/učitavanje svih podataka koji dolaze iz računalne aplikacije. Gore opisani raspon adresa prikazuje točno mjesto za MIDI informacije za svaki bubanj

/* Mapiranje adresa EEPROM -a

Bilješke: | 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 koriste se za određivanje stanja svakog jastučića i prema tome 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 pohranu MIDI Data Debouncer udarca (DRUM_PINS [KICK], KICK_DB_DURATION); // Objekt razbijača za isparljivu bool udarnog bubnja previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // prethodna logička stanja bubnja, volatile bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Trenutna logička stanja bubnja

Funkcije EEPROM -a

/* Pohranite postavke u EEPROM*/

void storeEEPROM () {

memcpy (bubnjevi, 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 ); }

/* Učitajte postavke s 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.čitano (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 istodobno

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 ("U redu"); storeEEPROM (); }

void initValues () {

#ifdef LOAD_DEFAULT_VALUES memcpy (napomene bubnja, DRUM_NOTES, 10); memcpy (drumVelocities, DRUM_VELOCITIES, 10); memcpy (drumPins, DRUM_PINS, 10); #else loadEEPROM (); #završi ako }

MIDI komunikacijski manipulatori s kašnjenjem od 1 ms zadržavanja bilješke

/ * Reproduciraj funkciju MIDI note */

void midiOut (nabroji DRUM_POSITION drumIn) {

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

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

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

void setup () {

Serial.begin (115200);

za (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// Beskonačna petlja za otklanjanje pogreš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 (); / * Način programiranja: Ako su tijekom pokretanja pritisnute dvije papučice - način rada je aktiviran */ if (! DigitalRead (drumPins [KICK]) &&! DigitalRead (drumPins [HIHAT_PEDAL])) enterProgrammingMode (); #završi ako }

void loop () {for (uint8_t i = 1; i <9; i = i + 1) {currentState = digitalRead (drumPins ); if (! currentState && previousState ) midiOut (i); // Usporedimo stanja i otkrijemo padajući rub 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

Korisničko sučelje Pythona malo je komplicirano za razumijevanje na prvi pogled, stoga bismo pokušali objasniti njegove osnove, kako koristiti, koju funkciju ima svaki gumb i kako pravilno programirati Arduino uređaj.

Korisničko sučelje - aplikacija

UI je grafički prikaz za našeg programera kompleta bubnjeva, što ga čini vrlo 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 njihov predloženi rad. pregledajmo ih jedan po jedan:

  1. Slika postavljenog bubnja: Python UI koristi koordinate slike X-Y 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 namjensku ploču 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 glazbe, potrebno je pokrenuti Serial-To-MIDI tumač. Koristio sam Hairless, koji je dostupan besplatno i može se pokrenuti izravno s našeg korisničkog sučelja, samo pritiskom na njegovu sliku.
  3. Popis COM portova: Da biste komunicirali s Arduinom, morate navesti njegov priključeni COM port. Popis se osvježava pritiskom na gumb Osvježi.
  4. Učitaj/spremi konfiguraciju: U kodu su definirane zadane MIDI vrijednosti, koje korisnik može promijeniti 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 svoju uspješnu poruku.
  6. Gumb za izlaz: Samo izađite iz aplikacije, uz dopuštenje 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 kôd funkcionirao:

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

Neki su moduli 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 izvesti izvršnu datoteku za projekt.

Kratko objašnjenje koda

Kod će biti mnogo lakše razumjeti ako bismo njegove retke promatrali 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_ŠIRINA = [60, 145, 130, 120, 120, 70, 70, 130, 120, 70, 145] DIMS_DUŽINA = [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"]

BUBANJSKE NAPOMENE = [36, 40, 42, 51, 49, 55, 47, 45, 43, 48] BUBANJSKE BRZINE = [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 (sučelje)

def sekundarni_ui (tip bubnja)

class SelectionUi (tk. Frame)

klasa Primjena (tk. Frame)

def drumkit_gui ()

def event_ui_clicked (događaj)

def getorigin (ja, događaj)

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 popis datoteka koje je potrebno priložiti u mapu projekta:

  • config.txt: Datoteka postavki
  • hairless.exe: MIDI pretvarač bez dlake
  • drumkit.png: Slika koja definira sve jastučiće bubnja na našem korisničkom sučelju (potrebno je preuzeti iz ovog koraka)
  • drumgui.py: Kod projekta

To je sve što moramo naglasiti kako bi funkcioniralo. Vrlo je važno u projekt dodati datoteke: 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 od koristi.

Hvala na čitanju!:)

Preporučeni: