USB MIDI контроллер на Arduino

Большинство статей в интернете по изготовлению MIDI клавиатур, контроллеров, пультов и т.п. основываются на использовании MIDI-разъемов, подключение которых к современному компьютеру может оказаться проблематично. На старых звуковых картах был Game-порт, к которому можно было подключить джойстик или MIDI-устройство:

Но, все новые материнские платы идут с встроенным звуковым контроллером, да и на звуковых картах зачастую отсутствует возможность подключения MIDI-устройств.
Остается либо покупать современную MIDI-клавиатуру, ди-джейский пульт и т.п. с USB выходом подключения к компьютеру, либо покупать/паять переходник, или же покупать специальную звуковую карту с возможностью подключения MIDI-устройств. Купить конечно не проблема, но мы же на этом сайте не для этого собрались, верно?

В данной статье я хочу показать, как можно на недорогом контроллере Arduino изготовить простейшую MIDI-клавиатуру с USB-подключением на 8 клавиш и колесом прокрутки.

Итак, я использовал:
контроллер Arduino UNO
8 шт. кнопок
8 резисторов 10 кОм
поворотный энкодер 25LB22-Q
макетная плата и перемычки

Схема подключения следующая:

Для подключения я использовал самый простейший вариант: 1 клавиша — 1 вход. Но при большем числе клавиш, различных контролеров и т.п. входов может не хватить, поэтому придётся задействовать считывание данных либо через аналоговые входы (путем добавления резисторов разного номинала), либо путем мультиплексирования. Но, если повесить несколько клавиш на аналоговый вход, то могут возникнуть проблемы со считыванием состояния, когда нажаты одновременно несколько клавиш. Потому, на мой взгляд мультиплексирование более приемлемый вариант.

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

Структуру MIDI-данных я не буду рассматривать, т.к. это описано в статье: передача MIDI данных от Arduino в компьютер

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

В данном проекте энкодер используется как колесо прокрутки для изменения модуляции (modulation wheel), однако его можно переназначить и для других целей (pitch bend и т.п.).

MIDI-данные от энкодера, с Arduino посылаются следующей строкой:
noteOn(0xB0, 0x01, encoder0Pos);
где 0xB0 — сообщение контроллера (control change)
0x01 — код контроллера (в нашем случае Modulation)
encoder0Pos — значение контроллера (в нашем случае 0-127).
Меняя коды контроллера вы можете использовать колесо прокрутки (энкодер) для самых разных контроллеров.

Отдельно стоит упомянуть Pitch Bend. Из спецификации MIDI следует, что необходимо послать сообщение из 3-х байт: 0xE0 (код Pitch Bend), MSB (старший байт), LSB (младший байт).

Два крайних байта хранят 14-битное значение pitch которое может лежать в районе 0…16383 (0x3FFF). Середина находится 0x2000, все что выше этого значения — происходить изменение высоты тона вверх, если ниже, то высота тона изменяется вниз.
В коде программы я закомментировал строчки если вы вдруг вместо modulation захотите использовать Pitch Bend (середина значения, разложение на 2 байта и др.)

Код определения нажатия клавиши включает в себя три состояния: клавиша нажата, клавиша удерживается и клавиша отпущена. Сделано это для того, чтобы можно было передавать значение длительности нажатия клавиши. Если это не нужно, то можно оставить лишь одно состояние (нажатие клавиши), программа в данном случае существенно упростится.
Для обработки состояния каждой из восьми клавиш, используется следующий код:

if (buttonState_C == HIGH && note_C_send_on == false) // Нажатие клавиши
{
noteOn(0x90, note_C, 0x7F);
note_C_send_on = true; // Команда Note On послана
note_C_send_off = false; // Команда Note Off не послана
}
else if (buttonState_C == HIGH && note_C_send_on == true) // Если клавиша удерживается
{
noteOn(0x00, note_C, 0x7F);
note_C_send_on = true;
note_C_send_off = false;
}
else if (buttonState_C == LOW && note_C_send_off == false) // Если клавишу отпустили
{
noteOn(0x90, note_C, 0x00);
note_C_send_on = false;
note_C_send_off = true;
encoder0Pos = 0; // Возвращаем позицию колеса в ноль
}

…….
…….
…….
// Функция посылки MIDI-сообщения в последовательный порт
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
delay(20);
}

Обратите внимание, что если будет использоваться pitch bend, то encoder0Pos нужно будет возвращать не в ноль, а в 0x2000 (а лучше задать define в начале программы).

Итак, схема собрана, скетч в контроллер залит, запускаем Serial Monitor, меняем скорость передачи на 115200 и нажимая клавиши или крутя энкодер смотрим значения.
Если все нормально, то переходим к следующей части. Сразу скажу, что для меня она оказалось самой проблемной, и если бы я не нашел виртуального USB -> Midi конвертора, то этой статьи не было бы.

Программное обеспечение ПК (Windows)

Для того, чтобы принимать данные через USB виртуальный COM-порт от Arduino и передавать их в какую-либо программу MIDI-секвенсор, необходима специальная утилита: Serial MIDI Converter V2D (оф. сайт)

Программа мультиплатформенная, у меня заработала под Windows 7 x64, правда с некоторыми тормозами.

Запускаем ее, выбираем порт USB, скорость передачи (115200) и MIDI Input Port и MIDI Output Port.

Теперь, все те MIDI-данные, которые поступают на USB виртуальный СОМ-порт 12 перенаправляются на порт MIDI Yoke 6 (для создания виртуальных MIDI портов я воспользовался программой MIDI Yoke). Можно перенаправить их на Microsoft GS Wavetable Synth и др. порты.
Программа постоянно должна быть включенной. При нажатии клавиш или повороте ручки энкодера, внизу должен мигать индикатор Serial RX.

Для визуального отображения поступающих MIDI данных с порта мне очень пригодилась программа MIDI-OX (оф. сайт):

Обратите внимание, что в настройках MIDI Devices необходимо выставить порт MIDI Input.

Теперь, нажимая клавиши нот или вращая колесо, в Monitor-Output вы увидите MIDI-данные.

Т.о. при помощи программно-аппаратных средств мы получили возможность сделать на контроллере Arduino простейшую MIDI-клавиатуру с передачей данных в компьютер, для последующей их обработки, например в Cubase, в. т.ч. в реальном времени.
На основе данного проекта можно сделать DJ-пульт, полноценную MIDI-клавиатуру и т.п.

Ниже вы можете скачать скетч INO, Serial MIDI Converter V2D, MIDI-OX и MIDI Yoke

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.