Гид по технологиям

Создание простого MIDI-контроллера на Arduino

8 min read Электроника Обновлено 09 Jan 2026
MIDI-контроллер на Arduino: шаг за шагом
MIDI-контроллер на Arduino: шаг за шагом

Самодельный MIDI-контроллер на Arduino, вид сверху

Введение

В этой статье вы узнаете, что такое MIDI, какие компоненты понадобятся для простого контроллера, как собрать схему, как тестировать кнопки и MIDI-сообщения, а также получите расширенные рекомендации: альтернативы, советы по отладке, критерии приёмки и чек-листы для разных ролей.

Что такое MIDI?

MIDI (Musical Instrument Digital Interface) — стандарт протокола для передачи управляющих сообщений между музыкальными устройствами. MIDI — не аудио; это набор команд (сообщений), которые говорят приёмнику, какие ноты, какие параметры или пресеты активировать.

Коротко:

  • Каналы: 16 (каждый кабель/порт может передавать данные на 16 независимых каналах).
  • Формат сообщений: Control Change (CC) и Program Change (PC) — самые распространённые для простых контроллеров.
  • Физическое подключение: классический 5‑pin DIN-кабель или USB-MIDI.

Определение термина: CC — сообщение с контроллером и значением 0–127; PC — сообщение с номером пресета.

Макет MIDI-контроллера на макетной плате с Arduino

Материалы и совместимость

  • Arduino Uno или совместимая плата (подойдёт любая с аппаратной UART или возможность USB-MIDI).
  • Гнездо 5‑pin DIN (female).
  • 2 × 220 Ом резистора.
  • 2 × 10 кОм резистора.
  • 2 × моментальные кнопки (momentary switches).
  • Провода (hook-up wires).
  • Макетная плата (breadboard) и/или корпус для финальной сборки.
  • MIDI-кабель (5‑pin DIN) и принимающее MIDI-устройство или USB-MIDI интерфейс.

Примечание: если вы хотите, чтобы Arduino распознавался компьютером как USB-MIDI-устройство (без внешнего интерфейса), рассмотрите платы с USB HID/USB Native (например, Arduino Leonardo, Micro, или платы на базе SAMD). Для классического 5‑pin DIN чаще используют аппаратный последовательный порт на скорости 31250 бод.

План сборки

Проект простой: две кнопки отправляют CC-сообщения на выбранный канал; информация уходит через MIDI-выход. На макетной плате всё наглядно и удобно для тестирования. После проверки можно перенести схему в жёсткий корпус и пропаять контакты.

Схема подключения

Схема подключения MIDI-контроллера на макетной плате

MIDI: контакты и распиновка

Нумерация контактов MIDI-разъёма

Схема подключения MIDI-гнезда (типичная):

  • Контакт 5 MIDI → TX (передача) Arduino (Serial) через 220 Ом резистор.
  • Контакт 4 MIDI → +5V через 220 Ом резистор.
  • Контакт 2 MIDI → земля (GND).

Важно: классический MIDI использует оптронный развяз (особенно на входе) для защиты устройства. В этом простом выходном варианте мы передаём данные через резисторы; для промышленных или публичных установок подумайте о гальванической развязке и защите.

Подключение кнопок

Кнопки работают как переключатели между +5V и землёй через «pull‑down» резистор:

  • Левая сторона кнопки → +5V.
  • Правая сторона кнопки → GND через 10 кОм резистор (pull‑down).
  • Правая сторона кнопки → цифровой пин Arduino (в примерах — 6 и 7).

Когда кнопка не нажата — пин видит LOW (через pull‑down). При нажатии пин получает +5V (HIGH). Программа отслеживает переходы через digitalRead(pin).

Тестирование MIDI

Подключение для теста:

  • Arduino (собранный по схеме) — в роли отправителя MIDI.
  • Компьютер/интерфейс — в роли приёмника.
  • Для наблюдения сообщений установите MIDI‑монитор на вашей ОС:
    • macOS: MIDI Monitor
    • Windows: MIDI-OX
    • Linux: KMidimon

Для работы используйте библиотеку Arduino MIDI (Forty Seven Effects). Установите её через Sketch > Include Library > MIDI.

Загрузите этот тестовый скетч (убедитесь, что выбрана правильная плата и порт в меню Tools > Board и Tools > Port):

#include   
#include   
#include   
#include   
#include   
  
MIDI_CREATE_INSTANCE(HardwareSerial,Serial, midiOut); // create a MIDI object called midiOut  
  
void setup() {  
  Serial.begin(31250); // setup serial for MIDI  
}  
  
void loop() {  
  midiOut.sendControlChange(56,127,1); // send a MIDI CC -- 56 = note, 127 = velocity, 1 = channel  
  delay(1000);  // wait 1 second  
  midiOut.sendProgramChange(12,1); // send a MIDI PC -- 12 = value, 1 = channel  
  delay(1000);  // wait 1 second  
}

Этот код отправляет CC, затем PC с интервалом 1 с. Если всё работает, вы увидите события в MIDI-мониторе.

Что проверить, если ничего не видно:

  • Правильность распайки MIDI‑гнезда (контакты на внешних краях разъёма).
  • Соответствие порта/интерфейса и направление кабеля (вход на интерфейсе — IN; к нему должен быть подключён выход с макетки).
  • Наличие питания у Arduino.
  • Драйвер USB-MIDI для вашего интерфейса (если используется USB‑интерфейс).
  • Качество макетной платы и проводов (низкобюджетные макетки иногда дают проблемы).

Тестирование кнопок

Для тестирования кнопок загрузите следующий скетч. MIDI не нужен для этой проверки.

const int buttonOne = 6; // assign button pin to variable  
const int buttonTwo = 7; // assign button pin to variable  
  
void setup() {  
  Serial.begin(9600); // setup serial for text  
  pinMode(buttonOne,INPUT); // setup button as input  
  pinMode(buttonTwo,INPUT); // setup button as input  
}  
  
void loop() {  
    
  if(digitalRead(buttonOne) == HIGH) { // check button state  
    delay(10); // software de-bounce  
    if(digitalRead(buttonOne) == HIGH) { // check button state again  
      Serial.println("Button One Works!"); // log result  
      delay(250);   
    }  
  }  
    
  if(digitalRead(buttonTwo) == HIGH) { // check button state  
    delay(10); // software de-bounce  
    if(digitalRead(buttonTwo) == HIGH) { // check button state again  
      Serial.println("Button Two Works!"); // log result  
      delay(250);  
    }  
  }  
    
}  

Откройте Serial Monitor (Верхний правый угол > Serial Monitor). При нажатии кнопки вы увидите соответствующие строки. Обратите внимание на софт‑дебаунс: задержка 10 мс между проверками уменьшает ложные срабатывания.

Создание контроллера: отправка реальных сообщений

Когда аппарат готов, можно отправлять рабочие сообщения по нажатию кнопок. Ниже пример кода, который отправляет разные CC при нажатии двух кнопок:

#include   
#include   
#include   
#include   
#include   
  
const int buttonOne = 6; // assign button pin to variable  
const int buttonTwo = 7; // assign button pin to variable  
  
MIDI_CREATE_INSTANCE(HardwareSerial,Serial, midiOut); // create a MIDI object called midiOut  
  
void setup() {  
  pinMode(buttonOne,INPUT); // setup button as input  
  pinMode(buttonTwo,INPUT); // setup button as input  
  Serial.begin(31250); // setup MIDI output  
}  
  
void loop() {  
  if(digitalRead(buttonOne) == HIGH) { // check button state  
    delay(10); // software de-bounce  
    if(digitalRead(buttonOne) == HIGH) { // check button state again  
      midiOut.sendControlChange(56,127,1); // send a MIDI CC -- 56 = note, 127 = velocity, 1 = channel  
      delay(250);   
    }  
  }  
  
  if(digitalRead(buttonTwo) == HIGH) { // check button state  
    delay(10); // software de-bounce  
    if(digitalRead(buttonTwo) == HIGH) { // check button state again  
      midiOut.sendControlChange(42,127,1); // send a MIDI CC -- 42 = note, 127 = velocity, 1 = channel  
      delay(250);  
    }  
  }  
}  

Заметка: при использовании аппаратного MIDI (Serial.begin(31250)) вы не сможете одновременно использовать Serial.println() для логов на USB‑порт. Для отладки используйте отдельный USB‑Serial (если плата поддерживает) или выводите диагностику по MIDI специальными сообщениями.

Если вы хотите отправлять Program Change вместо Control Change, замените:

midiOut.sendControlChange(42,127,1);

на

midiOut.sendProgramChange(value, channel);

Примеры использования и сценарии

  • Управление пресетами синтезатора через PC (Program Change).
  • Управление параметрами микшера или эффектов через CC (Control Change).
  • Педальные центры: комбинируйте больше кнопок/переключателей для сцен и цепочек эффектов.

Альтернативные подходы (когда этот метод не подходит)

  1. USB‑MIDI (без внешнего MIDI‑интерфейса). Если вы хотите, чтобы плата напрямую показывалась как MIDI‑устройство на компьютере, используйте Arduino с нативным USB (Leonardo, Micro, Due, или платы на SAMD). В этом случае не нужен 5‑pin DIN и внешняя скорость 31250.
  2. Использование оптрона/развязки. Для промышленного применения и защиты аппаратуры используйте оптронную развязку на входе/выходе MIDI.
  3. Программируемые контроллеры (например, Teensy). Teensy поддерживает USB-MIDI и имеет более мощные ресурсы для сложной логики.

Ментальные модели и эвристики

  • «INPUT = читаю состояние, OUTPUT = посылаю событие». Простая проверка: кнопка нажата → отправить разовое сообщение; кнопка удерживается → можно отправлять периодические сообщения или ничего не отправлять.
  • Дебаунс — всегда. Программный дебаунс 5–50 мс обычно достаточен.
  • Защита устройств — важнее, чем экономия: лучше добавить простую развязку, чем потерять дорогой синтезатор.

Фактбокс: ключевые числа

  • MIDI каналов: 16
  • CC/PC диапазон значений: 0–127
  • Стандартная скорость последовательного MIDI: 31250 бод
  • Типичный софт‑дебаунс: 5–50 мс

Руководство по отладке (Runbook)

  1. Нет сообщений в MIDI-мониторе:
    • Убедитесь, что выбраны правильные вход/выход в софте.
    • Проверьте распиновку DIN и направление кабеля.
    • Проверьте питание Arduino.
  2. Кнопки шлёпают (множество ложных срабатываний):
    • Увеличьте дебаунс до 20–50 мс.
    • Проверьте пайку/контакты на макетной плате.
  3. Один из каналов не реагирует:
    • Проверьте, что устройство принимает сообщения на том же MIDI‑канале.
  4. Проблемы с USB-MIDI:
    • Установите драйвер интерфейса.
    • Проверьте, что плата поддерживает USB-MIDI (если используете прямое USB-подключение).

Критерии приёмки

  • Аппарат: при нажатии кнопки отправляется ожидаемое MIDI-сообщение.
  • Надёжность: повторяемость > 95% для 100 последовательных нажатий (физическая проверка).
  • Совместимость: принимающее устройство принимает сообщения на заявленном канале и реагирует.
  • Защита: отсутствуют кратковременные замыкания или скачки напряжения при нажатии.

Чек-листы по ролям

  • Музыкант (скоростной live usage):
    • Проверить задержку и повторяемость команд.
    • Обеспечить фиксацию/блокировку корпуса для сцен.
    • Подготовить запасные кабели.
  • DIY-инженер (прототип):
    • Проверить макетную плату и удобство доступа к пинам.
    • Протестировать дебаунс и параметры сообщений.
    • Задокументировать распиновку.
  • Студийный техник (интеграция в студию):
    • Проверить соответствие каналов/CC/PC с настройками оборудования.
    • При необходимости добавить развязку и фильтрацию питания.

Тестовые сценарии и приёмка

  • Тест 1: одиночное нажатие кнопки — отправляется одно CC/PC сообщение.
  • Тест 2: удержание кнопки 5 секунд — не должно генерироваться более одного сообщения каждые 250 мс (если так задумано).
  • Тест 3: 100 быстрых нажатий подряд — не более 5% пропусков/ошибок.

Безопасность и риски

  • Риск: короткое замыкание при плохой пайке. Митигируйте: используйте предохранители и аккуратную сборку.
  • Риск: повреждение при подключении к дорогому оборудованию. Митиграция: оптронная развязка, проверка полярности.

Совместимость и миграция

  • Arduino Uno (ATmega328) — идеален для классического аппаратного MIDI через Serial с трансляцией на 31250 бод.
  • Платы с нативным USB (Leonardo, Micro, Teensy) — удобны для USB-MIDI без внешнего интерфейса.
  • Если переходите c DIN на USB, проверьте, какие MIDI‑каналы и сообщения требует ваше ПО.

Примеры расширения контроллера

  • Добавление энкодеров для управления параметрами в реальном времени.
  • Добавление светодиодных индикаторов для обратной связи о состоянии.
  • Использование мультиплексоров для большого количества контролов при ограниченном числе пинов.

Короткий глоссарий

  • CC: Control Change — сообщение для управления параметрами (0–127).
  • PC: Program Change — сообщение для смены пресета/патча.
  • DIN: стандартный 5‑pin MIDI‑разъём.
  • Debounce: подавление дребезга контактов.

Пример: короткое поведение контроллера в Ableton

Открывая Ableton, назначьте входной MIDI‑порт на канал, который использует ваш Arduino. Назначьте контролы: CC 56 → включение эффекта, CC 42 → переключение сцены. На экране MIDI Monitor вы увидите входящие события.

Важно

  • Для публичных мероприятий или работы с дорогой аппаратурой добавляйте развязку и защиту. Простая сборка на макетной плате отлично подходит для прототипа, но не всегда безопасна в продакшене.

Итог и рекомендации

  • Начните с макетной платы и стандартного кода из статьи.
  • Проведите тесты кнопок и MIDI‑монитор, чтобы убедиться в корректности сообщений.
  • Для стационарного использования перенесите схему в корпус и добавьте развязку при необходимости.

Благодарности и ресурсы

  • Библиотека Arduino MIDI (Forty Seven Effects)
  • Программы для мониторинга: MIDI Monitor, MIDI-OX, KMidimon

Мужской разъём MIDI-кабеля, вид контактов

Image Credit: Keith Gentry via Shutterstock.com

Короткая сводка

  • MIDI — это не звук, а команды.
  • Классический аппаратный MIDI использует 31250 бод и 5‑pin DIN.
  • Arduino Uno подходит для простых контроллеров; для USB‑MIDI используйте платы с нативным USB.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Градиенты в Canva: добавить и настроить
Дизайн

Градиенты в Canva: добавить и настроить

Ошибка Disabled accounts can't be contacted в Instagram
Социальные сети

Ошибка Disabled accounts can't be contacted в Instagram

Генерация случайных чисел в Google Sheets
Google Таблицы

Генерация случайных чисел в Google Sheets

Прокручиваемые скриншоты в Windows 11
Windows

Прокручиваемые скриншоты в Windows 11

Как установить корпусной вентилятор в ПК
Железо

Как установить корпусной вентилятор в ПК

Check In в iOS 17: настройка и безопасность
How-to

Check In в iOS 17: настройка и безопасность