Решил выйти наконец из затишья и написать несколько статей о том, чем сейчас занимаюсь в музыкальном плане, думаю, мой опыт будет интересен.
Где-то с 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 рековых квакушек
- http://www.stagecue.com/535q.html
- https://trabantland.wordpress.com/2011/12/21/remote-wah-putting-it-all-together/
В этих статьях был только один минус — управление было не по MIDI.
Это была третья часть проекта — добавить квакушку, которая будет управляться по MIDI при помощи Arduino. После пары недель доехала россыпь различных цифровых потенциометров, пара часов экспериментов и я услышал первые «кваки» в наушниках, которые управлялись с мидиконтроллера.
Итак, в процессе экспериментов появился вот такой «монстр»:
В одну коробку я воткнул Arduino Mega (https://ru.aliexpress.com/item/1Pcs-Keyestudio-MEGA-2560-R3-1Pcs-USB-cable-compatible-with-Arduino-MEGA-2560-R3-AVR/32247818078.html?spm=a2g0s.9042311.0.0.4Cgo2z), shield для mega (https://ru.aliexpress.com/item/Free-shipping-2015-New-Keyestudio-MEGA-Sensor-Shield-V1-for-Arduino-MEGA/2042269441.html?spm=a2g0s.9042311.0.0.4Cgo2z) для удобства подключения внешних девайсов, электромеханическое реле для управления свитчем, midi in (http://amperka.ru/product/troyka-midi-in), два midi out, цифровой потенциометр и плата Cry Baby.
Когда я собрал все в одну коробку, от цифровой части схем в квакушку шел очень сильный фон. Пришлось изолировать потенциометр через 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.
// Версия 2.3 // Получение данных на вход MIDI IN, передача во вход MIDI THRU Arduino Mega и //преобразование команд CC_TG в соответствующие команды PC для управления Digitech //Whammy по 4-му MIDI каналу //управление включением реле для переключения петель BJ LoopX2 //Управление значением DigiPot MCP42100 по MIDI(педалью экспрессии) //Управление включением/выключением Wah эффекта при помощи реле //LED BAR показывает уровень нажатия на педаль MIDI экспрессии //SETUP: pin RX1/TX1, RX2/TX2. MIDI IN и MIDI THRU подключены в Serial(RX0/TX0), MIDI OUT в Serial1(RX1/TX1) //SETUP: pin 5, 6 для управления входами реле №1 //SETUP: pin 7, 8 подключены к LED BAR, 8 - clock pin, 7 - data pin //SETUP: pin 10, 11, 13 - пины для управления DigiPot MCP42100 //SETUP: pin 42, 43, 44, 45 - пины для управления входами реле№2 #include <MIDI.h> // подключение библиотеки MIDI //Подключение библиотеки по управлению LED Bar #include <Adeept_Bar.h> //Подключение библиотеки для управления цифровым потенциометром MCP42100 #include <SPI.h> // 10-ый выход установлен как slave select, управляем po1(commandbyte =18) const int slaveSelectPin = 53; const int CommandByte = 18; const int CommandByte2 = 17; int wah_value = 0; int led_value = 0; int k = 0; // счетчик старта //определение номеров выхода Arduino для управление переключением реле №1 const int relPin1 = 5; // номер выхода реле #1 const int relPin2 = 6; // номер выхода реле #2 //определение номеров выхода Arduino для управление переключением реле №2 const int relPin21 = 42; // номер выхода реле №2#1 const int relPin22 = 43; // номер выхода реле №2#2 const int relPin23 = 44; // номер выхода реле №2#3 const int relPin24 = 45; // номер выхода реле №2#4 //Определение номеров выходя Arduino для управления LED BAR Adeept_Bar bar(8, 7); // Clock pin, Data pin //Create an instance of the library with name, serial port and settings MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, midi_IO); MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, midi_THRU); void setup() { Serial.begin(9600); 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.setHandleProgramChange(MyHandleProgramChange); midi_IO.setHandleControlChange(MyHandleControlChange); pinMode(relPin1, OUTPUT); pinMode(relPin2, OUTPUT); pinMode(relPin21, OUTPUT); pinMode(relPin22, OUTPUT); pinMode(relPin23, OUTPUT); pinMode(relPin24, OUTPUT); digitalWrite(relPin21, LOW); digitalWrite(relPin22, LOW); digitalWrite(relPin23, HIGH); digitalWrite(relPin24, HIGH); bar.begin(); //инициализация LED BAR // установка slaveSelectPin как выходного: pinMode (slaveSelectPin, OUTPUT); // стартуем SPI: SPI.begin(); } void loop() { // Main loop //Пересыл всех сообщений со входа MIDI IN в выход MIDI THRU на Serial2 midi_IO.read(); midi_IO.turnThruOn(); } void MyHandleControlChange(byte channel, byte number, byte value) { //Работа с MIDI++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //СС сообщение 60 - включение режима Октава вверх //СС сообщение 61 - включение режима Октава вниз //СС сообщение 62 - включение режима Октава вверх/Октава вниз //СС сообщение 63 - включение реле #1 //СС сообщение 64 - включение реле #2 //Serial.print("CC = "); //Serial.print(number); //Serial.print(" value = "); //Serial.print(value); //Serial.println(" "); 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; //Включение режима Октава вверх/Октава вниз на Whammy при получении CC_TG_61 case 61: if (value == 127){ midi_THRU.sendProgramChange(62,4); //Whammy ON }; if (value == 0) { midi_THRU.sendProgramChange(83,4); //Whammy OFF }; break; //Включение режима Октава вверх/Октава вниз на Whammy при получении CC_TG_62 case 62 : if (value == 127){ midi_THRU.sendProgramChange(49,4); //Whammy ON }; if (value == 0){ midi_THRU.sendProgramChange(70,4); //Whammy OFF } break; //Включение реле №1#1 при получении CC_TG_63 case 63 : if (value == 0){ digitalWrite(relPin22, LOW); }; if (value == 127){ digitalWrite(relPin22, HIGH); } ; break; //Включение реле №1#2 при получении CC_TG_64 case 64 : if (value == 0){ digitalWrite(relPin21, LOW); } ; if (value == 127){ digitalWrite(relPin21, HIGH); } ; break; //Управление педалью экспрессии case 16 : //передача данных по управлению педалью экспрессии на Whammy midi_THRU.sendControlChange(11, value, 4);//передача данных по управлению педалью экспрессии на Whammy //конвертация MIDI данных экспрессии в данные для DigiPot wah_value = map(value, 0, 127, 0, 255);//конвертация MIDI данных экспрессии в данные для DigiPot break; // все остальное - пустота default: break; } //передача параметров MIDI в качестве управления в DigiPot digitalPotWrite(CommandByte, wah_value); //передача параметров MIDI в качестве управления в DigiPot digitalPotWrite(CommandByte2, wah_value); led_value = ceil(float(wah_value)/25); led_control(led_value); //Работа с MIDI------------------------------------------------------------------------------------------------- } //передача данных SPI на DigiPot int digitalPotWrite(int CommandByte, int value) { // take the SS pin low to select the chip: digitalWrite(slaveSelectPin,LOW); // send in the address and value via SPI: SPI.transfer(CommandByte); SPI.transfer(value); // take the SS pin high to de-select the chip: digitalWrite(slaveSelectPin,HIGH); } // управление LED BAR void led_control(byte led_bar) { switch (led_bar) { case 0: // Turn off all LEDs bar.setBits(0x0); break; case 1: // Turn on LED 1 bar.setBits(0b000000000000001); break; case 2: // Turn on LED 12 bar.setBits(0b000000000000011); break; case 3: // Turn on LED 123 bar.setBits(0b000000000000111); break; case 4: // Turn on LED 1234 bar.setBits(0b000000000001111); break; case 5: // Turn on LED 12345 bar.setBits(0b000000000011111); break; case 6: // Turn on LED 123456 bar.setBits(0b000000000111111); break; case 7: // Turn on LED 1234567 bar.setBits(0b000000001111111); break; case 8: // Turn on LED 12345678 bar.setBits(0b000000011111111); break; case 9: // Turn on LED 123456789 bar.setBits(0b000000111111111); break; case 10: // Turn on all LEDs bar.setBits(0x3ff); break; } }
В следующей статье рассмотрим подробно только часть проекта — MIDI сплиттер на Arduino
Пишите в комментарии или группу вконтакте свои музыкальные проекты на Arduino и задавайте вопросы.
Для отправки комментария необходимо войти на сайт.