Перейти к содержимому →

Arduino для музыканта часть 2. MIDI сплиттер своими руками

В предыдущей статье я рассказал весь эволюционный путь как я пришел к мысли о построении MIDI контроллера на Arduino для управления рэковыми и не только гитарными эффектами.

Здесь я попробую пошагово рассказать что именно вам для этого нужно.

Итак, разобьем проект на несколько этапов:

  1. Прием и отправка MIDI сообщений
  2. Управление электромеханическим реле
  3. Управление цифровым потенциометром/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

Для этого вам потребуется:

  1. Плата Arduino UNO или MEGA
  2. Breadboard
  3. Оптопара(6n138)
  4. Один диод 1n914
  5. Один 5-pin разъем для подключения MIDI кабеля
  6. 3 резистора 220 Ohm
  7. 1 резистор 4,7k Ohm

Собрать схему не сложно, однако, если вы затем как и я собираетесь использовать ее в «полевых» условиях, вам придется сразу же продумывать вариант с конечной сборкой на текстолите и продумывать варианты крепления.

В моем случае удачно нашлись уже собранные модули MIDI IN и MIDI Out в магазине, цена вполне приемлимая, если вы как и я не особо увлекались DIY.

midi_in

Если же платы травить можете, и с паяльником на ты, то собрать эти схемы самому будет немного дешевле(для 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).

arduino_mega

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 вывод.

IMG_2124

Все в сборе, вы можете подключить 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;
    
}

Немного позже продолжу рассказывать подробности реализации своего проекта, а пока можете собрать свой сплиттер, если у вас остались вопросы, задавайте в комментарих здесь или в группе вконтакте.

Опубликовано в Оборудование