GuitarLine.Ru
Arduino для музыканта часть 2. MIDI сплиттер своими руками
Опубликовано: 01.10.2017, автор: sMiles
В предыдущей статье я рассказал весь эволюционный путь как я пришел к мысли о построении MIDI контроллера на Arduino для управления рэковыми и не только гитарными эффектами.
Здесь я попробую пошагово рассказать что именно вам для этого нужно.
Итак, разобьем проект на несколько этапов:
- Прием и отправка MIDI сообщений
- Управление электромеханическим реле
- Управление цифровым потенциометром/LDR
Начнем с приема и передачи MIDI данных.
В примере мы соберем на Arduino Midi сплиттер, он же будет иметь возможность конвертировать часть данных. У сплиттера будет один Midi In, один Midi THRU и один Midi OUT.
Прежде чем вы погрузитесь в разработку на Arduino применительно к музыке, хорошенько изучите ресурс Notes And Volts, я уже писал о нем в прошлой заметке. На нем же вы найдете подробную видеоинструкцию как собрать Midi In для Arduino — http://www.notesandvolts.com/2015/02/midi-and-arduino-build-midi-input.html
Для этого вам потребуется:
- Плата Arduino UNO или MEGA
- Breadboard
- Оптопара(6n138)
- Один диод 1n914
- Один 5-pin разъем для подключения MIDI кабеля
- 3 резистора 220 Ohm
- 1 резистор 4,7k Ohm
Собрать схему не сложно, однако, если вы затем как и я собираетесь использовать ее в «полевых» условиях, вам придется сразу же продумывать вариант с конечной сборкой на текстолите и продумывать варианты крепления.
В моем случае удачно нашлись уже собранные модули MIDI IN и MIDI Out в магазине, цена вполне приемлимая, если вы как и я не особо увлекались DIY.
Если же платы травить можете, и с паяльником на ты, то собрать эти схемы самому будет немного дешевле(для MIDI In россыпь компонент с доставкой с Ali обошлась мне около 300 рублей, но их там еще на 4 входа хватит).
Итак, у нас есть один Midi In и два Midi OUT.
Подключение модулей выполняется патчами с тремя проводами, для Arduino это классические GVS(Ground, Voltage, Signal), не перепутайте их иначе спалите свои модули.
Для получение и отправки MIDI сигнала в Arduino необходимо использовать Serial порты, это выводы отмаркированные как TX0 и RX0 на Arduino UNO, именно по ним плата может взаимодействовать с внешними устройствами в режиме реального времени.
Для построения устройств с более чем одним входом или выходом MIDI, придется переходить на плату Arduino MEGA, у которой Serial портов 4 набора. Можно для этого использовать Arduino UNO и один из Serial портов сделать программным, но в таком случае есть риск, что часть данных, которые через него будут проходить будут потеряны. Я сразу перешел на Arduino Mega.
Для удобства подключения к плате Arduino Mega можно взять Shield, на котором входы, выходы сразу собраны в группы контактов по 3(GVS).
Midi In модуль подключается ко входу RX, Midi OUT ко входу TX. Помните, что при подключении к выводам TX0/RX0 каких-либо контактов загрузить на плату код из IDE будет невозможно. Это еще один плюс в сторону использования Arduino MEGA, с ней можно подключить наши модули к выводам TX1/RX1 и так далее.
В примере будет использоваться один MIDI in и два MIDI Out. Midi In модуль подключается к контакту RX1, первый Midi Out подключается к контакту TX1, второй Midi Out подключается к контакту TX2. Собирая пример, я включил In/Out в группу RX3/TX3, это не имеет никакого значения, если вы поправите программу на соответствующий Serial вывод.
Все в сборе, вы можете подключить Midi кабели к соответствующим входам. Пока в Arduino нет никакой программы работоспособность схемы можно подтвердить только тем, что при получении миди сообщений, в модуле входа будет загораться светодиод.
Что ж, давайте теперь приступим к коду.
Прежде чем активно писать код скачайте библиотеку MIDI.h для Arduino IDE (https://github.com/FortySevenEffects/arduino_midi_library), это существенно упрощает программирование по этому протоколу, иначе придется разбираться какими байтами и какие именно данные передаются по MIDI.
Обмен данными будет идти по двум группам Serial контактов RX1/TX1 и RX2/TX2, после подключения библиотеки MIDI.h мы это и объявляем в коде(см. соответствующий комментарий в программе).
В Main loop все что мы делаем, это включаем первую группу на чтение midi данных и в ней же включаем режим передачи THRU.
Напомню, что моя задача состояла в том, чтобы управлять с одного мидиконтроллера двумя приборами Axe FX и Whammy 5, при этом они для переключения пресетов используют тип сообщений Program Change. Это значит, что переключая одно устройство, второе будет переключаться автоматически. Идея состоит в том, что определенные сообщения типа Control Change, которые будут отправляться с контроллера, будут перекодированы в Program Change в Arduino и пойдут на выход Midi Out для управления Whammy.
В функции MyHandleControlChange выполняется вся логика программы по перекодировке MIDI сообщений и меппингу каналов.
При получении Control Change сообщения с номером 60 по любому из каналов(Omni), в Serial2 будет передано сообщение Program Change по 4-му каналу для включения или отключения режима октава вверх на Whammy5.
Мой контроллер данные по положению педали экспрессии передает по CC16, в Whammy для этого используется тип сообщений CC11, поэтому там же выполняется перекодировка и отправка положения педали экспрессии.
Источник
MIDI-контроллер своими руками (помогите оценить возможность реализации)
Один товарищ обратился с вопросом: «А можно ли сделать самодельный MIDI-контроллер?»
Мне идея показалась интересной, но, прежде чем потратить на нее кучу денег, хотел бы услышать ваши мнения по этому поводу. Спасибо!
Итак, задача:
MIDI-контроллер, грубо говоря, коробочка с крутилками/вертелками и кнопочками, подключаемая к ПК по USB, прикидывающаяся MIDI-устройством и отдаящая MIDI-инструкции при кручении/верчении ее элементов управления.
Вот пример заводского образца:
Тут на самом деле все просто, есть уже даже подобные решения и схемы, например, вот.
Ну и схема:
И вроде все просто и понятно, V-USB для реализации MIDI over USB, кнопочки и переменные резюки в стандартном включении.
В чем затык?
Проблема в том, что у нашей железки должно быть гораздо больше элементов управления, а именно:
- 16 энкодеров (именно энкодеров, переменные резисторы не подходят, по причине невозможност поменять их значения программно)
- 30 кнопок (+-)
- 1 фейдер (переменный резистор ползункового типа)
- Экран для вывода информации
- По 1 светодиоду минимум для каждого элемента управления, для индикации его работы (итого около 50)
Значит будем использовать мультиплексирование.
Я так понимаю, ни у одного МК прерываний и ног не хватит, чтобы напрямую через прерывания отловить все изменения на всех кнопках и энкодерах? Значит кнопки и энкодеры мы будем сканировать. Как я понимаю, на каждый энкодер 2 сигнала, на кнопку — 1, итого 62.
— Если использовать принцип матричной клавиатуры, то потребуется 8×8 = 16 GPIO?
— Теперь индикация, тоже динамическая. Тут 7×7 = 14 GPIO?
— 7 GPIO на экранчик (имею ввиду классический текстовый 20×4 символов, хотя, если совсем не будет хватать ног или чего-то, то можно экранчику прикрепить отдельный МК и управлять им по I2C или UART).
— 2(3) GPIO — USB
Итого получается 40+, аха за рамки обычной 40-ножки мы вышли, а значит придется использовать что-то более многоногое.
В общем, пока список вопросов примерно следующий:
- Справится ли обычная AVR-ка на 16 мегагерцах с поставленной задачей? (опрашивать все элементы управления, индицировать их работу, получать и передавать данные по USB в ПК)
- Кто какой МК посоветует для решения данной задачи? Причем не обязательно AVR, в принципе есть желание поковыряться с STM32, там как раз есть многоногие камни со скоростью выше 16 MHz и аппаратным USB. Тогда можно будет сделать еще больше индикации: не по 1 светодиоду на каждый энкодер, а по несколько, чтобы отображать позицию (как на заводском образце с картинки).
- Может по мультиплексированию кто что посоветует? Может есть смысл использовать сдвиговые регистры?
- Еще какие-то мысли? Любые идеи приветствуются!
Я хочу, чтобы все понимали: я не прошу вас решать мою задачу! Пожалуйста, не воспринимайте мой пост в этом ключе! Я лишь хочу выслушать мнения и идеи о реализуемости данного проекта и о том, на какой элементной базе было бы логичнее его реализовывать. Ибо опыта у меня в этой области кот наплакал, и конечно не хочется выкинуть кучу денег на то, что в итоге не заработает, или заработает, но коряво.
В любом случае всем спасибо за помощь! Если проект пойдет — обязательно поделюсь наработками!
Update 1:
In the year 2011 I evaluated current microcontroller solutions again and switched to LPC1769 since it offers more features for almost the same price.
Дескать функций у него больше, за ту же цену… (еще на страницах пробегало гораздо более странное утверждение, что STM паять сложнее, чем LPC «LPC doesn’t require SMD soldering and therefore is more DIY friendly!», я как понял потому, что они используют готовый модуль LPCEXPRESSO) Хм… Но я почему-то совершенно не хочу LPC…
Update 2:
Комментарии ( 119 )
Теперь индикация, тоже динамическая. Тут 7×7 = 14 GPIO?
Если использовать принцип матричной клавиатуры, то потребуется 8×8 = 16 GPIO?
Справится ли обычная AVR-ка на 16 мегагерцах с поставленной задачей? (опрашивать все элементы управления, индицировать их работу, получать и передавать данные по USB в ПК)
Ну сама по себе справится без проблем, а вот как там с V-USB и сколько она ресурсов отнимет, не знаю.
Много отнимает, очень много… Это меня и беспокоит… Причем при этом мы в итоге получаем самую медленную реализацию USB (которая на некоторых современных хостах вообще отказывается определяться).
Поэтому сам я пока склоняюсь к STM32 с аппаратным USB (да, AVR-ки с усб тоже есть, но их достать мне куда сложне, да и зачем?).
Про сдвиговые регистры можно поподробнее? То есть существуют ведь варианты, например, тупо ставим в цепочку подряд 7 сдвиговых регистров на 8 ног каждый, получаем 56 ног из 3 — это 1 вариант, другой вариант: 2 свдиговых регистра (по 8 ног) + 4 (например) ноги динамически, итого 7 ног тратим, 4*2*8 = 64 получаем.
Я как раз реализовывал тут недавно проект с бегущей строкой (есть тут статья), там для светодиодов использовался такой вариант: сдвиговые регистры на строку, их там было 12 (x8=96) и 8 строк динамически. Там скорости хватило, но там не было никаких USB при этом… Данные брал с SD карты. А вот USB, как мне кажется, как раз решает…
Про сдвиговые регистры можно поподробнее? То есть существуют ведь варианты, например, тупо ставим в цепочку подряд 7 сдвиговых регистров на 8 ног каждый, получаем 56 ног из 3 — это 1 вариант, другой вариант: 2 свдиговых регистра (по 8 ног) + 4 (например) ноги динамически, итого 7 ног тратим, 4*2*8 = 64 получаем.
Источник
Изготовление миди-сплиттера
Для нашей творческой лаборатории понадобилось изготовить особый миди сплиттер, позволяющий коммутировать более 20 устройств. Тип подключения к такому хабу — «звезда». Это исключило бы внесение в линию аппаратных искажений сигнала, которые вносят иногда собственные (MIDI-Thru) порты девайсов. В целях оперативности мы решили обеспечить сплиттер ручным управлением коммутацией входных и выходных сигналов. А для повышения износоустойчивости прибора, использовать разъемы в металлических корпусах.
Сформулировав, по вышуказанным условиям техническое задание, мы спроектировали и создали MIDI-Splitter/Thru MS 8/32. По сути, мы объединили в одном корпусе 8 миди сплиттеров 1*4. А для управления комбинациями соединений их друг с другом, установили переключатели на передней панели.
MIDI-Splitter/Thru MS 8/32, как мы полагаем, соответствует нуждам музыкантов и звукорежиссеров, желающих взаимодействовать со значительным числом миди-устройств. Ну, а в нашей студии, где единовременно работают более 20 MIDI-девайсов, сплиттер MS 8/32 стал, своего рода «нейро-системой», позволяющей, без искажений доставлять миди-события напрямую до 32-х устройств.
Устройство спроектировано и создано в полном соответствии с общепринятыми международными стандартами, описывающими аппаратный интерфейс MIDI. Среди подобных устройств, официально представленных мировыми производителями, аналогов нет.
Количество одновременно подключаемых master-устройств: 1-8
Количество одновременно подключаемых slave-устройств: 1-32
По умолчанию работают 8 входов и 8 соответствующих им групп выходов, по 4 выходных разьема в каждой группе.
Управление коммутацией осуществляется группой тумблеров-переключателей, расположенных на передней панели прибора.
Возможные варианты коммутаций:
количество* (вход*выход)
8*(1*4) означает 8 сплиттеров 1*4;
2*(1*16) означает 2 сплиттера 1*16 и т.д. :
8*(1*4)
2*(1*16)
1*(1*31)
4*(1*4) + 2*(1*8)
4*(1*4) + 1*(1*16)
6*(1*4) + 1*(1*8)
2*(1*4) + 2*(1*12)
5*(1*4) +1*(1*12)
1*(1*4) + 1*(1*12)+ 1*(1*16)
2*(1*4) + 1*(1*8)+ 1*(1*16)
3*(1*4) +1*(1*8)+ 1*(1*12)
Источник