Midi контроллеры своими руками

Midi контроллеры своими руками

MIDI контроллер на Atmega16U4

Автор: ProAlex, proalexx@yandex.ru
Опубликовано 21.07.2015
Создано при помощи КотоРед.

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

Поэтому я задумался над тем, как создать устройство, позволяющее восполнить данный недостаток. Поэксперементировав с разными микроконтроллерами, остановился на Atmega16U4 фирмы Atmel, как наиболее подходящий для решения данной задачи. Так же добавив в устройство возможность использовать его, как MIDI-USB переходник, для тех инструментов у которых отсутсвует USB-MIDI интерфейс.

В результате появился миди контроллер, который я назвал ATEMP MC1. Следующее видео показывает его возможности при разных вариантах включения.

Рассмотрим сначала теоретическую часть работы данного устройства.

1. Поток миди сообщений генерируется инструментом в случае разных действий со стороны музыканта. Это может быть, как нажатие клавиш инструмента, так и нажатия кнопки или поворота ручки контроллера. Миди сообщения в основном идут трех байтовой пачкой, но бывают и двух и одно и более трех. Например нажатие клавиши в сообщении выглядит, как 0x90 0x3C 0x40 (Note On/chan 0, Middle C, Velocity ), а изменения контроллера громкости, как 0xB0 0x07 0x40 (Control Change/chan0, Volume, Lеvel). Подробная информация о протоколе миди выложена на специальных сайтах, где с ней может подробно ознакомится любой желающий, например https://www.gweep.net/

2. Базовая функция устройства состоит в том, чтобы принимать со входа MIDI IN и передавать на выход MIDI OUT или USB порт все входящие миди сообщения, а для добавления в поток сообщения с собственных контроллеров, необходимо прерывать программу и считывая положение ручек контроллера вставлять эти сообщения в поток. При передачи в USB поток следует учитывать специфику данного протокола, так как здесь сообщения миди нужно дополнительно перепаковывать в пакеты USB. Например нажатие клавиши будет уже выглядеть, как 0x09 0x90 0x3C 0x40 ( Note-on message on virtual cable 0 (CN=0x0; CIN=0x9) Note On/chan 0, Middle C, Velocity)

3. Прерывание необходимо так же, для динамического сканирования кнопок ввода и вывода информации на четырех разрядный восьмисегментный индикатор.

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

Рассмотрим более подробно работу узлов данной схемы.

В Atmega16U4 для приема передачи данных миди сообщений мы используем порт USART1 его вход, выход RXD, TXD, и настраиваем его на частоту MIDI протокола, то есть Baud Rate: 31250 Гц, для считывания данных с потенциометров контроллеров используем входы ADC 1,2,4,5,6,7,8. Для динамического отображения на четырех разрядном восьмисегментном индикаторе, включенном по схеме с общим анодом и для подвески опроса кнопок используем для сегментов порт PB0..7, разрядов порт PD0..1 и PC6..7. Развязанные через диоды кнопки опрашиваются динамически на порт кнопок PD5 (в следующих статьях я на простом примере расскажу, как организовать простой драйвер для динамической индикации и опроса кнопок, в случае индикатора с общим анодом или катодом). Для прерывания необходимого для вывода информации на разряд индикатора, опроса нажатия кнопки, а так же запуска канала ADC я использую внутренний таймер TIMER0.

Для работы по аппаратному USB порту подключаемся к его D+ D-. Питание вся схема получает от USB порта. В MIDI протоколе для подключения и передачи приему данных используется схема — токовая петля через оптрон. Она позволяет гальванически развязать устройства, для предотвращения попадания в разные фазы. В данной схеме используется стандартное включение оптрона типа 4N33 наш аналог АОТ127А, в качестве буферного элемента используется микросхема 74LS00 наш аналог к555ла3, при достаточной крутизне спадов оптрона ее можно и не ставить, но тем не менее в миди адаптерах и прочих схемах для порта миди ее рекомендуют использовать.

Для корректной работы с USB портом я использовал стандартный Атмеловский стек series4-usb_software_library_template для данной серии микроконтроллеров U4 и в настройках usb_dexyinaors.c, h прописал конфигурацию класса миди порта, USB Endpoint dexyinaors для считывания и записи данных (описания взяты с сайта конфигураций usb.org: https://www.usb.org/developers/devclass_docs/midi10.pdf), он также подходит и для Atmega32U4, то есть в данной схеме они заменяемы, просто при компиляции надо указать под какой контроллер компилировать. В следующих статьях я поподробнее напишу про работу с этим удобным USB стеком, на стандартных примерах. Для программирования использую софтовый Атмеловский программатор Flip, через USB порт, чтобы программировать при включении нужно держать нажатой кнопку B4 подача низкого уровня на вход HWB запускает вшитый в чип загрузчик.

Читайте также:  Замок для петель своими руками

В качестве управления колесом питча и модуляции RV1,RV2 я использовал джойстик от пульта управления радиоуправляемыми моделями вертолета:), но можно поставить и колеса от старой миди клавиатуры или синтезатора.

Источник

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 следует, что необходимо послать сообщение из трех байт: 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

Источник

GuitarLine.Ru

Arduino для музыканта часть 1. Делаем DIY MIDI контроллер/конвертер

Опубликовано: 30.09.2017, автор: sMiles

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

Где-то с 2007-го года я активный читатель Habr’a, последние его трансформации я уже особо не отслеживаю, но до 2011-го года все статьи получал по RSS и просматривал хотя бы заголовки. Поэтому я хорошо помню момент, когда Arduino и Raspberry пошли в массы как недорогие микроконтроллеры. С тех пор у меня засела в голове мысль попробовать с ними свои силы, но так как и на музыку особо времени не остается, приходилось постоянно откладывать начало экспериментов.

Пару лет назад я окончательно пересел на Fractal Axe FX о чем я чуть позже напишу поподробнее.

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

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

Принял решение перейти на рэк и управление только с миди контроллера.

К тому моменту BJ Devices выпустили новую модель с педалью экспрессии и начался процесс проектирования и оформления для себя ТЗ на покупку или разработку река.

В AXE FX отлично эмулируются усилители, дилеи и тд, но там нет пары моих любимых перегрузов(Fulltone OCD и Xotic Soul Driven), я решил убрать их в рэк и контролировать их включение в цепь по миди. Для этого можно было купить миди свитчи от GLAB или Voodoo LAB, но я решил, что тут поможет Arduino.

Итак, задача начала оформляться, нужно было устройство, которое при получении MIDI сообщений будет управлять включением выключением по реле педалей в цепь.

Начались первые эксперименты.

Я купил контроллер Arduino Uno и реле для него. За один вечер удалось сделать свитч, который управляется сигналами из Arduino.

Вместе с контроллером BJ Devices у меня был куплен их свитч LoopX2, цель уже сейчас не припомню, но кто вообще будет объяснять GAS покупки. При проектировании расположения устройств в рековой полке, решил, что Arduino реле будет управлять свитчем от BJ, так как расположение будет гораздо удобнее.

Вторым этапом разработки были добавлены MIDI IN/OUT в схему и немного расширен объем работ.

В сети есть много мануалов по тому как собрать MIDI контроллер на Arduino, как минимум начните изучать эту тему с Notes And Volts.

Повозившись с россыпью комплектухи, нашелся наш магазин, который продавал уже собранные модули MIDI IN/OUT.

Купил, включил, скачал библиотеку MIDI.h и быстренько набросал программу управления свитчем LoopX2 по MIDI. Промежуточные программы я не буду приводить по тексту, в итоговом примере вы найдете все эти же программы как блоки с комментариями, поэтому двинемся дальше.

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

Читайте также:  Заточка тяпки своими руками

Проект начинал обрастать новыми функциями на этот раз я решил убрать в рэк Whammy, сама педаль на мой слух звучит намного музыкальней, чем ее эмуляция в Axe FX. Почитал мануал на педаль, управление по MIDI там достаточно простое, однако, для переключения режимов используются команды Program Change, а это значит, что посылая это сообщение с контроллера в одну MIDI цепь устройств, вместе с Whammy переключать пресеты начнет и Axe FX.

Пришлось добавить еще один MIDI OUT, в итоге в Arduino заходил MIDI сигнал от контроллера и дальше шло разветвление — MIDI OUT для Axe FX , в который не попадают сообщения для Whammy и MIDI THRU, в который идет весь поток миди данных.

Есть один нюанс, Arduino UNO имеет по одному serial порту, для того чтобы иметь один миди вход и два выхода, пришлось купить Arduino Mega, после 10 дней ожидания посылки с Ali удалось собрать макет.

Но вернемся к теме перегрузов и их включения в цепь, в Axe FX отлично эмулируется различные варианты квакушек, но раз уж перегрузы будут стоять ПЕРЕД процессором, то значит квакушка в такой цепи будет стоять ПОСЛЕ перегруза. В таком варианте подключения квакушка звучит слишком стерильно, весь смачный рок-н-ролльный саунд Wah получается только если педаль стоит перед перегрузом.

После пары дней размышлений, удалось достать плату Cry Baby GCB-95.

Час гугления и нашлась вот такая статья (https://www.instructables.com/id/Wahduino-WahWah-by-shakingraise-the-guitar/) про Arduino квакушку, которая управляется акселерометром.

Пришлось покупать цифровой потенциометр, который заменил стандартный пот 100k в квакушке.

Ну и еще пара ссылок вам на интересные проекты DIY рековых квакушек

В этих статьях был только один минус — управление было не по MIDI.

Это была третья часть проекта — добавить квакушку, которая будет управляться по MIDI при помощи Arduino. После пары недель доехала россыпь различных цифровых потенциометров, пара часов экспериментов и я услышал первые «кваки» в наушниках, которые управлялись с мидиконтроллера.

Итак, в процессе экспериментов появился вот такой «монстр»:

Когда я собрал все в одну коробку, от цифровой части схем в квакушку шел очень сильный фон. Пришлось изолировать потенциометр через LDR (http://www.instructables.com/id/How-to-Use-a-Light-Dependent-Resistor-LDR/).

Чтобы вам проще было повторить вот несколько схем. На плате Cry Baby есть 8pin слот для подключения батарейки, кнопки и потенциометра. На схеме ниже каждый выход подписан.

Подробнее про замену потенциометра квакушки на LDR(Light Depended Resistor) можно почитать вот в этой статье http://www.geofex.com/article_folders/wahpedl/wahped.htm

Немного поковырявшись со схемой у меня получился вот такой вариант:

Для удобства я все покрасил на картинке в соответствующие цвета и подписал. Сам по себе LDR это светодиод и фоторезистор. Яркостью светодиода в моей схеме управляет цифровой потенциометр, а фоторезистор одной ногой подключен к выходу «3-ground PA0», ко второму выходу через 100k резистор подключен выход «6 — fx return PB0» и выходу «5 — wiper PW0».

Если у вас в квакушке Dunlop начал хрустеть потенциометр, можно так же не меняя пот, добавить LDR и получить квак, в котором никогда больше не надо будет менять потенциометр.

После перехода на LDR фона стало меньше, но наводок было все равно очень много, я долго игрался с разными вариантами земли, изоляции и тд. Единственный способ как удалось избавиться от фона это убрать плату квакушки в отдельный корпус. При таком раскладе пазл в площадь река у меня уже не складывался, немного поразмыслив я решил купить себе рековую Cry Baby и опять же управлять ею из Arduino. Сам рек ко мне пока только едет, поэтому проект еще не завершен.

Пока схема подключения выглядит вот так:

Аудио сигнал подается на вход Whammy, откуда идет на MidiWah и далее в свитч, который управляется Arduino. Миди сигнал идет из контроллера в Arduino оттуда разделяется на управление Whammy и Axe FX.

Ниже листинг кода для Arduino. Напомню, что при помощи этого кода вы сможете получать и отправлять MIDI команды, управлять реле, управлять Digitech Whammy 5 как переключением режимов так и педалью экспрессии, управлять цифровым потенциометром, который подключен к Cry Baby.

Источник

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