Obsah:

MIDI bicí sada pro Python a Arduino: 5 kroků (s obrázky)
MIDI bicí sada pro Python a Arduino: 5 kroků (s obrázky)

Video: MIDI bicí sada pro Python a Arduino: 5 kroků (s obrázky)

Video: MIDI bicí sada pro Python a Arduino: 5 kroků (s obrázky)
Video: Web Programming - Computer Science for Business Leaders 2016 2024, Prosinec
Anonim
Image
Image
MIDI bicí sada pro Python a Arduino
MIDI bicí sada pro Python a Arduino
MIDI bicí sada pro Python a Arduino
MIDI bicí sada pro Python a Arduino

Už od dětství jsem si vždy chtěl koupit bicí soupravu. Tehdy všechno hudební vybavení nemělo všechny digitální aplikace, protože dnes jich máme spoustu, proto byly ceny spolu s očekáváními příliš vysoké. Nedávno jsem se rozhodl koupit nejlevnější bicí soupravu od eBay, s jedinou prioritou: Schopnost ji zbourat a připojit k zařízení vlastní hardware a software.

Nákup nebyl vůbec zklamáním: přenosná souprava roll-up bicích s 9 různými zvukovými polštářky, dva pedály nožního spínače pro kick drum a hi-hat a mikro USB zásuvku. To, co bylo opravdu demotivující, jsou výstupní zvuky (skutečným využitím této sady je připojení externího reproduktoru a užijte si to). Takže jsem se rozhodl převést jej na vlastní programovatelný přes USB, MIDI bicí soupravu založenou na Arduinu a uživatelské rozhraní založené na Pythonu, pro praktické použití a snadné úpravy, jako je výběr hlasitosti, poznámky a kanálu.

Vlastnosti zařízení:

  • Nízká cena
  • Vytvoření bicí soupravy z libovolných digitálních vstupů - dokonce i z řady tlačítek
  • Podpora komunikace a napájení pouze přes rozhraní USB - Integrace převodníku USB na UART a zařízení Arduino
  • Minimální díly pro správnou funkci
  • Snadno použitelné uživatelské rozhraní založené na Pythonu
  • Kompletní podpora MIDI s nastavitelnou rychlostí, notami a piny Arduino
  • Uložit a načíst vlastní konfigurace bicích uložené v paměti zařízení

Pojďme k projektu…

Krok 1: Teorie provozu

Teorie provozu
Teorie provozu
Teorie provozu
Teorie provozu
Teorie provozu
Teorie provozu

Blokové schéma

Nejprve se zaměřme na strukturu projektu a rozdělíme ji na samostatné bloky:

Roll-up bicí souprava

Hlavní jednotka projektu. Skládá se z 9 samostatných bicích padů, kde každý pad je řadou tlačítek, která při zásahu mění svůj logický stav. Díky své struktuře existuje možnost sestavit tuto konkrétní bicí soupravu z jakýchkoli tlačítek. Každá bicí podložka je připojena k vytahovacímu odporu na hlavní elektronické desce, takže když je na bicí podložku opakovaně zasažen, je k zemi obvodu přivázán konkrétní spínač a na lince pístu je logický LOW. Pokud není vyvíjen žádný tlak, je spínač pístové desky rozepnutý a v důsledku vytahovacího odporu k elektrickému vedení je na lince pístové desky přítomna logická VYSOKÁ. Protože cílem projektu je vytvořit kompletní digitální MIDI zařízení, lze všechny analogové části na hlavní desce plošných spojů zanedbat. Je důležité si uvědomit, že bicí souprava má dva pedály pro kick drum a hi-hat, které jsou také spojeny s vytahovacími odpory a sdílejí stejnou provozní logiku jako všechny bicí pady (o tom budeme diskutovat o něco později).

Arduino Pro-Micro

Mozek bicí soupravy. Jeho účelem je zjistit, zda z bicího padu vychází signál, a poskytnout vhodný MIDI výstup se všemi potřebnými parametry: Poznámka, rychlost a trvání signálu. Vzhledem k digitální povaze bicích padů je lze jednoduše připojit k digitálním vstupům arduino (celkem 10 pinů). Abychom mohli uložit všechna požadovaná nastavení a informace o MIDI, použijeme jeho paměť-EEPROM, a proto se při každém zapnutí zařízení načítají MIDI informace z EEPROM, takže je lze znovu naprogramovat a znovu konfigurovat. Arduino Pro-Micro je také k dispozici ve velmi malém balení a lze jej snadno přidělit do vnitřního pouzdra bicí soupravy.

Převodník USB na sériový port FTDI

Aby bylo možné programovat a definovat funkce našeho zařízení pomocí PC aplikace, je třeba převést USB rozhraní na sériové, protože Arduino Pro-Micro nemá USB. Protože komunikace mezi zařízeními je založena na UART, je v tomto projektu použito zařízení FTDI, kvůli jeho jednoduchosti použití bez ohledu na jeho další vlastnosti.

Aplikace pro PC - Python

Pokud jde o vývoj uživatelských rozhraní a rychle sestavitelné projekty, Python je vynikající řešení. Účelem aplikace uživatelského rozhraní je mnohem pohodlnější předefinovat vlastnosti MIDI pro naši bicí soupravu, ukládat informace, programovat zařízení a komunikovat mezi systémy, aniž by bylo nutné kód znovu a znovu kompilovat. Protože ke komunikaci se sadou bicích používáme sériové rozhraní, existuje po celém internetu spousta bezplatných modulů, které podporují všechny typy sériové komunikace. Kromě toho, jak bude diskutováno později, rozhraní UART se skládá celkem ze tří pinů: RXD, TXD a DTR. DTR se používá k provedení resetu na modulu Arduino, takže když máme zájem spustit MIDI aplikaci nebo připojit UI k programovacímu zařízení, není nutné znovu připojovat kabel USB nebo cokoli jiného.

Krok 2: Díly a nástroje

Díly

  • Roll-up bicí souprava
  • 2 x Sustain pedály (obvykle součástí balení DK).
  • FTDI - USB to Serial Converter
  • Arduino Pro Micro
  • Micro-USB kabel

Nástroje

  • Páječka/stanice
  • Pájecí cín
  • Tenký průměr jednožilového drátu
  • Pinzeta
  • Řezačka
  • Kleště
  • Nůž
  • Šroubovák
  • 3D tiskárna (volitelně - pro přizpůsobené pedálové platformy)

Software

  • Arduino IDE
  • Python 3 nebo vyšší
  • JetBrains Pycharm
  • Bezsrsté MIDI rozhraní
  • loopMIDI

Krok 3: Pájení a montáž

Pájení a montáž
Pájení a montáž
Pájení a montáž
Pájení a montáž
Pájení a montáž
Pájení a montáž

Jelikož je třeba kombinovat tři moduly, proces pájení a montáže je krátký a jednoduchý:

  • Připojte Arduino Pro-Micro k zařízení FTDI a ujistěte se, že připojení jsou v souladu s I/O definovanými na každém zařízení:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Odšroubujte všechny šrouby z plastového krytu bubnu, ujistěte se, že se můžete soustředit na kabel mezi deskou a deskou a jeho stahovací odpory
  • Pájejte tenké vodiče pro modul Arduino-FTDI, který jsme zkonstruovali dříve:

    • Digitální vstupy: D [2:11]
    • VBUS
    • D+
    • D-
    • GND
  • Vložte modul dovnitř pouzdra baterie tak, aby vodiče plavaly na stejné straně jako výsuvné odpory podložek
  • Pájejte všechny digitální vstupy na svorky pístnice, jak je znázorněno na posledním obrázku.
  • Pájejte sběrnici micro-USB (VBUS, D+, D-, GND) k zařízení FTDI, ujistěte se, že při sledování těchto vodičů nedochází k žádným chybám.
  • Připojte modul Arduino-FTDI horkým lepidlem ke krytu baterie
  • Sestavte zařízení pomocí vhodného upevnění šrouby

Dokázali jsme to, zařízení je sestaveno. Pokračujme ke kódu…

Krok 4: Programování A: Arduino

Programování A: Arduino
Programování A: Arduino

Pojďme popsat náš náčrt krok za krokem:

Nejprve je třeba zahrnout dvě nezbytné knihovny pro správnou funkci. EEPROM je již předinstalována v Arduino IDE, ale modul debouncer pro kick drum musí být nainstalován samostatně

#include #include

Tyto přepínače se používají hlavně v ladicích sekvencích. Pokud si chcete vyzkoušet připojení terminálů Arduino k bicím padům a určit všechny digitální vstupy, měly by být tyto přepínače definovány

/ * Přepínače pro vývojáře: Odkomentujte požadovaný režim pro ladění nebo inicializaci * ///#define LOAD_DEFAULT_VALUES // Načtěte konstantní hodnoty místo EEPROM //#definujte PRINT_PADS_PIN_NUMBERS // Vytiskněte číslo pinu připojeného k padu, který byl zasažen přes sériový port

Konstantní pole představují všechny výchozí hodnoty, včetně výčtu bicích padů. Abyste mohli zařízení spustit úplně poprvé, musíte znát přesné spojení pedálů Hi-Hat a Kick

/ * Výčet typů bubnů */

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

/ * Výchozí hodnoty */

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

/ * Doba odskoku bubnu */

konst uint8_t KICK_DB_DURATION = 30;

EEPROM se používá k ukládání/načítání všech dat pocházejících z počítačové aplikace. Rozsah adres popsaný výše ukazuje přesné umístění informací MIDI pro každý bicí pad

/* Mapování adres EEPROM

Poznámky: | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 |

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

Globální proměnné se používají k určení stavu každého padu a podle toho provádějí MIDI komunikaci

/ * Globální proměnné */

uint8_t drumNotes [10], drumVelocities [10], drumPins [10]; // MIDI proměnné

uint8_t uartBuffer [64]; // UART Buffer pro sběr a ukládání MIDI Data Debouncer kick (DRUM_PINS [KICK], KICK_DB_DURATION); // Objekt debounceru pro kick drum volatile bool previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Bicí pad předchozí logické stavy volatile bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Aktuální logické stavy bicího padu

Funkce EEPROM

/* Uložit nastavení do EEPROM*/

zrušit storeEEPROM () {

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

/* Načíst nastavení z EEPROM*/

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

Inicializace proměnných a režim programování se v případě pedálů a spouštění Arduino aktivují současně

neplatné enterProgrammingMode () {

bool confirmBreak = false; 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; else charCnt ++; }} Serial.println ("OK"); storeEEPROM (); }

zrušit initValues () {

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

Manipulátory MIDI komunikace se zpožděním 1 ms

/ * Funkce přehrávání MIDI not */

void midiOut (enum DRUM_POSITION drumIn) {

if (drumIn == HIHAT) {// Pokud byl zasažen HI-HAT, je třeba provést kontrolu, zda je sešlápnut pedál if (! digitalRead (drumPins [HIHAT_PEDAL])) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); zpoždění (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } else {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); zpoždění (1); noteOn (0x90, drumNotes [HIHAT], 0); }} else {// Běžná MIDI MIDI přenosová poznámkaOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); zpoždění (1); noteOn (0x90, drumNotes [drumIn], 0); }}

void noteOn (int cmd, int pitch, int velocity) {Serial.write (cmd); Serial.write (rozteč); Serial.write (rychlost); }

funkce setup () a loop () s nekonečnou provozní smyčkou zařízení:

neplatné nastavení () {

Serial.begin (115200);

pro (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// Nekonečná ladicí smyčka pro (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i+2)) {Serial.print ("Pin No: D"); Serial.print (i + '0'); // Převod čísla na znak ASCII}}} #else initValues (); / * Režim programování: Pokud jsou při spouštění sešlápnuty dva pedály - režim je aktivován */ 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); // Porovnání stavů a detekce sestupné hrany previousState = currentState ; } kick.update (); // Kick drum používá vlastní algoritmus debounce if (kick.edge ()) if (kick.falling ()) midiOut (KICK); }

Krok 5: Programování B: Python a uživatelské rozhraní

Programování B: Python a uživatelské rozhraní
Programování B: Python a uživatelské rozhraní
Programování B: Python a uživatelské rozhraní
Programování B: Python a uživatelské rozhraní
Programování B: Python a uživatelské rozhraní
Programování B: Python a uživatelské rozhraní

Uživatelské rozhraní Pythonu je na první pohled trochu komplikované pochopit, proto bychom se pokusili vysvětlit jeho základy, jak používat, jakou funkci má každé tlačítko a jak správně naprogramovat zařízení Arduino.

Uživatelské rozhraní - aplikace

UI je grafické znázornění našeho programátoru bicích sad, takže je opravdu snadné použití a pohodlné programování zařízení Arduino kdykoli. UI se skládá z několika grafických modulů, které jsou vázány na jejich navrhovanou operaci. podívejme se na ně jeden po druhém:

  1. Obrázek sady bicích: Uživatelské rozhraní Pythonu používá souřadnice X-Y k určení, který typ bubnu byl vybrán. Pokud byla vybrána platná oblast bubnu, zobrazí se sekundární zpráva IO s poznámkovými poli, rychlostí a terminálem Arduino pro vyhrazenou bubnovou podložku. Poté, co jsou tyto parametry ověřeny uživatelem a schváleny, mohou být tyto hodnoty přeneseny přímo do zařízení Arduino.
  2. Obrázek externího ovladače: Aby bylo možné používat MIDI bicí soupravu s prostředím pro vytváření VST/hudby, je nutné spustit tlumočník Serial-To-MIDI. Použil jsem Hairless, který je k dispozici zdarma a lze jej spustit přímo z našeho uživatelského rozhraní pouhým stisknutím jeho obrázku.
  3. Seznam portů COM: Aby bylo možné komunikovat s Arduinem, je třeba určit jeho připojený port COM. Seznam se aktualizuje stisknutím tlačítka Obnovit.
  4. Načíst/uložit konfiguraci: V kódu jsou definovány výchozí hodnoty MIDI, které může uživatel upravit prostřednictvím interakce s uživatelským rozhraním. Konfigurace je definována v souboru config.txt ve specifickém formátu, který může uživatel uložit nebo načíst.
  5. Tlačítko Program Device: Aby bylo možné uložit všechny upravené hodnoty MIDI do Arduino EEPROM, je třeba sešlápnout dva nožní pedály (Kick drum a Hi-hat pedál), počkat, až se přenos dat dokončí. Pokud došlo k jakýmkoli problémům s komunikací, zobrazí se správné vyskakovací okno. Pokud je přenos úspěšný, uživatelské rozhraní zobrazí jeho úspěšnou zprávu.
  6. Tlačítko Exit: Stačí ukončit aplikaci se svolením uživatele.

Hlavní body kódu Python

V kódu se děje spousta věcí, takže se budeme věnovat spíše psaným funkcím než celému kódu.

Za prvé, aby bylo možné používat uživatelské rozhraní, je třeba stáhnout několik modulů, aby kód fungoval:

importovat vlákno osimport importovat tkinter jako tk z tkinter importovat schránku zpráv z tkinter importovat * z PIL importovat ImageTk, obrázek importovat jako np importovat sériový import glob

Některé moduly jsou zahrnuty ve výchozím balíčku Pythonu. Prostřednictvím nástroje PIP by mělo být nainstalováno několik modulů:

pip install Polštář

pip install numpy pip install ScreenInfo

Důrazně doporučujeme spouštět aplikaci přes PyCharm. V budoucích verzích plánuji exportovat spustitelný soubor pro projekt.

Stručný kód Vysvětlení

Bude mnohem snazší porozumět kódu, pokud bychom se na jeho řádky podívali z pohledu funkcí a tříd:

1. Hlavní funkce - zde začíná kód

if _name_ == '_main_': drumkit_gui ()

2. Konstanty, souřadnice a výchozí MIDI informace bicí sady

bubny třídy: DRUM_TYPES = [„Kick“, „Hihat“, „Snare“, „Crash 1“, „Crash 2“, „Tom High“, „Tom Mid“, „Tom Low“, „Ride“, „Hihat Pedal ", "Ovladač"]

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. Funkce uživatelského rozhraní - Manipulace s uživatelským rozhraním a grafickými objekty

def set_active (ui)

def secondary_ui (drum_type)

třída SelectionUi (tk. Frame)

třída Aplikace (tk. Frame)

def drumkit_gui ()

def event_ui_clicked (událost)

def getorigin (self, event)

4. Sériová komunikace

def get_serial_ports ()

def commun_with_arduino (port)

5. Práce se soubory: Uložte/načtěte nastavení ze souboru txt

def save_config ()

def load_config ()

6. Spuštění externí aplikace hairless.exe z kódu pomocí funkcí Python Threading

třída ExternalExecutableThread (threading. Thread)

def run_hairless_executable ()

Aby bylo možné spustit kód, existuje seznam souborů, které musí být připojeny ke složce projektu:

  • config.txt: Soubor nastavení
  • hairless.exe: Bezsrstý MIDI převodník
  • drumkit.png: Obrázek, který definuje všechny klikací pady v našem uživatelském rozhraní (je třeba stáhnout ze sady obrázků tohoto kroku)
  • drumgui.py: Kód projektu

To je vše, co musíme zdůraznit, aby to fungovalo. Je velmi důležité přidat do projektu soubory: obrázek sady bicích, spustitelný soubor hairless.exe a soubor nastavení config.txt.

A.. Tady jsme skončili!:)

Doufám, že vám tento návod bude užitečný.

Děkuji za přečtení!:)

Doporučuje: