Автор Тема: Простой миди-контроллер для Soft-комбайнов компьютерных (GuitarRig, Overloud)  (Прочитано 2529 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tander Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 3504
  • Репутация: +386/-0
    • Efremoff
В общем - иногда дома играю на Overloud TH-U. Неплохой звук, большие возможности. Только утомляет ручками все крутить-переключать. ) И тут подумалось - а не собрать ли мне простой миди-девайс на ардуинке, чтобы часть задач перенести в напольное устройство. Глядишь - может и на живых выступлениях пригодиться. )

Решил сильно не заморачиваться - 8 кнопок, 6 аналоговых потенциометров (из одного или двух попробую сделать педаль экспресии какую-то). Кнопок можно больше, потенциометров тоже можно больше, было бы желание.

Схемка подключения к ардуине Нано:
2344088-0
Как видно - есть и цифровые ноги доступные еще и аналоговые.

И вдруг оказалось что нано не выпускает миди-команды через усб. Ну вот жеж ты гадость, а она жеж так хороша по размерам - я бы все запихнул в алюминиевый профиль от светодиодных лент широких... а тут облом... Начал искать решение и оказалось что есть софт, который работает как мост между последовательным портом и виртуальным миди портом... Например Hairless Midi to serial (https://projectgus.github.io/hairless-midiserial/) и какая нибудь софтина для эмуляции миди-порта. (для Windows хорошо себя показал loopMIDI - https://www.tobias-erichsen.de/software/loopmidi.html ), а для мака я настроил средствами мак ос.

Ок. Побороли.

Скетч достаточно простой, понадобиться библиотека MIDI (https://github.com/FortySevenEffects/arduino_midi_library/):

#include <MIDI.h>

// Simple midi foot controller.

MIDI_CREATE_DEFAULT_INSTANCE();

 
int buttonArray[8] = {6,7,8,9,10,11,12,13};
int chkArray[8] = {0,0,0,0,0,0,0,0};
int potArray[6] = {A0, A1, A2, A3, A4, A5};
int valArray[6] = {0,0,0,0,0,0};
int lastValArray[6] = {0,0,0,0,0,0};


void setup()
{
    MIDI.begin();
    Serial.begin(115200);
}

void loop()
{   
   for (int i=0; i<9; i++){
   
    if (digitalRead(buttonArray[i])==HIGH and chkArray[i] == 0)                    // If we have received a message
    {
       MIDI.sendNoteOn(1+i, 127, 1);    // Send a Note (pitch 10+counter, velo 127 on channel 1)
       chkArray[i] = 1;

    }
    else if (digitalRead(buttonArray[i]) == LOW and chkArray[i] == 1)
    {
      MIDI.sendNoteOff(1+i, 0, 1);     // Stop the note
      chkArray[i] = 0;
    }
   }
   
   for (int i=0; i<6; i++){
    valArray[i] = analogRead(potArray[i])/8;
    if (valArray[i] != lastValArray[i]){
      MIDI.sendControlChange(10+i ,valArray[i], 1);
    }
    lastValArray[i] = valArray[i];
   }
}


Дальше остается только обычная работа по сверлению-паянию кнопок и потенциометров к ногам ардуины, в качестве копруса - скорее всего будет профиль для светодиодных лент (есть как раз кусок подходящего размера 40х30мм, от которого нужно будет отрезать сантиметров сорок). Для закрывания - комплетные заглушки, а вместо "стекла" - вставляется полоса подходящего алюминия, либо вообще забить (и тогда монтировать открытой частью вниз).
Эта часть пока в процессе, т.к. перед НГ нужно еще кучу всего успеть сделать, а контроллер пока не сильно нужен. )

А на видео можно посмотреть как реагирует например педаль экспрессии на потенциометр, и включение-выключение кнопкой эффекта в цепи.


Возник вопрос - а можно ли как-то из софта получить обратную связь? т.к. не смотря на экран компьютера - очень сложно понять что в данный момент включается-выключается, и что регулирется потенциометрами, т.к. в каждом банке могут быть свои назначения на регуляторы-кнопки, и всего не упомнишь.... Дисплей по i2c подключить не проблема, а вот как от софтины (той же TH-U) получить какую-то инфу по миди??
« Последнее редактирование: Декабря 20, 2019, 11:10:41 от Tander »

Оффлайн Tander Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 3504
  • Репутация: +386/-0
    • Efremoff
Собрал небольшой прототип - 8 кнопок, 8 потенциометров. Педаль экспрессии реализовать достойно не смог, просто поставил один потенциометр отдельно от всех, и надел какую-то большую крутилку, и в прицнипе ногой поворачивать можно. Уменьшил диапазон работы этой крутилки (чтобы от 0 до 127 было в первых 20-30градусах поворта потенциометра).

Потестил, поиграл. Даже отыграл одно мероприятие, на звуке "с компа". В качестве софта использую Overloud TH-U, который очень хорош по звуку. На данный момент единственный минус его - отсутсвие "обратной связи" с контроллером. И это проблема именно софта - он не высылает по миди никаких статусов или состояний...

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

В общем - как идея действительного простого и очень бюджетного контроллера к программному процессору - идея работает достаточно неплохо - там, на диване поиграть, позаниматся и тп.

Кто-то может знает хорошо звучащие StandAlnone приложения гитарные/басовые, которые так же высылают состояние текущего пресета (обратная связь) на контроллер?

Оффлайн Ringman

  • Ветеран форума
  • ******
  • Сообщений: 4574
  • Репутация: +503/-108
Stand-alone вряд ли будет посылать оповещать об изменении состояния крутилок и прочего с назначенными миди контролами. А вот плагин-хост какой нибудь может быть, если через него было назначено.

Имхо эти все крутилки ненужные, при наличии экрана и софтового проца)
Футсвичи да.

Оффлайн Tander Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 3504
  • Репутация: +386/-0
    • Efremoff
Да вот не всегда прям я вот вижу что на экране (у меня макбук, 13), тем более в том же оверлоуде - все эффекты ставятся в одну линию - и чтобы поправить что-то в начале цепочки и потом например в конце цепочки - то нужно мышкой прокручивать и тп - что при живой игре - очень неудобно. А так назначаешь критичные крутилки на потенциометры (или энкодеры) - и можно даже ногой крутануть при умении. ))

Надо будет BiasFX посмотреть. Звук во второй версии - вроде ощутимо получше, щас хорошие скидки еще пару дней - если есть "обратная связь" с контроллером - то может быть достойной альтернативой оверлоуду. )

Оффлайн Ringman

  • Ветеран форума
  • ******
  • Сообщений: 4574
  • Репутация: +503/-108
И педальку експрессии лучше дешевую покупную, гнездо вставить в коробку.
Я вот такую байду сделал(спасибо akl за подсказки), теперь думаю педальку прикрутить
https://guitarplayer.ru/index.php?topic=417972.0

Оффлайн Tander Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 3504
  • Репутация: +386/-0
    • Efremoff
Насчёт покупной экспрессии - это я уже понял. Простын пластиковые педали начинаются от 20 баксов, так что - надо будет просто купить и не морочить голову.

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 7726
  • Репутация: +1655/-60
  • не шарю ваще
Tander, а можно ссылку что за пластиковые педали?
я встречал только корпуса для вах типа такого http://diy-tubes.ru/index.php?route=product/product&path=25_78&product_id=354
и если эти педали пластиковые - быстро ли разваливаются? :hmmm:

Оффлайн Dying Fetus

  • Moderator
  • *****
  • Сообщений: 9964
  • Репутация: +1227/-24
  • DIYng Fetus
    • http://cathar.ru
Behringer FCV100 посмотри
вдруг бу есть где

Оффлайн Ringman

  • Ветеран форума
  • ******
  • Сообщений: 4574
  • Репутация: +503/-108
Педалек таких муллион https://www.thomann.de/intl/volume_and_expression_pedals.html?oa=pra

Даже на веревках  :hitrez:

Оффлайн Tander Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 3504
  • Репутация: +386/-0
    • Efremoff
Dying Fetus, берингер огромный просто. )) его я смотрел в первую очередь.
Ringman, Да, видел уже.  На веревках это конечно интересное решение, видел пару раз - вроде не жаловались. ) Себе куплю наверное что-то совсем простое за немного денег.

В общем:
1. Заменить ардуину нано, на ардуину мега2560. Желательно в компактном исполнении (есть на Али платки размером 38х55мм совместимые). Тем самым мы получаем 54 входа/выхода цифровых и к этому еще 15 входов-выходов аналоговых. Да и памяти там поболее и вообще. ))
2. Заменить SendNote при нажатии на цифровую кнопку на SendControlChange - и сделать так, чтобы при первом нажатии - высылалось включение (СС, 127, 1) - где сс - это номер контрола, 127 - это его максимальная громкость, 1 - канал. А при втором нажатии - высылалось выключение (СС,0,1). И объясню почему.

Обратную связь от софта - не получить - не Bias FX, ни Overloud, ни GutarRig и прочие софтины - не высылают от себя ничего. Но - если мы заменяем SendNote на SendControlChange, и "обучаем" софт работать с этим как с переключателем типа Switch - то при отправки команды "включить" (СС,127,1) - она всегда(!) включит эффект - а если он уже был включен - оставит включенным. А при нажатии еще раз "выключить" (СС, 0, 1) - она всегда выключит эффект, а если он был выключен - оставит его выключенным. Т.е. не имея непосредственной обратной связи с софтом - можно привязать индикацию к условиям, где включается-выключается эффект.
Код цикла, который отвечает за кнопки тогда приобретает вид:

for (int i=1; i<8; i++) //Цикл для 7 кнопок
{
   
  if (digitalRead(buttonArray[i]) == HIGH and chkArray[i] == 0)                    // Первое нажатие кнопки на включение
      {
         MIDI.sendControlChange(1+i, 127, 1);                                       // Отправляем выбранный СС на первом канале (1+counter, velo 127 on channel 1)
         chkArray[i] = 1;                                                            //изменяем состояние счетчика для правильной работы.
         digitalWrite(40+i, HIGH);                                              //включаем нужный светодиод, подключенный к ноге (у меня это от 40ой и дальше)
      }
  else if (digitalRead(buttonArray[i]) == LOW and chkArray[i] == 1)          //Отпускаем кнопку
      {
        chkArray[i] = 2;                                                             //Изменяем состояние счетчика для следующего действия
      }
  else if(digitalRead(buttonArray[i]) == HIGH and chkArray[i] == 2)           //Повторное нажатие кнопки
      {
        MIDI.sendControlChange(1+i, 0, 1);                         //Отправляем выключение выбранного СС
        chkArray[i] = 3;                                             //Изменяем состояние счетчика для следующего действия
        digitalWrite(40+i, LOW);                                      //выключаем нужный светодиод, подключенный к ноге (у меня это от 40ой и дальше)
      }
  else if (digitalRead(buttonArray[i]) == LOW and chkArray[i] == 3)           //Отпускаем кнопку
      {
        chkArray[i] = 0;                                 //Обнуляем счетчик.
      }
}
« Последнее редактирование: Декабря 31, 2019, 12:31:53 от Tander »

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 7726
  • Репутация: +1655/-60
  • не шарю ваще
кстати насчет миди вопрос
я когда делал миди-контроллер на v-usb, посылал сообщение в виде такого массива
midiMsg[0]=0x0b;
midiMsg[1]=0xb0;
midiMsg[2]=i;                         //номер кнопки
midiMsg[3]=buttons[i]*127;  //значение
первый байт (0) - это типа команда ControlChange,
потом идет 0xb0 - это что вообще такое? по описанию это какой-то канал :hmmm:
потом номер кнопки, затем значение.

Собственно вопрос в том что такое 0xb0 и правильна ли такая запись вообще? в смысле что в каком байте. может номер кнопки надо пихать во второй байт типа midiMsg[1]=0xb0+i;
?
приблуда работала хорошо, в ней было 2 кнопки 2 потца и одна оптическая педаль https://guitarplayer.ru/index.php?topic=200980.msg11075636#msg11075636

... и добавил:

тащемта, такие педали делать легко. я б наштамповал еще - но загвоздка в шарнире. мне кажется ненадежный способ вот эта хрень с уголками и болтом. еще и заскрипеть может
« Последнее редактирование: Декабря 31, 2019, 14:45:05 от akl »

Оффлайн Ringman

  • Ветеран форума
  • ******
  • Сообщений: 4574
  • Репутация: +503/-108
Tander,
Apple Mainstage может состояние замэпленых миди-контролов обратно отсылать, если они редактируются на компе, или вызывается новый пресет с внешнего контроллера. Отличный вообще плагин-хост, там пресеты можно делать, на большой экран любые контролы из плагинов выносить, крутилки-свичи, что угодно. Только его и использую, там перфоманс-режим есть, на весь экран миди-борда.

Примерчик, как в ардуине получать из майнстажа обновления контролов:

Оффлайн Tander Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 3504
  • Репутация: +386/-0
    • Efremoff
Ну пошёл я изучать что такое Apple Mainstage, и с чем его едят и как им пользоваться. :)

... и добавил:

akl, я не уверен, что второй байт это номер канала, скорее это как раз тип команды (ControlChange).
Вообще хорошо бы почитать документацию к миди или например - как работает библиотека, которую повсеместно используют с ардуиной. Там например даны все коды на типы команд
{
     InvalidType           = 0x00,   
     NoteOff               = 0x80,   
     NoteOn                = 0x90,   
     AfterTouchPoly        = 0xA0,   
     ControlChange         = 0xB0,   
     ProgramChange         = 0xC0,   
     AfterTouchChannel     = 0xD0,   
     PitchBend             = 0xE0,   
     SystemExclusive       = 0xF0,   
     TimeCodeQuarterFrame  = 0xF1,   
     SongPosition          = 0xF2,   
     SongSelect            = 0xF3,   
     TuneRequest           = 0xF6,   
     Clock                 = 0xF8,   
     Start                 = 0xFA,   
     Continue              = 0xFB,   
     Stop                  = 0xFC,   
     ActiveSensing         = 0xFE,   
     SystemReset           = 0xFF,   
 };
Третий байт - это похоже на номер канала (1), т.к. фиксированная величина. Четвертый байт - велосити?
« Последнее редактирование: Января 02, 2020, 12:06:55 от Tander »

Оффлайн AZG

  • Живу на форуме
  • *******
  • Сообщений: 77020
  • Репутация: +6399/-1365
  • Санкт-Петербург
    • AZG CUSTOM
Tander, А что, так тяжело прочитать таблицу МИДИ-команд? Есть куча статей с разжевыванием. СС двухбайтовая команда. Плюс номер канала...

Оффлайн Tander Автор темы

  • Ветеран форума
  • ******
  • Сообщений: 3504
  • Репутация: +386/-0
    • Efremoff
Tander, А что, так тяжело прочитать таблицу МИДИ-команд? Есть куча статей с разжевыванием. СС двухбайтовая команда. Плюс номер канала...
Так оно мне пока не нужно. :) Это akl спраштвал. Я готовую либу использую - вот еще голову ненужными данными забивать. ;)