Sisällysluettelo:

MIDI -rumpusetti Pythonilla ja Arduinolla: 5 vaihetta (kuvilla)
MIDI -rumpusetti Pythonilla ja Arduinolla: 5 vaihetta (kuvilla)

Video: MIDI -rumpusetti Pythonilla ja Arduinolla: 5 vaihetta (kuvilla)

Video: MIDI -rumpusetti Pythonilla ja Arduinolla: 5 vaihetta (kuvilla)
Video: Штукатурка стен - самое полное видео! Переделка хрущевки от А до Я. #5 2024, Marraskuu
Anonim
Image
Image
MIDI -rumpusetti Pythonilla ja Arduinolla
MIDI -rumpusetti Pythonilla ja Arduinolla
MIDI -rumpusetti Pythonilla ja Arduinolla
MIDI -rumpusetti Pythonilla ja Arduinolla

Olen aina halunnut ostaa rumpusetin lapsesta asti. Silloin kaikilla musiikkilaitteilla ei ollut kaikkia digitaalisia sovelluksia, kuten meillä on paljon tänään, joten hinnat ja odotukset olivat liian korkeat. Äskettäin olen päättänyt ostaa halvimman rumpusarjan eBaysta. Ainoa prioriteetti: Mahdollisuus repiä se alas ja liittää laitteeni ja ohjelmistoni laitteeseen.

Osto ei ollut pettymys: Kannettava roll-up rumpusetti, jossa on 9 erilaista äänityynyä, kaksi jalkakytkinpoljinta potkurirummulle ja hi-hat ja mikro-USB-pistorasia. Mikä oli todella demotivoivaa, se on lähtöäänet (Tämän sarjan todellinen käyttö on ulkoisen kaiuttimen liittäminen ja nauttiminen). Niinpä päätin muuntaa sen omaksi ohjelmoitavaksi USB: n kautta, Arduinoon perustuvan MIDI -rumpusarjan ja Python -pohjaisen käyttöliittymän käteväksi käyttöön ja helppokäyttöisiksi, kuten äänenvoimakkuuden, muistiinpanon ja kanavavalinnat.

Laitteen ominaisuudet:

  • Alhainen hinta
  • Luo rumpusetti mistä tahansa digitaalitulosta - jopa joukko painikkeita
  • Tiedonsiirtotuki ja virtalähde vain USB -liitännän kautta - USB -liitäntä UART -muuntimeen ja Arduino -laitteeseen
  • Mininaariosat moitteettomaan toimintaan
  • Helppokäyttöinen Python-pohjainen käyttöliittymä
  • Täydellinen MIDI -tuki säädettävällä nopeudella, muistiinpanolla ja Arduino -nastoilla
  • Tallenna ja lataa laitteen muistiin tallennetut mukautetut rumpumääritykset

Jatketaan projektia…

Vaihe 1: Toimintateoria

Toiminnan teoria
Toiminnan teoria
Toiminnan teoria
Toiminnan teoria
Toiminnan teoria
Toiminnan teoria

Lohkokaavio

Ensinnäkin keskitytään projektin rakenteeseen ja jaetaan se erillisiin lohkoihin:

Roll-up rumpusetti

Hankkeen pääyksikkö. Se koostuu yhdeksästä erillisestä rumputyynystä, joissa jokainen tyyny on joukko painikkeita, jotka muuttavat logiikkatilaansa osuessaan. Rakenteensa vuoksi on mahdollista rakentaa tämä rumpusetti mistä tahansa painikkeesta. Jokainen rumputyyny on kytketty pääelektronisen piirilevyn vetovastusvastukseen, joten kun rumputyynyä isketään toistuvasti, tietty kytkin on sidottu piirin maahan ja rummun tyynylinjalla on looginen LOW. Kun painetta ei käytetä, rumputyynyn kytkin on auki ja sähköjohtoon kohdistuvan vetovastuksen vuoksi rummutyynylinjassa on looginen HIGH. Koska projektin tarkoituksena on luoda täydellinen digitaalinen MIDI -laite, kaikki pääpiirilevyn analogiset osat voidaan jättää huomiotta. On tärkeää huomata, että rumpusarjassa on kaksi poljinta potkurirumpua ja hihat-hattua varten, jotka on myös sidottu vetovastusvastuksiin ja joilla on sama toimintalogiikka kuin kaikilla rumputyypeillä (keskustelemme siitä hieman myöhemmin).

Arduino Pro-Micro

Rumpusetin aivot. Sen tarkoituksena on havaita, tuleeko rumputyynystä signaalia, ja tarjota asianmukainen MIDI -lähtö kaikilla tarvittavilla parametreilla: Huomautus, nopeus ja signaalin kesto. Rumputyynyjen digitaalisen luonteen vuoksi ne voidaan yksinkertaisesti sitoa arduino -digitaalituloihin (yhteensä 10 nastaa). Kaikkien haluttujen asetusten ja MIDI-tietojen tallentamiseksi aiomme käyttää sen muistia-EEPROMia, joten aina kun kytket laitteeseen virran, MIDI-tiedot ladataan EEPROMista, jolloin se voidaan ohjelmoida uudelleen ja määrittää uudelleen. Lisäksi Arduino Pro-Micro on saatavana hyvin pienessä pakkauksessa, ja se voidaan sijoittaa helposti rumpusarjan sisäkoteloon.

FTDI USB -sarjamuunnin

Laitteemme ominaisuuksien ohjelmoimiseksi ja määrittämiseksi PC-sovelluksen avulla on tarpeen muuntaa USB-liitäntä sarjaliitäntään, koska Arduino Pro-Micro -laitteessa ei ole USB-liitäntää. Koska laitteiden välinen tiedonsiirto perustuu UART: iin, FTDI -laitetta käytetään tässä projektissa, koska se on helppokäyttöinen lisäominaisuuksistaan riippumatta.

PC -sovellus - Python

Mitä tulee käyttöliittymien kehittämiseen ja nopeasti rakennettaviin projekteihin, Python on loistava ratkaisu. Käyttöliittymäsovelluksen tarkoituksena on tehdä paljon helpommaksi määritellä uudelleen rumpusarjamme MIDI -ominaisuudet, tallentaa tietoja, ohjelmoida laitetta ja muodostaa kommunikaatio järjestelmien välillä ilman tarvetta koota koodia uudestaan ja uudestaan. Koska käytämme sarjaliitäntää kommunikoidaksesi rumpusarjan kanssa, Internetissä on runsaasti ilmaisia moduuleja, jotka tukevat kaikenlaista sarjaliikennettä. Lisäksi, kuten myöhemmin käsitellään, UART -liitäntä koostuu yhteensä kolmesta nastasta: RXD, TXD ja DTR. DTR: ää käytetään Arduino -moduulin nollaamiseen, joten kun olemme kiinnostuneita MIDI -sovelluksen käyttämisestä tai käyttöliittymän kytkemisestä ohjelmointilaitteeseen, USB -kaapelia tai mitään ei tarvitse liittää uudelleen.

Vaihe 2: Osat ja välineet

Osat

  • Rullasarja
  • 2 x Sustain -polkimet (sisältyvät yleensä DK -pakettiin).
  • FTDI - USB -sarjamuunnin
  • Arduino Pro Micro
  • Micro-USB-kaapeli

Välineet

  • Juotin/asema
  • Tina juotos
  • Ohut halkaisijainen yhden ytimen lanka
  • Pinsetit
  • Leikkuri
  • Pihdit
  • Veitsi
  • Ruuvimeisseli
  • 3D -tulostin (valinnainen - mukautetuille pedaalialustoille)

Ohjelmisto

  • Arduino IDE
  • Python 3 tai uudempi
  • JetBrains Pycharm
  • Karvaton MIDI -käyttöliittymä
  • loopMIDI

Vaihe 3: Juotos ja kokoonpano

Juotos ja kokoonpano
Juotos ja kokoonpano
Juotos ja kokoonpano
Juotos ja kokoonpano
Juotos ja kokoonpano
Juotos ja kokoonpano

Koska kolme moduulia on yhdistettävä, juotos- ja kokoonpanoprosessi on lyhyt ja yksinkertainen:

  • Kiinnitä Arduino Pro-Micro ja FTDI-laite yhteen ja varmista, että liitännät ovat kullakin laitteella määritettyjen I/O-liitännät:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Irrota kaikki ruuvit rummun muovikotelosta, varmista, että voit keskittyä pad-to-board -kaapeliin ja sen vetovastuksiin
  • Juottaa ohuet johdot Arduino-FTDI-moduulille, jonka olemme rakentaneet aiemmin:

    • Digitaalitulot: D [2:11]
    • VBUS
    • D+
    • D-
    • GND
  • Aseta moduuli paristokotelon sisään niin, että johdot kelluvat samalla puolella kuin tyynyjen vetovastus
  • Juotos kaikki digitaalitulot rummun tyynyliittimiin, kuten viimeisessä kuvassa on esitetty.
  • Liitä mikro-USB-väylä (VBUS, D+, D-, GND) FTDI-laitteeseen, varmista, että näiden johtojen jäljittämisessä ei ole virheitä.
  • Kiinnitä Arduino-FTDI-moduuli kuumaliimalla akkukoteloon
  • Asenna laite sopivilla ruuveilla

Olemme tehneet sen, laite on koottu. Jatketaan koodista…

Vaihe 4: Ohjelmointi A: Arduino

Ohjelmointi A: Arduino
Ohjelmointi A: Arduino

Kuvataan luonnostamme vaihe vaiheelta:

Ensinnäkin on sisällytettävä kaksi tarvittavaa kirjastoa asianmukaiseen toimintaan. EEPROM on jo esiasennettu Arduino IDE -laitteeseen, mutta potkurirumpun poistomoduuli on asennettava erikseen

#Sisällytä #Sisällytä

Näitä kytkimiä käytetään pääasiassa virheenkorjaussarjoissa. Jos haluat kokeilla Arduino -liittimien yhteyttä rumputyynyihin ja määrittää kaikki digitaalitulot, nämä kytkimet on määritettävä

/ * Kehityskytkimet: Poista kommenttien haluttu tila virheenkorjausta tai alustamista varten.

Vakiokentät edustavat kaikkia oletusarvoja, mukaan lukien rummun tyynyjen luettelointi. Jotta laitetta voidaan käyttää ensimmäistä kertaa, on tiedettävä Hi-Hat- ja Kick-pedaalien tarkka yhteys

/ * Rummutyyppien luettelointi */

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

/ * Oletusarvot */

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

/ * Potkurirummun kesto */

const uint8_t KICK_DB_DURATION = 30;

EEPROMia käytetään kaikkien PC -sovelluksesta tulevien tietojen tallentamiseen/lataamiseen. Yllä kuvattu osoitteiden alue näyttää kunkin rumputyypin MIDI -tietojen tarkan sijainnin

/* EEPROM Osoittaa kartoituksen

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

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

Globaaleja muuttujia käytetään määrittämään kunkin tyynyn tila ja suorittamaan MIDI -tiedonsiirto vastaavasti

/ * Globaalimuuttujat */

uint8_t drumNotes [10], drumVelocities [10], drumPins [10]; // MIDI -muuttujat

uint8_t uartBuffer [64]; // UART -puskuri MIDI Data Debouncer -potkun keräämiseen ja tallentamiseen (DRUM_PINS [KICK], KICK_DB_DURATION); // Potkurirummun haihtuvan boolin laukaisukohde previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Rumpualustan edellinen logiikka ilmoittaa haihtuvan bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Rumpualustan nykyiset logiikkatilat

EEPROM -toiminnot

/* Tallenna asetukset EEPROMiin*/

void storeEEPROM () {

muisti (drumNotes, uartBuffer, 10); muisti (drumPins, uartBuffer + 10, 10); muisti (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 ); }

/* Lataa asetukset EEPROMista*/

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

Muuttujien alustus ja ohjelmointitila, kun kyseessä ovat polkimet ja Arduino -käynnistys, aktivoidaan samanaikaisesti

void enterProgrammingMode () {

bool vahvistaBreak = epätosi; uint8_t lineCnt = 0; uint8_t charCnt = 0; char readChar = 0; while (! vahvistaBreak) {if (Serial.available ()) {uartBuffer [charCnt] = Serial.read (); if (charCnt> = 29) vahvistaBreak = true; muu charCnt ++; }} Serial.println ("OK"); storeEEPROM (); }

void initValues () {

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

MIDI -tiedonsiirtokäsittelijät 1 ms: n viiveellä

/ * Toista MIDI -muistitoiminto */

void midiOut (enum DRUM_POSITION drumIn) {

if (drumIn == HIHAT) {// Jos HI-HAT osui, on tarkistettava, painetaanko poljinta, jos (! digitalRead (drumPins [HIHAT_PEDAL])) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); viive (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } else {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); viive (1); noteOn (0x90, drumNotes [HIHAT], 0); }} else {// Säännöllinen rumpu MIDI -lähetys noteOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); viive (1); noteOn (0x90, drumNotes [drumIn], 0); }}

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

setup () - ja loop () -toiminnot, joissa on ääretön laitteen toimintasilmukka:

void setup () {

Sarja.alku (115200);

for (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// Infinite debug loop for (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i+2)) {Serial.print ("Pin No: D"); Sarjanjälki (i + '0'); // Muunna numero ASCII -merkiksi}}} #else initValues (); / * Ohjelmointitila: Jos kahta poljinta painetaan käynnistyksen aikana - tila on aktivoitu */ if (! DigitalRead (drumPins [KICK]) &&! DigitalRead (drumPins [HIHAT_PEDAL])) enterProgrammingMode (); #loppu Jos }

void loop () {for (uint8_t i = 1; i <9; i = i + 1) {currentState = digitalRead (drumPins ); if (! currentState && previousState ) midiOut (i); // Vertaa tiloja ja havaitse putoava reuna previousState = currentState ; } kick.update (); // Potkurumpu käyttää mukautettua palautusalgoritmia if (kick.edge ()) if (kick.falling ()) midiOut (KICK); }

Vaihe 5: Ohjelmointi B: Python ja käyttöliittymä

Ohjelmointi B: Python ja käyttöliittymä
Ohjelmointi B: Python ja käyttöliittymä
Ohjelmointi B: Python ja käyttöliittymä
Ohjelmointi B: Python ja käyttöliittymä
Ohjelmointi B: Python ja käyttöliittymä
Ohjelmointi B: Python ja käyttöliittymä

Python -käyttöliittymä on hieman monimutkainen ymmärtää ensisilmäyksellä, joten yritämme selittää sen perusasiat, kuinka käyttää, mitä toimintoa jokaisella painikkeella on ja kuinka ohjelmoida Arduino -laite oikein.

Käyttöliittymä - sovellus

Käyttöliittymä on graafinen esitys rumpusarjan ohjelmoijallemme, mikä tekee siitä todella helppokäyttöisen ja kätevän ohjelmoida Arduino -laitteen milloin tahansa. Käyttöliittymä koostuu useista graafisista moduuleista, jotka on sidottu niiden ehdotettuun toimintaan. tarkastellaan niitä yksi kerrallaan:

  1. Rumpusarjakuva: Python-käyttöliittymä määrittää XY-kuvan koordinaatit valitun rummutyypin määrittämiseksi. Jos kelvollinen rumpualue on valittu, näkyviin tulee toissijainen IO -viesti, jossa on muistiinpanokentät, nopeus ja Arduino -liitäntä omistetulle rumputyynylle. Kun käyttäjä on tarkistanut ja hyväksynyt nämä parametrit, nämä arvot voidaan lähettää suoraan Arduino -laitteelle.
  2. Ulkoisen ohjaimen kuva: Jotta voidaan käyttää MIDI-rumpusettiä VST/musiikkia luovan ympäristön kanssa, on käytettävä Serial-to-MIDI-tulkkia. Olen käyttänyt Hairlessia, joka on saatavilla ilmaiseksi ja jota voidaan käyttää suoraan käyttöliittymästämme vain painamalla sen kuvaa.
  3. COM -porttiluettelo: Jotta voit kommunikoida Arduinon kanssa, sinun on määritettävä sen liitteenä oleva COM -portti. Listaa päivitetään painamalla Päivitä -painiketta.
  4. Lataa/tallenna kokoonpano: Koodissa on määritetty oletusarvoisia MIDI -arvoja, joita käyttäjä voi muokata vuorovaikutuksessa käyttöliittymän kanssa. Määritykset määritetään config.txt -tiedostossa tietyssä muodossa, jonka käyttäjä voi tallentaa tai ladata.
  5. Ohjelmointilaitteen painike: Kaikkien muokattujen MIDI-arvojen tallentamiseksi Arduino EEPROM -laitteeseen on sen jälkeen painettava kahta jalkapoljinta (potkurirumpu ja Hi-hat-poljin), odota tietojen siirtämistä loppuun. Jos viestintäongelmia esiintyi, oikea ponnahdusikkuna näytetään. Jos lähetys onnistuu, käyttöliittymä näyttää onnistuneen viestin.
  6. Poistu -painike: Poistu sovelluksesta vain käyttäjän luvalla.

Python -koodin kohokohdat

Koodissa tapahtuu paljon asioita, joten laajennamme kirjallisiin toimintoihin koko koodin sijasta.

Ensinnäkin käyttöliittymän käyttämiseksi on ladattava useita moduuleja koodin toimimiseksi:

tuoda osimport -ketjutus tuonti tkinter tk: stä tkinteristä tuoda viestilaatikko tkinter -tuonnista * PIL -tuonnista ImageTk, kuvan tuonti numero np -tuontina sarjatuonti globaali

Jotkut moduulit sisältyvät Python -oletuspakettiin. PIP -työkalun kautta on asennettava useita moduuleja:

pip asenna tyyny

pip install numpy pip install ScreenInfo

On erittäin suositeltavaa käyttää sovellusta PyCharmin kautta. Tulevissa julkaisuissa aion viedä suoritettavan tiedoston projektille.

Lyhyt selitys koodista

Koodin ymmärtäminen on paljon helpompaa, jos tarkastelemme sen rivejä funktioiden ja luokkien näkökulmasta:

1. Päätoiminto - tästä koodi alkaa

jos _nimi_ == '_main_': drumkit_gui ()

2. Rumpusarjan vakioita, koordinaatteja ja oletus -MIDI -tietoja

luokan rummut: DRUM_TYPES = ["Kick", "Hihat", "Snare", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Ride", "Hihat Pedal" "," Ohjain "]

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. Käyttöliittymätoiminnot - Käyttöliittymän ja graafisten objektien käsittely

def set_active (ui)

def sekundäärinen_ui (rummun_tyyppi)

luokka SelectionUi (tk. Frame)

luokan sovellus (tk. kehys)

def drumkit_gui ()

def event_ui_clicked (tapahtuma)

def getorigin (itse, tapahtuma)

4. Sarjaviestintä

def get_serial_ports ()

def kommunikoida_arduinon kanssa (portti)

5. Tiedostojen käsittely: Tallenna/lataa asetukset txt -tiedostosta

def save_config ()

def load_config ()

6. Suorita ulkoinen sovellus hairless.exe koodista Python Threading -ominaisuuksien avulla

luokka ExternalExecutableThread (threading. Thread)

def run_hairless_executable ()

Koodin suorittamiseksi on luettelo tiedostoista, jotka on liitettävä projektikansioon:

  • config.txt: Asetustiedosto
  • hairless.exe: Karvaton MIDI -muunnin
  • drumkit.png: Kuva, joka määrittää kaikki käyttöliittymämme napsautettavat rumputyynyt (on ladattava tämän vaiheen kuvasarjasta)
  • drumgui.py: Projektikoodi

Se on kaikki mitä meidän on korostettava, jotta se toimisi. On erittäin tärkeää lisätä tiedostoja projektiin: rumpusarjakuva, suoritettava tiedosto hairless.exe ja asetustiedosto config.txt.

Ja.. Tässä olemme tehneet!:)

Toivottavasti tästä opettavaisesta on sinulle hyötyä.

Kiitos lukemisesta!:)

Suositeltava: