Проблема переключения режимов
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Прошу помощи в следующем вопросе. Ваяю Midi контроллер для гитарного эффекта Whammy 5.
Три кнопки: одна листает пресеты вперёд, другая назад, третья переключает режимы.
Один режим: пресеты листаются с включенным эффектом, второй режим пресеты листаются с выключенным эффектом.
Это определяется номером Programm Change.
С 0 по 20 с вкл эффектом.
C 21 по 41 пресеты листаются с выкл эффектом.
Только вот при переключение режима при пролистывании пресетов в любом из состояний (вкл/выкл) переключение не происходит до тех пор пока не будет достигнуто крайнее значение (0 или 20 или 21или 41)
Как сделать так чтоб после нажатия на кнопку переключения режимов, пролистывание пресетов происходило бы сразу в нужном режиме? Без необходимости листатать до крайнего значения.
Спасибо!
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE(); int regim=1; int flag=0; int progNo = 0; int upLastTime, downLastTime, upNow, downNow; void setup(){ pinMode(5,INPUT); pinMode(6,INPUT); pinMode(10,OUTPUT);//светодиод сигнализирующий о переключении режима Serial.begin(31250); MIDI.begin(MIDI_CHANNEL_OMNI); digitalWrite(5, HIGH); // включаем внутреннюю подтяжку digitalWrite(6, HIGH); upLastTime = digitalRead(6); downLastTime = digitalRead(5); } void loop(){ upNow = digitalRead(5); downNow = digitalRead(6); if(digitalRead(3)== HIGH && flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { regim++; flag=1; if(regim>2)//ограничим количество режимов { regim=1; } } if(digitalRead(3)==LOW&&flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag=0;//обнуляем переменную } if(regim==1)//первый режим { Fx0(); digitalWrite(10, LOW); } if(regim == 2)//второй режим { Fx1(); digitalWrite(10, HIGH);//загорается сетодиод сигнализирующий переключение режима } } void Fx0() { if (upNow == LOW && upLastTime == HIGH) { progNo++; // increment program change if(progNo > 41) progNo = 21; // stop it going too high MIDI.sendProgramChange((progNo), 1); delay(10); // bit of debounce delay } if (downNow == LOW && downLastTime == HIGH) { progNo--; // decrement program change if(progNo < 21) progNo = 41; // stop it going too low MIDI.sendProgramChange((progNo), 1); delay(10); // bit of debounce delay } upLastTime = upNow; downLastTime = downNow; delay(10); } void Fx1() { if (upNow == LOW && upLastTime == HIGH) { progNo++; // increment program change if(progNo > 20) progNo = 0; // stop it going too high MIDI.sendProgramChange((progNo), 1); delay(10); // bit of debounce delay } if (downNow == LOW && downLastTime == HIGH) { progNo--; // decrement program change if(progNo < 0) progNo = 20; // stop it going too low MIDI.sendProgramChange((progNo), 1); delay(10); // bit of debounce delay } upLastTime = upNow; downLastTime = downNow; delay(10); }
В 28 строку - Serial.println(regim);
И так по всем сомнительным.
Спасибо за совет. Добавил в 28 строку и далее в меру своего понимания.
При пролистывании в первом режиме (эффект выкл) теперь переключается во второй режим (эффект вкл)и из любого пресета сразу на первый.
А вот при переключении обратно всё так же приходится пролистать все 20 пресетов чтоб перешло в первый режим (эффект выкл)
Желание есть. Я новичок. Прошу не судите строго. Я несколько дней искал нужную информацию, прежде чем сюда обратится.
Видимо замахнулся на то что мне пока не по зубам.
Видимо замахнулся на то что мне пока не по зубам.
Благодарю за конструктивную критику.
van - зачем так много условий в loop ? Зачем нужна переменная flag? - она ж нигде не используется
Я бы все сократил буквально до двух строк: если кнопка выбора режима нажата - режим 1, если отпущена - режим 2.
И ВСЕ.
Спасибо за совет. Добавил в 28 строку и далее в меру своего понимания.
При пролистывании в первом режиме (эффект выкл) теперь переключается во второй режим (эффект вкл)и из любого пресета сразу на первый.
А вот при переключении обратно всё так же приходится пролистать все 20 пресетов чтоб перешло в первый режим (эффект выкл)
Я вам вообще-то советовал посмотреть как изменяются переменные в динамике и соответствует ли это задуманному.((((
van - зачем так много условий в loop ? Зачем нужна переменная flag? - она ж нигде не используется
Я бы все сократил буквально до двух строк: если кнопка выбора режима нажата - режим 1, если отпущена - режим 2.
И ВСЕ.
Для того чтоб нажать и отпустить кнопку - режим сменился. Это ж гитарная педаль. Не удобно стоять удерживая кнопку.
Увы даже при условии двух строк, режим не переключается пока цикл пресетов не пролистаешь.
Спасибо за совет. Добавил в 28 строку и далее в меру своего понимания.
При пролистывании в первом режиме (эффект выкл) теперь переключается во второй режим (эффект вкл)и из любого пресета сразу на первый.
А вот при переключении обратно всё так же приходится пролистать все 20 пресетов чтоб перешло в первый режим (эффект выкл)
Я вам вообще-то советовал посмотреть как изменяются переменные в динамике и соответствует ли это задуманному.((((
Я это понял позже. Ночь не спал, туго уже соображал)