Содержание
Большинство статей в интернете по изготовлению 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 следует, что необходимо послать сообщение из трех байт: 0xE0 (код Pitch Bend), MSB (старший байт), LSB (младший байт).
Два крайних байта хранят 14-битное значение pitch которое может лежать в пределах 0. 16383 (0x3FFF). Середина находится 0x2000, все что выше этого значения – происходить изменение высоты тона вверх, если ниже, то высота тона изменяется вниз.
В коде программы я закомментировал строчки если вы вдруг вместо modulation захотите использовать Pitch Bend (середина значения, разложение на 2 байта и др.)
Код определения нажатия клавиши включает в себя три состояния: клавиша нажата, клавиша удерживается и клавиша отпущена. Сделано это для того, чтобы можно было передавать значение длительности нажатия клавиши. Если это не нужно, то можно оставить только одно состояние (нажатие клавиши), программа в данном случае существенно упростится.
Для обработки состояния каждой из восьми клавиш, используется следующий код:
Обратите внимание, что если будет использоваться 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
Дело было вечером, делать было нечего.
В общем нашел я у дочки игрушку, она даже работала, но играть на ней было практически невозможно, дело в том что при нажатии на 2 клавиши, 3 -я уже не работала, то есть взять аккорд невозможно (хотя я аккорды и не знаю, зато паять умею) а еще совершенно случайно валялись ардуики всякие. Гугл сказал можно сделать из этого всего MIDI – клавиатуру.
Взял мегу, т.к. там точно хватит цифровых входов под каждую клавишу, клавиш получилось 37, можно было и на UNO сделать, но тогда нужен будет ставить мультиплексор, а у меня его не оказалось.
Берем Ашан паяльник. (не ну брат, у меня канэшна есть и хороший паяльник, просто он на работе, а такие у меня везде по одному валяются, на даче в машине и дома) кстати подставка сделана мной в 1989 году.
и курочим уже бывшую игрушку
пихаем туда ардуньку
далее по схеме делаем шилд, схема такая
крутилку, энкодер, не стал пока ставить, это в позже.
и начинаем паять кнопки к шилду, конечно все нужно было сделать на разъемах, но увы их толком не оказалось.
скетч. эээ, а как тут спойлер сделать? ладно не буду выкладывать, только кусками
тут задаются ноты
#define note_2F 0x29
#define note_2Fd 0x2A
#define note_2G 0x2B
#define note_2Gd 0x2C
#define note_2A 0x2D
#define note_2Ad 0x2E
#define note_2B 0x2F4
#define note_3C 0x30
#define note_3Cd 0x31
#define note_3D 0x32
потом еще куча кода
а так происходит обработка событий
if (buttonState_2F == HIGH && note_2F_send_on == false) // Нажатие клавиши
noteOn(0x90, note_2F, 0x7F);
note_2F_send_on = true; // Команда Note On послана
note_2F_send_off = false; // Команда Note Off не послана
else if (buttonState_2F == HIGH && note_2F_send_on == true) // Если клавиша удерживается
noteOn(0x00, note_2F, 0x7F);
else if (buttonState_2F == LOW && note_2F_send_off == false) // Если клавишу отпустили
noteOn(0x90, note_2F, 0x00);
if (buttonState_2Fd == HIGH && note_2Fd_send_on == false)
noteOn(0x90, note_2Fd, 0x7F);
else if (buttonState_2Fd == HIGH && note_2Fd_send_on == true)
noteOn(0x00, note_2Fd, 0x7F);
else if (buttonState_2Fd == LOW && note_2Fd_send_off == false)
noteOn(0x90, note_2Fd, 0x00);
а так передача всего в RS-232
void noteOn(int cmd, int pitch, int velocity) <
Далее ставим LoopMIDI и Serial MIDI Converter
Первый запускается и может висеть в трее, второй нужно запускать самостоятельно и держать открытым, или свернутым.
Ну а потом ставим что нибудь типа Pro Tools + Kontakt 5 вместе с сэмплами. Ну и вуаля, все работает
Все работает, но играть я не умею, поэтому можно разбирать :) шутка, отдам дочке может понравится, будет учиться.
З.Ы. да да, можно было и купить, стоит рублей 7, но так интересней..
Дубликаты не найдены
нахрен отдавать 7к, если можно сделать)
Основное отличие мидиклавы – чувствительность к силе нажатия, иначе можно и на обычной QWERTY играть, разницы пости нет, ноты по умолчанию уже привязаны в том же FL
Ну и удобное расположение клавиш, и их количество, и крутилочки/сосочки, куда же без них.
В общем нашел я у сына игрушку, она даже работала, но играть на ней было практически невозможно, дело в том что при нажатии на курок водяного пистолета 10 раз подряд с задержкой в 0.2813 секунды, происходило завоздушивание и нормально стрелять невозможно (хотя стрелять я не умею, зато я сантехник) а еще СОВЕРШЕННО СЛУЧАЙНО валялись ардуики всякие, FGPA, три пентиума 2, водосточная труба, 5 грязных носков, мешок навоза и синяя изолента. Гугл сказал можно сделать из этого пушку гауса и гидропонную установку.
timorphius
Так исторически сложилось, что в нашём доме нет синтезатора, но его роль выполняет связка MIDI клавиатуры на 5 октав и компьютера с музыкальным ПО.
Скорее всего, в первой версии данной статьи не будет автоский иллюстраций.
Так получилось, что устройство ввода с невыдернутым концом USB провода неоднократно здоровалось с землёй как раз проводом, и в итоге после долгих лет пользования он разбился вхлам. Попробовал припаяться напрямую USB кабелем, но схема отказалась запитываться. Думаю, всё, конец пришёл моему инструменту, ан нет: при подключении внешнего питания диоды светятся и даже откликаются органы управления. Решил попробовать передать на компьютер данные с DIN-5 порта.
Вот такую картинку мне предложил гугл.
Теперь нужно как-то распознать входящие данные и скормить их синтезатору.
Пятиштырьковый порт работает на скорости 31250 baud и если его запустить на ардуинке в режиме "поймал байт – отправил обратно", можно отслеживать в мониторе поток данных с клавиатуры – есть описание протокола; стандартный монтор такую скорость не поддерживает, но есть miniterm.py. Беда в том, что грош цена нашим цифрам пока они не звучат. Целую ночь провозился! У нас будет два порта с разной скоростью: программный 31250 на вход и аппаратный 115200 на выход, чтобы аппаратный вход был свободен для заливки скетча без на лету. А т.к. подключен ещё и дисплей, SoftwareSerial программный порт встанет на. 12 пин (на фото – жёлтый провод)
По большому счёту, нам не нужно здесь вникать в тонкости протокола: на начальном этапе просто ловим байт на одном порту и отправляем на другой. Потом допишу что-то вроде роутера, чтобы можно было, например, разделить клавиатуру пополам, сделать split или dual-voice, или ещё какие-то примочки. На компьютере данные увидели – они приходят в виде кракозябров. И Jack-ом не воспринимаются никак. Для этого есть прослойка в виде ttymidi – она прикидывается MIDI-IO устройством и позволяет пришедшее на порт, отправлять другой программе, например, в qSynth
– и замечательно все данные доходят. Пробовал что-то делать с MIDI-библиотеками для дуины, но нихрена не понял как с ними дела обстоят.
Скетч для дуины (угольные скобки при #include убраны):
[ Код: ]
Работает по скорости как так и было.Будет время – дополню ещё програмными примочками. Может, сделаю себе ещё и ударную установку на пьезоэлементах =)