Мазмұны:

Python мен Arduino -дағы MIDI барабан жинағы: 5 қадам (суреттермен)
Python мен Arduino -дағы MIDI барабан жинағы: 5 қадам (суреттермен)

Бейне: Python мен Arduino -дағы MIDI барабан жинағы: 5 қадам (суреттермен)

Бейне: Python мен Arduino -дағы MIDI барабан жинағы: 5 қадам (суреттермен)
Бейне: Драм-секвенсор Arduino: 8 дорожек, 16 шагов на такт, 8 тактов на паттерн 2024, Желтоқсан
Anonim
Image
Image
Python мен Arduino -дағы MIDI барабан жинағы
Python мен Arduino -дағы MIDI барабан жинағы
Python мен Arduino -дағы MIDI барабан жинағы
Python мен Arduino -дағы MIDI барабан жинағы

Мен бала кезімнен барабан жинағын сатып алғым келді. Ол кезде барлық музыкалық қондырғыларда цифрлық қосымшалар жоқ еді, өйткені бізде бүгінгі күн көп, сондықтан бағалар мен күтулер тым жоғары болды. Жақында мен eBay -ден ең арзан барабан жинағын сатып алуды шештім, оны бірінші кезекте шешуге болады: оны бұзып, өзімнің аппараттық және бағдарламалық жасақтаманы құрылғыға қосу мүмкіндігі.

Сатып алу мүлде көңіл көншітпеді: 9 түрлі дыбыс жастықшалары бар портативті барабан жинағы, барабанға арналған екі табанды қосқыш пен жоғары қалпақ және микро-USB розеткасы. Шынында демотивация болатын нәрсе - бұл шығыс дыбыстары (бұл жиынтықтың нақты қолданылуы - сыртқы динамикті қосу және ләззат алу). Сонымен, мен оны USB, Arduino негізіндегі MIDI барабандар жиынтығы мен Python негізіндегі пайдаланушы интерфейсі арқылы өзімнің бағдарламаланатын түріме айналдыруды шештім, бұл дыбысты, нотаны және арнаны таңдауға ыңғайлы.

Құрылғының ерекшеліктері:

  • Төмен баға
  • Кез келген цифрлық кірістен барабан жинағын жасау - тіпті түймелер жиыны
  • Байланысты қолдау және тек USB интерфейсі арқылы қуат көзі - UART түрлендіргіші мен Arduino құрылғысына USB интеграциясы
  • Дұрыс жұмыс істеу үшін миниум бөлшектері
  • Python негізіндегі қарапайым интерфейс
  • Реттелетін жылдамдық, нота және Arduino түйреуіштері бар толық MIDI қолдауы
  • Құрылғының жадында сақталатын барабанның конфигурациясын сақтау және жүктеу

Жобаға көшейік …

1 -қадам: Операция теориясы

Операция теориясы
Операция теориясы
Операция теориясы
Операция теориясы
Операция теориясы
Операция теориясы

Блок диаграммасы

Алдымен жобаның құрылымына тоқталайық және оны бөлек блоктарға бөлейік:

Барабанды жинау

Жобаның негізгі бірлігі. Ол 9 бөлек барабан алаңынан тұрады, мұнда әр тақта соғылған кезде логикалық күйін өзгертетін түймелер жиыны болып табылады. Құрылымына байланысты барабан жинағын кез келген түймешіктерден жасауға болады. Әр барабан жастықшасы негізгі электронды тақтадағы тартқыш резисторға қосылады, сондықтан барабан тақтасы бірнеше рет соғылған кезде контурдың жерге арнайы қосқышы байланған және логикалық LOW барабан тақтасының желісінде болады. Қысым болмаған кезде, барабан тақтасының қосқышы ашық және электр желісіне тартылатын резистордың арқасында логикалық HIGH барабан тақтасының желісінде болады. Жобаның мақсаты толық сандық MIDI құрылғысын құру болғандықтан, негізгі ПХД -дегі барлық аналогтық бөлшектерді елемеуге болады. Барабан жинағында барабан мен жоғары қалпақ үшін екі педаль бар екенін ескеру қажет, олар да тартылатын резисторларға байланған және барлық барабандарға ұқсас логикамен бөліседі (біз оны сәл кейінірек талқылаймыз)).

Arduino Pro-Micro

Барабан жинағының миы. Оның мақсаты - барабаннан сигналдың бар -жоғын анықтау және барлық қажетті параметрлермен сәйкес MIDI шығысын қамтамасыз ету: Ескертпе, сигналдың жылдамдығы мен ұзақтығы. Барабан жастықшаларының сандық сипатына байланысты оларды arduino цифрлық кірістеріне байлауға болады (барлығы 10 түйреуіш). Барлық қажетті параметрлер мен MIDI ақпаратын сақтау үшін біз оның жадысын қолданамыз-EEPROM, сондықтан құрылғыны қосқан сайын MIDI ақпараты EEPROM-дан жүктеледі, бұл оны қайта бағдарламаланатын және қайта конфигурацияланатын етеді. Сондай-ақ, Arduino Pro-Micro өте кішкентай пакетте бар және оны барабан жинағының ішкі корпусына оңай бөлуге болады.

FTDI USB сериялық түрлендіргіші

Компьютерлік қосымшаның көмегімен біздің құрылғының мүмкіндіктерін бағдарламалау және анықтау үшін USB интерфейсін сериялық түрлендіру қажет, себебі Arduino Pro-Micro-да USB жоқ. Құрылғылар арасындағы байланыс UART -қа негізделгендіктен, FTDI құрылғысы қосымша қасиеттеріне қарамастан қолданудың қарапайымдылығына байланысты осы жобада қолданылады.

ДК қосымшасы - Python

Пайдаланушы интерфейстері мен жылдам құрастырылатын жобалар туралы айтатын болсақ, Python-бұл тамаша шешім. UI қосымшасының мақсаты - біздің барабан жинағының MIDI қасиеттерін қайта анықтауды, ақпаратты сақтауды, бағдарламалық құралды сақтауды және кодты қайта -қайта жинамай -ақ жүйелер арасында байланыс орнатуды әлдеқайда ыңғайлы ету. Біз барабан жиынтығымен байланысу үшін сериялық интерфейсті қолданатындықтан, Интернетте сериялық байланыстың кез келген түрін қолдайтын көптеген ақысыз модульдер бар. Сонымен қатар, кейінірек талқыланатын болғандай, UART интерфейсі үш түйреуіштен тұрады: RXD, TXD және DTR. DTR Arduino модулін қалпына келтіру үшін қолданылады, сондықтан біз MIDI қосымшасын іске қосуға немесе UI -ді бағдарламалық құрылғыға қосуға қызығушылық танытқанда, USB кабелін немесе кез келгенін қайта қосудың қажеті жоқ.

2 -қадам: Бөлшектер мен аспаптар

Бөлшектер

  • Барабанды жинау
  • 2 x Sustain Pedals (Әдетте, DK пакетіне кіреді).
  • FTDI - USB сериялық түрлендіргіші
  • Arduino Pro Micro
  • Micro-USB кабелі

Аспаптар

  • Дәнекерлеуші/станция
  • Пісіру қалайы
  • Жіңішке диаметрлі бір ядролы сым
  • Пинцет
  • Кескіш
  • Плиер
  • Пышақ
  • Бұрауыш
  • 3D принтері (қосымша - реттелген педальды платформалар үшін)

Бағдарламалық қамтамасыз ету

  • Arduino IDE
  • Python 3 немесе одан жоғары
  • JetBrains Pycharm
  • Шашсыз MIDI интерфейсі
  • loopMIDI

3 -қадам: Дәнекерлеу және құрастыру

Дәнекерлеу және құрастыру
Дәнекерлеу және құрастыру
Дәнекерлеу және құрастыру
Дәнекерлеу және құрастыру
Дәнекерлеу және құрастыру
Дәнекерлеу және құрастыру

Біріктіру қажет үш модуль болғандықтан, дәнекерлеу мен жинау процесі қысқа және қарапайым:

  • Arduino Pro-Micro-ны FTDI құрылғысымен бірге жалғаңыз, қосылымдардың әр құрылғыда анықталған енгізу-шығару талаптарына сәйкес келетініне көз жеткізіңіз:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Барабанның пластикалық корпусындағы барлық бұрандаларды алыңыз, тақтаға арналған кабельге және оның тартылатын резисторларына назар аудара алатындығыңызды тексеріңіз.
  • Біз бұрын құрастырған Arduino-FTDI модулі үшін дәнекерленген жіңішке сымдар:

    • Сандық кірістер: D [2:11]
    • VBUS
    • D+
    • D-
    • GND
  • Модульді батарея корпусының ішіне салыңыз, сымдар жастықшалардың тартылатын резисторларымен бір жағында қалқып тұруы үшін.
  • Барлық цифрлық кірістерді соңғы суретте көрсетілгендей барабан тақтасының терминалдарына дәнекерлеңіз.
  • FTDI құрылғысына микро USB шинасын (VBUS, D+, D-, GND) дәнекерлеңіз, бұл сымдарды бақылауда қателіктер жоқ екеніне көз жеткізіңіз.
  • Arduino-FTDI модулін батареяның корпусына ыстық желіммен бекітіңіз
  • Құрылғыны тиісті бұрандалармен бекітіңіз

Біз жасадық, құрылғы жиналды. Кодты жалғастырайық …

4 -қадам: Бағдарламалау A: Arduino

Бағдарламалау A: Arduino
Бағдарламалау A: Arduino

Біздің эскизді кезең-кезеңмен сипаттайық:

Ең алдымен, дұрыс жұмыс істеу үшін екі қажетті кітапхананы қосу қажет. EEPROM Arduino IDE-де алдын ала орнатылған, бірақ барабанға арналған дебютер модулі бөлек орнатылуы керек

#қосу #қосу

Бұл қосқыштар негізінен отладтау тізбегінде қолданылады. Егер сіз барабандарға Arduino терминалдарын қосқыңыз келсе және барлық цифрлық кірістерді анықтағыңыз келсе, бұл қосқыштар анықталуы керек

/ * Әзірлеуші қосқыштары: отладтау немесе инициализациялау үшін қалаған режимге түсініктеме беріңіз * ///#LOAD_DEFAULT_VALUES анықтаңыз // EEPROM орнына тұрақты мәндерді жүктеңіз //#PRINT_PADS_PIN_NUMBERS анықтаңыз // Сериялық порт арқылы соққан тақтаға қосылған пин нөмірін басып шығарыңыз.

Тұрақты өрістер барабан тақтасын санауды қоса, барлық әдепкі мәндерді көрсетеді. Құрылғыны бірінші рет іске қосу үшін Hi-Hat пен Kick педальдарының нақты қосылуын білу қажет

/ * Барабан түрін санау */

DRUM_POSITION енгізу {KICK = 0, SNARE, HIHAT, RIDE, CYMBAL1, CYMBAL2, TOM_HIGH, TOM_MID, TOM_LO, HIHAT_PEDAL};

/ * Әдепкі мәндер */

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

/ * Барабанның шығарылу ұзақтығы */

const uint8_t KICK_DB_DURATION = 30;

EEPROM ДК қосымшасынан келетін барлық деректерді сақтауға/жүктеуге арналған. Жоғарыда сипатталған адрестер әр барабан тақтасы үшін MIDI ақпаратының нақты орнын көрсетеді

/* EEPROM мекенжайларды салыстыру

Ескертулер: | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 |

Түйреуіштер: | 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13 | Жылдамдықтар | 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;

Жаһандық айнымалылар әр тақтаның күйін анықтау үшін қолданылады және сәйкесінше MIDI байланысын орындайды

/ * Жаһандық айнымалылар */

uint8_t drumNotes [10], барабанның жылдамдығы [10], барабанның түйреуіштері [10]; // MIDI айнымалылары

uint8_t uartBuffer [64]; // MIDI деректерді жоюға арналған UART буфері (DRUM_PINS [KICK], KICK_DB_DURATION); // Барабанның ұшуға болатын болатқа арналған дебиторы алдыңғыState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Барабан тақтасы алдыңғы логикада тұрақсыз боль ағымдағыState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Барабан тақтасының ағымдағы логикалық күйлері

EEPROM функциялары

/* Параметрлерді EEPROM -де сақтау*/

жарамсыз 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 ); үшін (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 ); }

/* EEPROM -дан параметрлерді жүктеу*/

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

Айнымалылардың инициализациясы мен бағдарламалау режимі, педаль жағдайында және Arduino жүктелуі бір уақытта қосылады

жарамсыз enterProgrammingMode () {

bool confirmBreak = жалған; 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 («Жарайды»); storeEEPROM (); }

жарамсыз initValues () {

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

Жазбаны ұстау уақыты 1 мс кешіктірілген MIDI байланыс өңдегіштері

/ * MIDI жазба функциясын ойнату */

void midiOut (DRUM_POSITION drumIn жазылады) {

if (drumIn == HIHAT) {// Егер HI-HAT соққы болса, педальдың басылғанын тексеруді орындау қажет, егер (! digitalRead (drumPins [HIHAT_PEDAL])) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); кешіктіру (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } else {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); кешіктіру (1); noteOn (0x90, drumNotes [HIHAT], 0); }} else {// Қалыпты барабан MIDI беру нотасыOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); кешіктіру (1); noteOn (0x90, drumNotes [drumIn], 0); }}

void noteOn (int cmd, int pitch, int жылдамдығы) {Serial.write (cmd); Serial.write (қадам); Serial.write (жылдамдық); }

setup () және loop () функциялары құрылғының шексіз жұмыс циклы бар:

жарамсыз орнату () {

Serial.begin (115200);

for (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// (uint8_t i = 0; i <10; i ++) үшін шексіз күйін келтіру циклы {if (! digitalRead (i+2)) {Serial.print («Pin No: D»); Serial.print (i + '0'); // Санды ASCII таңбасына түрлендіру}}} #else initValues (); / * Бағдарламалау режимі: Егер жүктеу кезінде екі педаль басылса - режим қосылады */ 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); // Күйлерді салыстырыңыз және құлап жатқан шекті табыңыз алдыңғыState = currentState ; } kick.update (); // Kick барабаны реттелетін шығудың алгоритмін қолданады if (kick.edge ()) if (kick.falling ()) midiOut (KICK); }

5 -қадам: В бағдарламалау: Python және пайдаланушы интерфейсі

Бағдарламалау B: Python және пайдаланушы интерфейсі
Бағдарламалау B: Python және пайдаланушы интерфейсі
Бағдарламалау B: Python және пайдаланушы интерфейсі
Бағдарламалау B: Python және пайдаланушы интерфейсі
Бағдарламалау B: Python және пайдаланушы интерфейсі
Бағдарламалау B: Python және пайдаланушы интерфейсі

Python пайдаланушы интерфейсін бір қарағанда түсіну біршама күрделі, сондықтан біз оның негіздерін, қалай қолдану керектігін, әр түймеде қандай функция бар екенін және Arduino құрылғысын қалай дұрыс бағдарламалау керектігін түсіндіруге тырысамыз.

Қолданушы интерфейсі

UI - бұл біздің барабандар жиынтығының бағдарламашысының графикалық көрінісі, бұл оны Arduino құрылғысын кез келген уақытта қолдануға ыңғайлы және ыңғайлы етеді. UI бірнеше графикалық модульдерден тұрады, олар ұсынылған жұмыспен байланысты. оларды бір -бірлеп қарастырайық:

  1. Барабан жиынтығы кескіні: Python UI барабанның қай түрі таңдалғанын анықтау үшін X-Y кескін координаттарын қолданады. Егер жарамды барабан аймағы таңдалса, арнайы барабан алаңына арналған өріс, жылдамдық және Arduino терминалы бар қосымша IO хабарламасы пайда болады. Бұл параметрлерді пайдаланушы тексеріп, мақұлдағаннан кейін бұл мәндерді Arduino құрылғысына тікелей беруге болады.
  2. Сыртқы контроллердің суреті: MIDI барабандар жинағын VST/Music құратын ортаны қолдана білу үшін Serial-to-MIDI интерпретаторын іске қосу қажет. Мен Hairless қолдандым, ол ақысыз қол жетімді және оны біздің интерфейстен тікелей іске қосуға болады, оның суретін басу арқылы.
  3. COM порттарының тізімі: Arduino -мен байланысу үшін оған қосылған COM портын көрсету қажет. Жаңарту түймесін басу арқылы тізім жаңартылады.
  4. Конфигурацияны жүктеу/сақтау: кодта анықталған әдепкі MIDI мәндері бар, оны пайдаланушы интерфейспен әрекеттесу арқылы өзгерте алады. Конфигурация config.txt файлында пайдаланушы сақтай алатын немесе жүктей алатын арнайы форматта анықталады.
  5. Бағдарламалық құрылғы түймесі: Барлық өзгертілген MIDI мәндерін Arduino EEPROM-де сақтау үшін, екі аяқ педальін (Kick барабаны мен Hi-hat педалы) басу қажет, содан кейін деректерді берудің аяқталуын күтіңіз. Егер байланыс мәселесі болса, тиісті қалқымалы терезе көрсетіледі. Егер тасымалдау сәтті болса, UI өзінің сәтті хабарын көрсетеді.
  6. Шығу түймесі: Пайдаланушының рұқсатымен қосымшадан шығыңыз.

Python кодының ерекшеліктері

Кодта көп нәрсе болып жатыр, сондықтан біз бүкіл кодты емес, жазбаша функцияларды кеңейтеміз.

Біріншіден, интерфейсті қолдану үшін кодтың жұмыс істеуі үшін бірнеше модульдерді жүктеу қажет:

osimport ағындарын импорттау tkinter -ді tkinter -ден tkter -ден импорттаудан хабарлама жәшігін импорттау * PIL импорттау ImageTk -тен импорттау

Кейбір модульдер әдепкі Python пакетіне кіреді. PIP құралы арқылы бірнеше модульдерді орнату қажет:

pip жастықшасын орнатыңыз

pip install numpy pip орнату ScreenInfo

PyCharm арқылы қосымшаны іске қосу ұсынылады. Болашақта шығарылымдарда мен жобаның орындалатын файлын экспорттауды жоспарлап отырмын.

Кодтың қысқаша түсіндірмесі

Егер біз оның жолдарына функциялар мен сыныптар тұрғысынан қарайтын болсақ, кодты түсіну әлдеқайда жеңіл болады:

1. Негізгі функция - бұл жерде код басталады

егер _ аты _ == '_ негізгі _': drumkit_gui ()

2. Барабан жинағының тұрақтылары, координаттары және әдепкі MIDI ақпараты

сынып барабандары: DRUM_TYPES = [«соққы», «хихат», «тұзақ», «апат 1», «апат 2», «том жоғары», «том орта», «том төмен», «міну», «хихат педаль») «,» Контроллер «]

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 = [«соққы», «тұзақ», «хихат», «міну», «апат 1», «апат 2», «Том жоғары», «Том Мид», «Том төмен», «хихат педаль»]

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. UI функциялары - пайдаланушы интерфейсі мен графикалық объектілерді өңдеу

def set_active (интерфейс)

def Second_ui (барабан_түрі)

класс SelectionUi (tk. Frame)

сынып қосымшасы (tk. Frame)

def drumkit_gui ()

def event_ui_clicked (оқиға)

def getorigin (өзіндік, оқиға)

4. Сериялық байланыс

def get_serial_ports ()

def communication_with_arduino (порт)

5. Файлдармен жұмыс: txt файлынан параметрлерді сақтау/жүктеу

def save_config ()

def load_config ()

6. Python Threading мүмкіндіктерін пайдаланып кодтан hairless.exe сыртқы қосымшасын іске қосу

ExternalExecutableThread класы (threading. Thread)

def run_hairless_executable ()

Кодты іске қосу үшін жоба қалтасына тіркелуі қажет файлдардың тізімі бар:

  • config.txt: Параметрлер файлы
  • hairless.exe: Шашсыз MIDI түрлендіргіші
  • drumkit.png: біздің пайдаланушы интерфейсіндегі барлық басылатын барабан тақталарын анықтайтын сурет (осы қадамның суреттер жиынтығынан жүктеу керек)
  • drumgui.py: Жоба коды

Бұл жұмыс істеу үшін біз бәрін атап өтуіміз керек. Жобаға файлдарды қосу өте маңызды: барабанға орнатылған сурет, орындалатын орындалатын hairless.exe және config.txt файлының параметрлері.

Ал.. Міне, біз осылай жасадық!:)

Сізге бұл нұсқаулық пайдалы болады деп үміттенемін.

Оқығаныңыз үшін рахмет!:)

Ұсынылған: