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

Arduino для музыканта часть 3. Управляем квакушкой Cry Babay DCR-2SR по MIDI

Это уже третья статья, в первой я рассказывал о проекте с условным названием Arduino MIDI Box вцелом, во второй статье рассказал о том, как выполнять маршрутизацию и перекодировку MIDI сообщений, это позволит вам самим писать для себя различные MIDI Splitter/Merger на базе Arduino Mega.

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

Итак, у нас уже есть Arduino Mega, к которой подключен один MIDI IN и пара MIDI OUT. При получении  MIDI сообщений на вход, кроме того, что их можно на лету конвертировать или передавать напрямую на выход, можно так же повесить дополнительную логику обработки.

Arduino MIDI Box

Как видите, я убрал плату Cry Baby GCB-95 и вместо нее добавил реле и ворох проводов для подключения.

К тому моменту ко мне уже успела приехать Cry Baby DCR-2SR -вторая версия рэковой квакушки от Dunlop, которая так полюбилась шреддерам и остальным фанатам рэковых стоек размером с холодильник.

Для начала нужно было выяснить как же управлять этой квакушкой удаленно. На задней стороне есть 6 входов для педалей экспрессии, которые подключаются стандартным TRS кабелем. В педали, которая шла в комплекте, кроме потенциометра есть кнопка включения. Обнаружилось, что при замыкании контакта Sleeve и Ring на мгновение, квакушка включается или выключается.

При этом если эти же контакты подключить сразу на выходы потенциометра, произойдет их замыкание и рэковый модуль не будет реагировать. Для того, чтобы схема работала пришлось подключить S и R кабели к реле в выход №1, при замыкании, они будут соединены. Из этого же выхода каждый кабель в отдельности шел в свой выход реле(2 и 3), которые замыкаются только при включении квакушки.

Я установил небольшую задержку включения реле 2 и 3, после включения реле 1, это хорошо будет видно по коду.

В остальном,  рэковый модуль подключается к потекнциометру 100k аналогично описанию в первой части.

С одной стороны, все мои изыскания завершились достаточно быстро, с другой стороны, получается, что аудио сигнал из рэка уходит по кабелю в педаль экспрессии и оттуда обратно. То есть, ребята в Dunlop просто вынесли потенциометр в отдельную педаль. Вдумайтесь, они называют эту квакушку Custom Shop, при этом они даже не сделали удаленное управление потенциометром, чтобы аудио сигнал не гонял туда-сюда по всем вашим включенным квакушкам.

Эта история с реле позволяет не пропускать сигнал сразу через все 6 возможных педалей, но тем не менее, это не просто двойка, это кол, на фоне того, что выпускают Sonuus.

IMG_2422

После сбора всего в один рэк, сразу всплыло несколько недоработок/нововведений:

  1. Китайская копия Arduino Mega из коробки не умеет работать от 9V выхода, только при питании от USB. По интернетам гуляет инструкция как заставить ее работать и от адаптера, но я пока не разбирался.
  2. При отработке сразу нескольких serial выводов на одной Arduino и при налии оператора Delay, MIDI сигнал о положении экспрессии проходит не корректно, он начинает опаздывать. В результате Whammy и квакушка реагируют с отставанием. Железо реагирует правильно это только вопрос ПО, будет чем заняться долгими зимними вечерами
  3. Первое что пришло в голову после финальной сборки — сделать авто включение и выключение  Wah-Wah, как оказалось, это не так уж и сложно с Arduino.

Ниже вы найдете обновленный код проекта:

// Версия 2.4
// Получение данных на вход 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 value_1 = 0; //значение для определения положения экспрессии
int value_2 = 0; //значение для определения положения экспрессии
int wah_on = 0; // стартовое значение включения Wah-Wah

int k = 0; // счетчик старта
int t = 0; // счетчик стопа
int d = 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 для управление переключением реле №2
const int relPin31 = 38; // номер выхода реле №3#1
const int relPin32 = 39; // номер выхода реле №3#2
const int relPin33 = 40; // номер выхода реле №3#3
const int relPin34 = 41; // номер выхода реле №3#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(115200);
    Serial2.begin(115200);
    
    midi_IO.begin(MIDI_CHANNEL_OMNI);
    midi_THRU.begin(MIDI_CHANNEL_OMNI);
    
    midi_IO.setHandleControlChange(MyHandleControlChange);
    
    pinMode(relPin1, OUTPUT);
    pinMode(relPin2, OUTPUT);

    pinMode(relPin21, OUTPUT);
    pinMode(relPin22, OUTPUT);
    pinMode(relPin23, OUTPUT);
    pinMode(relPin24, OUTPUT);

    pinMode(relPin31, OUTPUT);
    pinMode(relPin32, OUTPUT);
    pinMode(relPin33, OUTPUT);
    pinMode(relPin34, OUTPUT);

    digitalWrite(relPin21, LOW); 
    digitalWrite(relPin22, LOW);
    digitalWrite(relPin23, HIGH);
    digitalWrite(relPin24, HIGH);

    digitalWrite(relPin31, HIGH); 
    digitalWrite(relPin32, HIGH);
    digitalWrite(relPin33, HIGH);
    digitalWrite(relPin34, 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();

 
//автоматическое включение/выключение Wah-Wah
//  if (value_1 != value_2) {
//    k = k + 1;
//    d = value_2 - value_1;
//      if (d == 1) {
//        t = t + 1;
//      };
//      if (d == -1) {
//        t = t + 1;
//      };
//     d = 0; 
//    };
   
//Serial.println(d); 
  
//  if (t > 700) {
//    t = 0;
//    k = 0;
//    wah_on = 1;
//  };

//  if (k == 1) {
//    wah_on = 1;
//  }


//   if (wah_on == 1) {
//      wah_on = 0;
//      digitalWrite(relPin24, LOW);
//      delay(10);
//      digitalWrite(relPin24, HIGH);
//  };
  
}

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;

    //Включение реле №1#4 при получении CC_TG_65 - Wah On/Off
    case 65 :
      if (value == 0){
          digitalWrite(relPin34, LOW);
          delay(10);
          digitalWrite(relPin34, HIGH);
          
          delay(10);
          digitalWrite(relPin32, HIGH);
          digitalWrite(relPin33, HIGH);
        } ;
      if (value == 127){
          digitalWrite(relPin34, LOW);
          delay(10);
          digitalWrite(relPin34, HIGH);
          
          delay(10);
          digitalWrite(relPin32, LOW);
          digitalWrite(relPin33, LOW);
          
        } ; 
      
      break;

    //Управление педалью экспрессии
    case 16 :
      //передача данных по управлению педалью экспрессии на Whammy
      midi_THRU.sendControlChange(11, value, 4);//передача данных по управлению педалью экспрессии на Whammy
      
      //конвертация MIDI данных экспрессии в данные для DigiPot
      wah_value = map(value, 0, 127, 0, 255);//конвертация MIDI данных экспрессии в данные для DigiPot
      value_2 = value_1;
      value_1 = value;

      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;
}
}

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

Опубликовано в DIY