Использование энкодера в миди контроллере
- Войдите на сайт для отправки комментариев
Постораюсь доходчиво обьяснить проблему. Есть такая чудная программа под названием Guitar Rig, для неё я сделал миди фут контроллер, 10 кнопок и 6 потенциометров. Юзая контроллер пришёл к выводу, что потенциометры не совсем удобны, точнее совсем не удобны, так как у них есть крайнее левое и крайнее правое положение. В выбранном пресете ГитарРига я выкручиваю потенциометры, которые привязаны к разным "крутилкам", и вроде бы все здорово, но, при переходе на следующий пресет (тем временем потенциометры остаются в том положении в которое я их выкрутил ранее) получается не соответствие физических ручек потенциометров с "крутилками" ГитарРига, и выходит такая петрушка - предположим, потенциометр выкручен в крайнее правое положение, а "крутилка" в ГитарРиге в крайнее левое, как только я начинаю крутить потенциомтр влево, "крутилка" сразу занимает тоже положение что и потенциометр, и получается полная хрень. Я подумал, а что если использовать вместо потенциометров энкодеры. Но и тут меня ждало разочарование, так как энкодер, хоть и имет бесконечную прокрутку в обе стороны, ведет себя в ГитарРиге точно так же как и потенциометр. Фууух.. Надеюсь что кто то понял что я тут напечатал..
По логике повидение энкодера мне понятно, ему необходимо понить старое значение что бы его изменять в большую или меньшую сторону. Но это попахивает приговором. Есть у кого нибудь мысли, знания, опыт? Поделитесь пожалуйста.
было бы интересно для сына сделать такой девайс в подарок, но я нихрена не понял, что надо )))
Судя по Вашему описанию (если я правильно его понял), проблема в Guitar Rig.
Хотя уверенности в этом нет - Вы ведь почему-то разместили вопрос на форуме Arduino вместо того, чтобы разместить на форуме Guitar Rig. Кстати, почему?
PS. IMHO для энкодера ничего запоминать не нужно, а передавать команды Bn 60 и Bn 61 (Data Increment и Data Decrement).
Я конечно могу вам помочь, но, как видите, я тоже небоженька и творю я пока не очень хорошо) Но чем смогу тем помогу
Да, скорее всего проблема в гитариге. Потому что решил что это програмная проблема ардуины, а потом подумав, пришёл к такому же выводу как и вы. Печально, но наверно тему можно закрывать.
Кстати. Я не очень понял про какие команды вы говорите, "Bn 60 и Bn 61 (Data Increment и Data Decrement)." для меня это новые слова)) Если не трудно разъясните пожалуйста. Если это имеет значение, то вот такой у меня код
Кстати. Я не очень понял про какие команды вы говорите, "Bn 60 и Bn 61 (Data Increment и Data Decrement)." для меня это новые слова)) Если не трудно разъясните пожалуйста.
En Gi, чтобы я смог понять, как Вам дальше отвечать, ответьте сначала Вы на следующий вопрос:
Вы более или менее разбираетесь в протоколе MIDI или просто пытаетесь использовать библиотеку по наитию, не вдаваясь в то, как она работает?
Почему? Потому что используется encoder.read(), выставляющее фактическое значение аки у резистора, хотя по факту это значение не нужно. Нужны события, когда крутят (назовём это ticks), вправо или влево. Насколько быстро крутят - накладывает определённые рамки, нужно успеть передать GuitarRig все и каждое срабатывание событыя, то есть если крутить межденно - события будут приходить редко и всё будет отрабатываться. Но если крутнуть резко, часть событий может выпасть и не будет учтена. Ну это я сразу предупреждаю о проблеме, присущей этому варианту решения.
Как это делать, я пока не знаю, но в идеале от библиотеки Encoder можно избавиться. Существует схема pighiXxx, преобразующая сигналы энкодеров в Step и Dir, собранная на 7414 и 7474. Мною эта схема была повторена как-то криво, и результаты были никакие, тем не менее меня не покидает ощущение что схема годная, и можно попробовать ещё.
Что нужно:
- обнаружить сигнал, например открутили на один щелкок влево, соответственно step=1, dir=0.
- выдать MIDI сообщение "убавить соотв. крутилку", выдать максимально быстро
- ждать следующих подвижек.
Вот оно:
4013 это КМОП-версия 7474, по-моему у них даже номера выводов одинаковые. Тем не менее, проверьте в справочном листке.
Voodoo Doll,
1. По поводу "крутить медленно": у меня уже при 0.1uF быстро крутить не получается, а у Вас целая микрофарада. Это уж недо крутить "очеь медленно".
2. Зачем вообще какая-то схема, если:
- вопрос элементарно решается программно.
- аппаратное решение не изьавляет от необходимости программной поддержки.
- ни по количеству используемых пинов, ни по объему программного кода, ни по скорости реакции, ни по использованию прерываний мы в случае программно-аппаратноо решения не выигрываем у чисто программного.
Так зачем еще и схема?
En Gi, я посмотрел, если это стандартная ардуиновская MIDI-библиотека (github по ссылке с arduino.cc), то она поддерживает NRPN сообщения. Вопрос, поддержтивает ли их Guitar Rig.
И, кстати, Вы очень вольно обращаетесь с номерами контроллеров. В MIDI за определенными контроллерами закреплены определенные номера и менять их недопустимо. В частности контроллер номер 1 отвечает за колесо модуляции, а номер 2 - за контроллер духовых инструментов. Причем оба - 14-разрядные контроллеры. Для переключателей on/off предусмотрены другие номера.
То есть вместо
должно быть что-то вроде
или
причем нужно уточнить по спецификации MIDI: мне кажется, что amount должна быть равна 0.
Чойта? А то что минимум reliability экнодеров извлекается из обычных портов, чуть больше - с аппаратным прерыванием один из, максимум - оба? Итого, раз энкодер на D2/D3, чтобы безглючно работал, и... упс, прерывания кончились. Соответственно одна ардуина - один энкодер. Не?
Там какбе тайминги всякие, счёт на сотни наносекунд-единицы микросекунд, не? Триггеры Шмитта какбе делают эти сигналы ну хатябы медленнее. Ну так, чисто если подумать. Не? Ладно, спорить не собираюсь. Но вы посты почитайте, у автора их там не пять, ну явно. Может даже не десять. Энкодер это очень даже требовательная по времени вещь, не надо мне тут "прерывания не нужны". Относили энкодер на шесть метров от ардуины, знаем.
Чойта? А то что минимум reliability экнодеров извлекается из обычных портов, чуть больше - с аппаратным прерыванием один из, максимум - оба? Итого, раз энкодер на D2/D3, чтобы безглючно работал, и... упс, прерывания кончились. Соответственно одна ардуина - один энкодер. Не?
Не!
Прекрасно сажаются на pcint, а они в Uno на каждом пине. Т.е. штук 6 - даже если с кнопкой. В Mega 2560, правда, не на каждом, но обычно тоже выделить можно.
Кстати. Я не очень понял про какие команды вы говорите, "Bn 60 и Bn 61 (Data Increment и Data Decrement)." для меня это новые слова)) Если не трудно разъясните пожалуйста.
En Gi, чтобы я смог понять, как Вам дальше отвечать, ответьте сначала Вы на следующий вопрос:
Вы более или менее разбираетесь в протоколе MIDI или просто пытаетесь использовать библиотеку по наитию, не вдаваясь в то, как она работает?
Я менее разбираюсь в протоколе миди, знаю что команда миди состоит и 3 байт. Первый байт отвечает за взятие ноты и номер канала, второй тон, третий сила нажатия. Вроде как то так. В общем понятия мои оочень поверхностные, и как вы говорите я все использую по наитию.
Что есть NRPN? и почему гитариг может его не поддержывать? В связи с чем недопустимо менять номера коннтроллеров?
Походу вы отправите меня на ХУхл))
En Gi, т.е. энкодерами - это Вы ноты включаете?
Да и функция MIDI.sendControlChange мало похожа на MIDI.sendNoteOn.
В общем, хотя бы в гугле наберите и почитайте "MIDI NRPN сообщения" и попытайтесь сделать так, как я указал в посте №8.
Ну вот, как я и думал отправите на хухл. Я вас понял, попробую немедленно) Спасибо!
А, только я не понял вот что, вы говорите что amount должна быть равна 0. То есть где то в коде это надо указать?
Ну вот, как я и думал отправите на хухл. Я вас понял, попробую немедленно) Спасибо!
Нет, ну чтобы работать с MIDI нужно хоть немного понимать, что делаешь. Я же не посылаю штудировать официальную спецификацию, а указал конкретно, что читать.
А, только я не понял вот что, вы говорите что amount должна быть равна 0. То есть где то в коде это надо указать?
Ну так и указать - вместо amount написать 0. Но только сначала уточнить, т.к. я навскидку не помню подробностей - нужен ли там 0 или другое число, для чего я и посоветовал почитать.
я почитал про RNPN и RPN, и так и не понял как это применять. Туплю. Видимо надо знать всю спецификацию миди. Попробовал читать с начала, понял что такая информация не потдаётся восприятию. Попробовал использовать ваш код, предварительно скачал библиотеку с ардуино.сс, так как не помню от куда была взята библиотека ранее, компилятор вот так ругнулся - "
1. Метод beginNrpn и иже с ним описан в классе MidiInterface. В классе HardwareSerial их искать бесполезно. И, соответственно, MIDI нужно заводить именно этого класса.
2. number нужно либо описать как константу, либо заменить на числовую костанту - как Вам удобнее.
3. По поводу RPN и NRPN во-первых, наиболее прямой способ вводить собственные MIDI контроллеры, а во вторых - единственный путь задавать не абсолютную величину (как у потенциометра), а инкремент и декремент (как нужно энкодеру). Т.е. если что-то может решить проблему, описанную в Вашем первом посте, то только они.
Ну а спецификация MIDI - она реально тяжело воспринимается. Там много расширений, RPN/NRPN - одно из них. Но что-то сделать не разобравшись - тоже мало реально. Так что разбираться или нет - решать Вам.
Я нашел библиотеку с поддержкой RPN NRPN. Теперь мне очень хочется понять это
Что есть amount? с номером и каналом вроде всё понятно.
По мимо отсутствия знаний миди, у меня так же присутствует отсутствие знаний програмирования.
Только пожалуйста, не говорите мне что это не моё, что я знаимаюсь не своим делом, и тому подобное, ладно?))
Я хочу понять как это работает.
1.
Я думал, что слово amount говорит само за себя.
По мысли авторов библиотеки - это количество шагов на которое нужно изменить положение регулятора.
Может, оно так и есть. Но мне помнится, я читал, что это фиктивный параметр, который должен быть равен 0, при этом изменение всегда осуществляется на 1 единицу. Честно говоря, мне рыться в документации лень, так что я надеюсь, Вы сами посмотрите. Ну можно попытаться методом тыка: подставять туда поочередно 0, 1 и какое-нибудь другое число, и посмотреть, что из этого выйдет.
2.
По поводу программироваия - ну все когда-то начинали. Вопрос, есть желание или нет. Если нет, можно попытаться толкунться в раздел "Ищу исполнителя". Ну а если есть, то нечего жаловаться, работать надо.
3.
Ну и фрагмент кода я, естественно, не проверял - быстренько глянул библиотеку и написал первое, что пришло в голову. Так что надо пробовать и отлаживать.