Использование энкодера в миди контроллере

En Gi
Offline
Зарегистрирован: 12.01.2017

Постораюсь доходчиво обьяснить проблему. Есть такая чудная программа под названием Guitar Rig, для неё я сделал миди фут контроллер, 10 кнопок и 6 потенциометров. Юзая контроллер пришёл к выводу, что потенциометры не совсем удобны, точнее совсем не удобны, так как у них есть крайнее левое и крайнее правое положение. В выбранном пресете ГитарРига я выкручиваю потенциометры, которые привязаны к разным "крутилкам", и вроде бы все здорово, но, при переходе на следующий пресет (тем временем потенциометры остаются в том положении в которое я их выкрутил ранее) получается не соответствие физических ручек потенциометров с "крутилками" ГитарРига,  и выходит такая петрушка - предположим, потенциометр выкручен в крайнее правое положение, а "крутилка" в ГитарРиге в крайнее левое, как только я начинаю крутить потенциомтр влево, "крутилка" сразу занимает тоже положение что и потенциометр, и получается полная хрень. Я подумал, а что если использовать вместо потенциометров энкодеры. Но и тут меня ждало разочарование, так как энкодер, хоть и имет бесконечную прокрутку в обе стороны, ведет себя в ГитарРиге точно так же как и потенциометр. Фууух.. Надеюсь что кто то понял что я тут напечатал..

По логике повидение энкодера мне понятно, ему необходимо понить старое значение что бы его изменять в большую или меньшую сторону. Но это попахивает приговором. Есть у кого нибудь мысли, знания, опыт? Поделитесь пожалуйста.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

было бы интересно для сына сделать такой девайс в подарок, но я нихрена не понял, что надо )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Судя по Вашему описанию (если я правильно его понял), проблема в Guitar Rig. 

Хотя уверенности в этом нет - Вы ведь почему-то разместили вопрос на форуме Arduino вместо того, чтобы разместить на форуме Guitar Rig. Кстати, почему?

 

PS. IMHO для энкодера ничего запоминать не нужно, а передавать команды Bn 60 и Bn 61 (Data Increment и Data Decrement).

En Gi
Offline
Зарегистрирован: 12.01.2017

Я конечно могу вам помочь, но, как видите, я тоже небоженька и творю я пока не очень хорошо) Но чем смогу тем помогу

En Gi
Offline
Зарегистрирован: 12.01.2017

Да, скорее всего проблема в гитариге. Потому что решил что это програмная проблема ардуины, а потом подумав, пришёл к такому же выводу как и вы. Печально, но наверно тему можно закрывать.

Кстати. Я не очень понял про какие команды вы говорите, "Bn 60 и Bn 61 (Data Increment и Data Decrement)." для меня это новые слова)) Если не трудно разъясните пожалуйста. Если это имеет значение, то вот такой у меня код

#include <MIDI.h>
#include <Encoder.h>
MIDI_CREATE_DEFAULT_INSTANCE(); 

Encoder enc_1(2, 3);
int value; 

long enc_1_previous  = -999;
byte button_previous; 

void setup() {
  MIDI.begin(1);
 pinMode(23, INPUT_PULLUP); 
}



void loop() {
 value = enc_1.read();
 if(value > 127) {
  enc_1.write(127);   }
 else if(value < 0) {
  enc_1.write(0);  } 
 
 value = constrain(value, 0, 127);
 if (value != enc_1_previous) {
  enc_1_previous = value;
  MIDI.sendControlChange(1, value, 1);  }
 
 value = digitalRead(23); 
 if(value != button_previous) {
  button_previous = value;
  MIDI.sendControlChange(2, (1 - value) * 127, 1); 
  delay(3);  }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

En Gi пишет:

Кстати. Я не очень понял про какие команды вы говорите, "Bn 60 и Bn 61 (Data Increment и Data Decrement)." для меня это новые слова)) Если не трудно разъясните пожалуйста.

En Gi, чтобы я смог понять, как Вам дальше отвечать, ответьте сначала Вы на следующий вопрос:

Вы более или менее разбираетесь в протоколе MIDI или просто пытаетесь использовать библиотеку по наитию, не вдаваясь в то, как она работает?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

En Gi пишет:
так как энкодер, хоть и имет бесконечную прокрутку в обе стороны, ведет себя в ГитарРиге точно так же как и потенциометр

Почему? Потому что используется encoder.read(), выставляющее фактическое значение аки у резистора, хотя по факту это значение не нужно. Нужны события, когда крутят (назовём это ticks), вправо или влево. Насколько быстро крутят - накладывает определённые рамки, нужно успеть передать GuitarRig все и каждое срабатывание событыя, то есть если крутить межденно - события будут приходить редко и всё будет отрабатываться. Но если крутнуть резко, часть событий может выпасть и не будет учтена. Ну это я сразу предупреждаю о проблеме, присущей этому варианту решения.

Как это делать, я пока не знаю, но в идеале от библиотеки Encoder можно избавиться. Существует схема pighiXxx, преобразующая сигналы энкодеров в Step и Dir, собранная на 7414 и 7474. Мною эта схема была повторена как-то криво, и результаты были никакие, тем не менее меня не покидает ощущение что схема годная, и можно попробовать ещё.

Что нужно:

- обнаружить сигнал, например открутили на один щелкок влево, соответственно step=1, dir=0.

- выдать MIDI сообщение "убавить соотв. крутилку", выдать максимально быстро

- ждать следующих подвижек.

Вот оно:

4013 это КМОП-версия 7474, по-моему у них даже номера выводов одинаковые. Тем не менее, проверьте в справочном листке.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Voodoo Doll,

1. По поводу "крутить медленно": у меня уже при 0.1uF быстро крутить не получается, а у Вас целая микрофарада. Это уж недо крутить "очеь медленно".

2. Зачем вообще какая-то схема, если:

- вопрос элементарно решается программно.

- аппаратное решение не изьавляет от необходимости программной поддержки.

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

Так зачем еще и схема?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

En Gi, я посмотрел, если это стандартная ардуиновская MIDI-библиотека (github по ссылке с arduino.cc), то она поддерживает NRPN сообщения. Вопрос, поддержтивает ли их Guitar Rig. 

И, кстати, Вы очень вольно обращаетесь с номерами контроллеров. В MIDI за определенными контроллерами закреплены определенные номера и менять их недопустимо. В частности контроллер номер 1 отвечает за колесо модуляции, а номер 2 - за контроллер духовых инструментов. Причем оба - 14-разрядные контроллеры. Для переключателей on/off предусмотрены другие номера.

То есть вместо 

MIDI.sendControlChange(1, value, 1);

должно быть что-то вроде

MIDI.beginNrpn(number, channel) ;
MIDI.sendNrpnIncrement(amount, channel) ;
MIDI.endNrpn(channel);

или

MIDI.beginNrpn(number, channel) ;
MIDI.sendNrpnDecrement(amount, channel) ;
MIDI.endNrpn(channel);

причем нужно уточнить по спецификации MIDI: мне кажется, что amount должна быть равна 0.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

andriano пишет:
ни по использованию прерываний

Чойта? А то что минимум reliability экнодеров извлекается из обычных портов, чуть больше - с аппаратным прерыванием один из, максимум - оба? Итого, раз энкодер на D2/D3, чтобы безглючно работал, и... упс, прерывания кончились. Соответственно одна ардуина - один энкодер. Не?

Там какбе тайминги всякие, счёт на сотни наносекунд-единицы микросекунд, не? Триггеры Шмитта какбе делают эти сигналы ну хатябы медленнее. Ну так, чисто если подумать. Не? Ладно, спорить не собираюсь. Но вы посты почитайте, у автора их там не пять, ну явно. Может даже не десять. Энкодер это очень даже требовательная по времени вещь, не надо мне тут "прерывания не нужны". Относили энкодер на шесть метров от ардуины, знаем.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Voodoo Doll пишет:

andriano пишет:
ни по использованию прерываний

Чойта? А то что минимум reliability экнодеров извлекается из обычных портов, чуть больше - с аппаратным прерыванием один из, максимум - оба? Итого, раз энкодер на D2/D3, чтобы безглючно работал, и... упс, прерывания кончились. Соответственно одна ардуина - один энкодер. Не?

Не!

Прекрасно сажаются на pcint, а они в Uno на каждом пине. Т.е. штук 6 - даже если с кнопкой. В Mega 2560, правда, не на каждом, но обычно тоже выделить можно.

En Gi
Offline
Зарегистрирован: 12.01.2017

andriano пишет:

En Gi пишет:

Кстати. Я не очень понял про какие команды вы говорите, "Bn 60 и Bn 61 (Data Increment и Data Decrement)." для меня это новые слова)) Если не трудно разъясните пожалуйста.

En Gi, чтобы я смог понять, как Вам дальше отвечать, ответьте сначала Вы на следующий вопрос:

Вы более или менее разбираетесь в протоколе MIDI или просто пытаетесь использовать библиотеку по наитию, не вдаваясь в то, как она работает?

 

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

En Gi
Offline
Зарегистрирован: 12.01.2017

Что есть NRPN? и почему гитариг может его не поддержывать? В связи с чем недопустимо менять номера коннтроллеров?

Походу вы отправите меня на ХУхл))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

En Gi, т.е. энкодерами - это Вы ноты включаете?

Да и функция MIDI.sendControlChange мало похожа на MIDI.sendNoteOn.

В общем, хотя бы в гугле наберите и почитайте "MIDI NRPN сообщения" и попытайтесь сделать так, как я указал в посте №8.

En Gi
Offline
Зарегистрирован: 12.01.2017

Ну вот, как я и думал отправите на хухл. Я вас понял, попробую немедленно) Спасибо!

А, только я не понял вот что, вы говорите что amount должна быть равна 0. То есть где то в коде это надо указать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

En Gi пишет:

Ну вот, как я и думал отправите на хухл. Я вас понял, попробую немедленно) Спасибо!

Нет, ну чтобы работать с MIDI нужно хоть немного понимать, что делаешь. Я же не посылаю штудировать официальную спецификацию, а указал конкретно, что читать.

Цитата:

А, только я не понял вот что, вы говорите что amount должна быть равна 0. То есть где то в коде это надо указать?

Ну так и указать - вместо amount написать 0. Но только сначала уточнить, т.к. я навскидку не помню подробностей - нужен ли там 0 или другое число, для чего я и посоветовал почитать.

En Gi
Offline
Зарегистрирован: 12.01.2017

я почитал про RNPN и RPN, и так и не понял как это применять. Туплю. Видимо надо знать всю спецификацию миди. Попробовал читать с начала, понял что такая информация не потдаётся восприятию. Попробовал использовать ваш код, предварительно скачал библиотеку с ардуино.сс, так как не помню от куда была взята библиотека ранее, компилятор вот так ругнулся - "

 
sketch_may10a:28: error: 'class midi::MidiInterface<HardwareSerial>' has no member named 'beginNrpn'
 
   MIDI.beginNrpn(number, channel) ;
 
        ^
 
sketch_may10a:28: error: 'number' was not declared in this scope
 
   MIDI.beginNrpn(number, channel) ;
 
                  ^
 
sketch_may10a:28: error: 'channel' was not declared in this scope
 
   MIDI.beginNrpn(number, channel) ;
 
                          ^
 
sketch_may10a:29: error: 'class midi::MidiInterface<HardwareSerial>' has no member named 'sendNrpnIncrement'
 
 MIDI.sendNrpnIncrement(amount, channel) ;
 
      ^
 
sketch_may10a:29: error: 'amount' was not declared in this scope
 
 MIDI.sendNrpnIncrement(amount, channel) ;
 
                        ^
 
sketch_may10a:30: error: 'class midi::MidiInterface<HardwareSerial>' has no member named 'endNrpn'
 
 MIDI.endNrpn(channel);  }
 
      ^
 
exit status 1
'class midi::MidiInterface<HardwareSerial>' has no member named 'beginNrpn'
 
"
 
Простите за безграмотность..
 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Метод beginNrpn и иже с ним описан в классе MidiInterface. В классе HardwareSerial их искать бесполезно. И, соответственно, MIDI нужно заводить именно этого класса.

2. number нужно либо описать как константу, либо заменить на числовую костанту - как Вам удобнее.

3. По поводу RPN и NRPN во-первых, наиболее прямой способ вводить собственные MIDI контроллеры, а во вторых - единственный путь задавать не абсолютную величину (как у потенциометра), а инкремент и декремент (как нужно энкодеру). Т.е. если что-то может решить проблему, описанную в Вашем первом посте, то только они. 

Ну а спецификация MIDI - она реально тяжело воспринимается. Там много расширений, RPN/NRPN - одно из них. Но что-то сделать не разобравшись - тоже мало реально. Так что разбираться или нет - решать Вам.

En Gi
Offline
Зарегистрирован: 12.01.2017

Я нашел библиотеку с поддержкой RPN NRPN. Теперь мне очень хочется понять это

MIDI.beginNrpn(number, channel) ;
MIDI.sendNrpnDecrement(amount, channel) ;
MIDI.endNrpn(channel);

Что есть amount? с номером и каналом вроде всё понятно.

По мимо отсутствия знаний миди, у меня так же присутствует отсутствие знаний програмирования. 

Только пожалуйста, не говорите мне что это не моё, что я знаимаюсь не своим делом, и тому подобное, ладно?))

Я хочу понять как это работает. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1.

Я думал, что слово amount говорит само за себя.

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

Может, оно так и есть. Но мне помнится, я читал, что это фиктивный параметр, который должен быть равен 0, при этом изменение всегда осуществляется на 1 единицу. Честно говоря, мне рыться в документации лень, так что я надеюсь, Вы сами посмотрите. Ну можно попытаться методом тыка: подставять туда поочередно 0, 1 и какое-нибудь другое число, и посмотреть, что из этого выйдет.

2. 

По поводу программироваия - ну все когда-то начинали. Вопрос, есть желание или нет. Если нет, можно попытаться толкунться в раздел "Ищу исполнителя". Ну а если есть, то нечего жаловаться, работать надо.

3. 

Ну и фрагмент кода я, естественно, не проверял - быстренько глянул библиотеку и написал первое, что пришло в голову. Так что надо пробовать и отлаживать.