В предыдущей статье я рассказал весь эволюционный путь как я пришел к мысли о построении 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 IN, передача во вход MIDI THRU Arduino Mega и //преобразование команд CC_TG в соответствующие команды PC для управления Digitech //Whammy по 4-му MIDI каналу //SETUP: pin RX1/TX1, RX2/TX2. MIDI IN и MIDI THRU подключены в Serial(RX1/TX1), MIDI OUT в Serial1(RX2/TX2) #include <MIDI.h> // подключение библиотеки MIDI //Здесь подставляем свои номера групп RX/TX подключения, в примере Serial1 для Midi IN/THRU // и Serial2 для MIDI OUT MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, midi_IO); MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, midi_THRU); void setup() { Serial1.begin(9600); Serial2.begin(9600); midi_IO.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library. midi_THRU.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library. midi_IO.setHandleControlChange(MyHandleControlChange); } void loop() { // Main loop //Пересыл всех сообщений со входа MIDI IN в выход MIDI THRU на Serial2 midi_IO.read(); midi_IO.turnThruOn(); } void MyHandleControlChange(byte channel, byte number, byte value) { //СС сообщение 60 - включение режима Октава вверх switch (number) { //Включение режима Октава вверх на Whammy при получении CC_TG_60 case 60: if (value == 127){ midi_THRU.sendProgramChange(43,4); //Whammy ON }; if (value == 0){ midi_THRU.sendProgramChange(64,4); //Whammy OFF }; break; //Управление педалью экспрессии case 16 : //передача данных по управлению педалью экспрессии на Whammy midi_THRU.sendControlChange(11, value, 4);//передача данных по управлению педалью экспрессии на Whammy default: break; }
Немного позже продолжу рассказывать подробности реализации своего проекта, а пока можете собрать свой сплиттер, если у вас остались вопросы, задавайте в комментарих здесь или в группе вконтакте.
Для отправки комментария необходимо войти на сайт.