Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

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

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

Шнур 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 байта и др.)

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

  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.

Serial MIDI Converter

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

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

MIDI-OX

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

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

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

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

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

Теги:

Колтыков А.В. Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (10) | Я собрал (0) | Подписаться

0
Александр #
Пока замечены 2 ошибки:
1: кнопок 8, а каналов задействовано 7, последняя не работает.
2: после перевключения, не после рестарта, последовательный порт не работает.
Ответить
0
Attiny2313 #
Как-то странно она самопроизвольно ноты жмёт
Ответить
0
CULIBIN64 #
Нужно в строчке если клавиша удерживается поставить false, а там стоит true!
Ответить
0
Stinger #
Скажите пожалуйста, сколько одновремено клавиш можно нажать при такой схеме?
Ответить
0
KinoNikPlay #
По моему только 1, я бы использовал подключение матричного типа, по оси X и Y типо, в этом случае к 8 входам подключается 16 отдельно рабочих кнопок, а при 12 входам можно аж 36!
Забыл сказать, что кнопки будут иногда пересекаться при 2 и более нажатий
Ответить
0
Lamer111 #
Имея при себе горсть транзисторов, к 12 пинам можно подключить 64 кнопки/датчиков. Схема та же по сути как и в голо кубе
Ответить
0
Lamer111 #
Попытался повторить (частично) - неудача. Serial midi converter не запускается. Появляется на секунду в задачах, подвязывает java и вылетает без звука... Если кто сталкивался, подскажите пожалуйста решение! Совместимость проставлял, как и права администратора
Ответить
0
stas #
Для тех у кого проблемы с Serial midi converter. Я скачал https://processing.org/download/ и установил в ней библиотеку "The MidiBus" (Scetch/Import Library/Add Library). Затем открыл и запустил в этой IDE файл \arduino29_MIDI_Buttons\Serial_MIDI_Converter\source\Serial_MIDI_Converter_V2D.pde (Это в папке, которую выложил автор этой статьи). Но далее, все равно, не работали виртуальные MIDI порты (MidiYokeSetup.msi). Поэтому я нашел http://www.tobias-erichsen.de/software/loopmidi.html. Надо просто открыть loopMIDI и нажать плюсик внизу(Add port) и после этого Serial midi converter видить порты. Далее уже у кого как... У меня в FL Studio все пошло. Если есть вопросы: stanislav.sheptitskiгмайлком.
Я бы прикрепил скомпилированый Serial midi converter. Но что то он слишком много у меня весит(64 bit 191Mb!).
Ответить
0
Александр #
Несколько дней уже хочу решить вопрос с отправкой миди по такому принципу if ( и условие) но все тщетно. И эту схему собрал и запустил, но когда нажимаю кнопку и удерживаю нота "строчит" как с пулемёта.
Ответить
0
Александр #
Сам себе отвечаю и может еще кому пригодится. Чтобы работало правильно, нужно в ИФЕ где // Если клавиша удерживается все закомментировать.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Raspberry Pi 2
Raspberry Pi 2
Конструктор для сборки: предусилитель на лампе 6N3 200 Вт усилитель класса D на IRS2092
вверх