Оглавление:

MIDI-ударная установка на Python и Arduino: 5 шагов (с изображениями)
MIDI-ударная установка на Python и Arduino: 5 шагов (с изображениями)

Видео: MIDI-ударная установка на Python и Arduino: 5 шагов (с изображениями)

Видео: MIDI-ударная установка на Python и Arduino: 5 шагов (с изображениями)
Видео: «Программирование платформы EV3 на языке Python» 2024, Ноябрь
Anonim
Image
Image
MIDI-ударная установка на Python и Arduino
MIDI-ударная установка на Python и Arduino
MIDI-ударная установка на Python и Arduino
MIDI-ударная установка на Python и Arduino

Я всегда хотел купить ударную установку с детства. В то время у всего музыкального оборудования не было всех цифровых приложений, как у нас сегодня много, поэтому цены и ожидания были слишком высокими. Недавно я решил купить самую дешевую ударную установку на eBay, с единственным приоритетом: возможность разобрать ее и прикрепить к устройству мое собственное оборудование и программное обеспечение.

Покупка не разочаровала: портативная барабанная установка с 9 различными звуковыми пэдами, две педали ножного переключателя для бас-барабана и хай-хэта, а также разъем питания micro-USB. Что действительно демотивировало, так это выводимые звуки (фактическое использование этого набора - подключить внешний динамик и наслаждаться им). Итак, я решил преобразовать его в свой собственный, программируемый через USB, MIDI-набор ударных на основе Arduino и пользовательский интерфейс на основе Python, для удобного использования и простых модификаций, таких как выбор громкости, нот и каналов.

Особенности устройства:

  • Низкая цена
  • Создание ударной установки из любых цифровых входов - даже множества кнопок
  • Поддержка связи и электропитание только через интерфейс USB - Интеграция преобразователя USB в UART и устройства Arduino
  • Mininum детали для правильной работы
  • Простой в использовании пользовательский интерфейс на основе Python
  • Полная поддержка MIDI с регулируемой скоростью, нотами и контактами Arduino
  • Сохранение и загрузка пользовательских конфигураций ударных, хранящихся в памяти устройства

Приступим к проекту…

Шаг 1: теория работы

Теория Операции
Теория Операции
Теория Операции
Теория Операции
Теория Операции
Теория Операции

Блок-схема

В первую очередь остановимся на структуре проекта и разделим ее на отдельные блоки:

Roll-Up Drum Kit (рулонный барабан)

Основной блок проекта. Он состоит из 9 отдельных пэдов ударных, каждый из которых представляет собой набор кнопок, которые изменяют свое логическое состояние при нажатии. Из-за своей конструкции есть возможность собрать эту конкретную ударную установку из любых кнопок. Каждый пэд барабана подключен к подтягивающему резистору на основной электронной плате, таким образом, когда по пэду барабана неоднократно ударяют, определенный переключатель привязан к заземлению схемы, и на линии пэда барабана присутствует логический НИЗКИЙ уровень. При отсутствии давления переключатель пэда ударных разомкнут, и из-за подтягивающего резистора к линии питания на линии пэда ударных присутствует логический ВЫСОКИЙ уровень. Поскольку целью проекта является создание полного цифрового MIDI-устройства, всеми аналоговыми частями на главной плате можно пренебречь. Важно отметить, что на ударной установке есть две педали для бас-барабана и хай-хэта, которые также привязаны к подтягивающим резисторам и имеют ту же логику работы, что и все барабанные пэды (мы обсудим это немного позже.).

Ардуино Про-Микро

Мозг ударной установки. Его цель - определить, выходит ли сигнал из пэда ударных, и обеспечить соответствующий 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 или подключении пользовательского интерфейса к программному устройству, нет абсолютно никакой необходимости повторно подключать USB-кабель или что-то еще.

Шаг 2: Детали и инструменты

Запчасти

  • Roll-Up Drum Kit (рулонный барабан)
  • 2 сустейн-педали (обычно входят в комплект DK).
  • FTDI - преобразователь USB в последовательный порт
  • Arduino Pro Micro
  • Кабель Micro-USB

Инструменты

  • Паяльник / Станция
  • Паяльное олово
  • Одножильный провод тонкого диаметра
  • Пинцет
  • Резак
  • Плоскогубцы
  • Нож
  • Отвертка
  • 3D-принтер (опционально - для индивидуальных педальных платформ)

Программное обеспечение

  • IDE Arduino
  • 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
  • Вставьте модуль внутрь батарейного отсека так, чтобы провода находились на той же стороне, что и подтягивающие резисторы контактных площадок.
  • Припаяйте все цифровые входы к контактам пэда ударных, как показано на последнем рисунке.
  • Припаяйте шину micro-USB (VBUS, D +, D-, GND) к устройству FTDI, убедитесь, что нет ошибок при отслеживании этих проводов.
  • Прикрепите модуль Arduino-FTDI горячим клеем к батарейному отсеку.
  • Соберите устройство с помощью соответствующих винтов.

Сделали, устройство собрано. Перейдем к коду…

Шаг 4: Программирование A: Arduino

Программирование A: Arduino
Программирование A: Arduino

Опишем наш скетч шаг за шагом:

Прежде всего, необходимо включить две необходимые библиотеки для правильной работы. EEPROM уже предустановлен в Arduino IDE, но модуль защиты от бас-барабана должен быть установлен отдельно

#include #include

Эти переключатели используются в основном в отладочных последовательностях. Если вы хотите опробовать подключение терминалов Arduino к пэдам ударных и определить все цифровые входы, эти переключатели должны быть определены

/ * Переключатели разработчика: раскомментируйте требуемый режим для отладки или инициализации * /// # define LOAD_DEFAULT_VALUES // Загружает значения констант вместо EEPROM // # define PRINT_PADS_PIN_NUMBERS // Выводит номер контакта, который подключен к контактной площадке, которая была поражена через последовательный порт

Поля констант представляют все значения по умолчанию, включая нумерацию пэдов ударных. Чтобы запустить устройство в первый раз, необходимо знать точное подключение педалей хай-хэта и бочки

/ * Перечисление типов барабанов * /

enum 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], drumVelocities [10], drumPins [10]; // MIDI-переменные

uint8_t uartBuffer [64]; // Буфер UART для сбора и хранения MIDI-данных Debouncer kick (DRUM_PINS [KICK], KICK_DB_DURATION); // Объект Debouncer для бас-барабана volatile bool previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Предыдущее логическое состояние барабанного пэда volatile bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Текущее логическое состояние пэда ударных

Функции EEPROM

/ * Сохраняем настройки в 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 ); for (uint8_t i = 0; i <10; i ++) EEPROM.write (VELOCITIES_ADDR + i, drumVelocities ); }

/ * Загрузить настройки из EEPROM * /

void loadEEPROM () {для (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, активируются одновременно

void enterProgrammingMode () {

bool confirmBreak = false; uint8_t lineCnt = 0; uint8_t charCnt = 0; char readChar = 0; в то время как (! confirmBreak) {если (Serial.available ()) {uartBuffer [charCnt] = Serial.read (); если (charCnt> = 29) confirmBreak = true; еще charCnt ++; }} Serial.println ("ОК"); storeEEPROM (); }

void initValues () {

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

Обработчики MIDI-связи с задержкой времени удержания ноты 1 мс

/ * Воспроизведение MIDI-ноты * /

void midiOut (перечисление DRUM_POSITION drumIn) {

if (drumIn == HIHAT) {// Если была нажата HI-HAT, необходимо проверить, нажата ли педаль if (! 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-данных ударных noteOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); задержка (1); noteOn (0x90, drumNotes [drumIn], 0); }}

void noteOn (int cmd, int pitch, int velocity) {Serial.write (cmd); Serial.write (шаг); Serial.write (скорость); }

Функции setup () и loop () с бесконечным циклом работы устройства:

void setup () {

Serial.begin (115200);

для (uint8_t я = 0; я <10; я ++) {pinMode (я + 2, ВХОД); } #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 (я + '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 ); если (! currentState && previousState ) midiOut (i); // Сравнение состояний и определение спадающего фронта previousState = currentState ; } kick.update (); // Бас-барабан использует собственный алгоритм устранения дребезга if (kick.edge ()) if (kick.falling ()) midiOut (KICK); }

Шаг 5: Программирование B: Python и пользовательский интерфейс

Программирование B: Python и пользовательский интерфейс
Программирование B: Python и пользовательский интерфейс
Программирование B: Python и пользовательский интерфейс
Программирование B: Python и пользовательский интерфейс
Программирование B: Python и пользовательский интерфейс
Программирование B: Python и пользовательский интерфейс

Пользовательский интерфейс Python немного сложен для понимания на первый взгляд, поэтому мы попытаемся объяснить его основы, как использовать, какую функцию выполняет каждая кнопка и как правильно программировать устройство Arduino.

Пользовательский интерфейс - Приложение

Пользовательский интерфейс - это графическое представление для нашего программиста ударных установок, что делает его действительно простым в использовании и удобным для программирования устройства Arduino в любое время. Пользовательский интерфейс состоит из нескольких графических модулей, привязанных к предполагаемой работе. давайте рассмотрим их один за другим:

  1. Изображение набора ударных: пользовательский интерфейс Python использует координаты изображения X-Y, чтобы определить, какой тип барабана был выбран. Если была выбрана допустимая область ударных, отображается вторичное сообщение ввода-вывода с полями ноты, скорости и терминала Arduino для выделенного барабанного пэда. После того, как эти параметры проверены пользователем и утверждены, эти значения могут быть переданы непосредственно на устройство Arduino.
  2. Образ внешнего контроллера: чтобы иметь возможность использовать набор ударных MIDI в среде создания VST / музыки, необходимо запустить интерпретатор Serial-To-MIDI. Я использовал Hairless, который доступен бесплатно и может быть запущен прямо из нашего пользовательского интерфейса, просто нажав на его изображение.
  3. Список COM-портов: для связи с Arduino необходимо указать подключенный к нему COM-порт. Список обновляется при нажатии кнопки «Обновить».
  4. Загрузка / сохранение конфигурации: в коде определены значения MIDI по умолчанию, которые могут быть изменены пользователем посредством взаимодействия с пользовательским интерфейсом. Конфигурация определяется в файле config.txt в определенном формате, который может быть сохранен или загружен пользователем.
  5. Кнопка программирования устройства: чтобы сохранить все измененные значения MIDI в EEPROM Arduino, после этого необходимо нажать две ножные педали (бас-барабан и педаль хай-хэта) и дождаться завершения передачи данных. Если возникли какие-либо проблемы со связью, появится соответствующее всплывающее окно. Если передача прошла успешно, пользовательский интерфейс покажет свое успешное сообщение.
  6. Кнопка выхода: просто выйдите из приложения с разрешения пользователя.

Основные моменты кода Python

В коде много чего происходит, поэтому мы будем расширять написанные функции, а не весь код.

Прежде всего, чтобы использовать UI, необходимо скачать несколько модулей, чтобы код заработал:

import osimport threading import tkinter as tk from tkinter import messagebox from tkinter import * from PIL import ImageTk, Image import numpy as np import serial import glob

Некоторые модули включены в пакет Python по умолчанию. Через инструмент PIP необходимо установить несколько модулей:

pip install Pillow

pip install numpy pip install ScreenInfo

Настоятельно рекомендуется запускать приложение через PyCharm. В будущих выпусках я планирую экспортировать исполняемый файл проекта.

Краткое объяснение кода

Код будет намного легче понять, если мы посмотрим на его строки с точки зрения функций и классов:

1. Основная функция - здесь начинается код

если _name_ == '_main_': drumkit_gui ()

2. Константы набора ударных, координаты и MIDI-информация по умолчанию.

class Drums: DRUM_TYPES = [«Kick», «Hihat», «Snare», «Crash 1», «Crash 2», «Tom High», «Tom Mid», «Tom Low», «Ride», «Hihat Pedal» "," Контроллер "]

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. Функции пользовательского интерфейса - обработка пользовательского интерфейса и графических объектов.

def set_active (пользовательский интерфейс)

def secondary_ui (тип_ барабана)

класс SelectionUi (tk. Frame)

класс Application (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. Запуск внешнего приложения hairless.exe из кода с использованием возможностей Python Threading.

класс ExternalExecutableThread (threading. Thread)

def run_hairless_executable ()

Для запуска кода есть список файлов, которые необходимо прикрепить к папке проекта:

  • config.txt: файл настроек
  • hairless.exe: MIDI-конвертер без волос.
  • drumkit.png: изображение, которое определяет все интерактивные барабанные пэды в нашем пользовательском интерфейсе (необходимо загрузить из набора изображений этого шага)
  • drumgui.py: Код проекта

Это все, что нам нужно подчеркнуть, чтобы это работало. Очень важно добавить в проект файлы: образ ударной установки, исполняемый файл hairless.exe и файл настроек config.txt.

И.. Вот и закончили!:)

Надеюсь, вы найдете это руководство полезным.

Спасибо за прочтение!:)

Рекомендуемые: