Автор Тема: Ардуино миди футсвич (требуется помощь в написании скетча)!  (Прочитано 684 раз)

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

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

  • Живу на форуме
  • *******
  • Сообщений: 8729
  • Репутация: +961/-32
Приветствую! Сделал себе двухкнопочный футсвич, передающий три СС сообщения одной кнопкой по короткому, длинному нажатию и удержанию.
(нажмите чтобы показать/спрятать)
По короткому нажатию передается СС со значением 127 а по длинному то же СС со значением 0, что не совсем удобно.
Как поправить скетч что бы по короткому нажатию передавалось сообщение CC Toggle?
Я задал вопрос создателю библиотеки и он мне ответил:
Объявите логический флаг и переключайте состояние этого флага всякий раз, когда происходит интересующее событие кнопки. Затем отправьте правильное MIDI-сообщение в зависимости от состояния флага.

Здесь вы можете найти вдохновение: https://tttapa.github.io/Control-Surface-doc/Doxygen/d8/dba/Abstract_2MIDIButtonLatched_8hpp_source.html


Помогите доработать скетч, сам я не достаточно подкован в этом вопросе.

Оффлайн akl

  • Живу на форуме
  • *******
  • Сообщений: 8114
  • Репутация: +2265/-69
  • не шарю ваще
#include <Control_Surface.h> // Include the Control Surface library

// Instantiate a MIDI over USB interface.
USBMIDI_Interface midi;

// Ignore the name “increment” button, it's simply a button

// class that can detect long and short presses.

IncrementButton btn { 4 }; // кнопка полдключена на 4 пин
IncrementButton btn2 {5};// кнопка полдключена на 5 пин

uint8_t btn1_flg = 0;
uint8_t btn2_flg = 0;
void setup() {

  Control_Surface.begin();

  btn.begin(); //инициализация работы кнопки 1
  btn2.begin(); //инициализация работы кнопки 2

}

void loop() {

  Control_Surface.loop();

  //поведение для первой кнопки
  switch (btn.update()) {
    case IncrementButton::ReleasedShort:
      Control_Surface.sendCC(28, btn1_flg * 127); //посылаем midi cc 28 при коротком нажатии
      btn1_flg = !btn1_flg;
      break;
    case IncrementButton::IncrementHold:
      Control_Surface.sendCC(22, 127); //посылаем midi cc 22 при удержании
      break;
  }

  //поведение для второй кнопки
  switch (btn2.update()) {
    case IncrementButton::ReleasedShort:
      Control_Surface.sendCC(29, btn2_flg * 127); //посылаем midi cc 29 при коротком нажатии
      btn2_flg = !btn2_flg;
      break;
    case IncrementButton::IncrementHold:
      Control_Surface.sendCC(26, 127); //посылаем midi cc 26 при удержании
      break;
  }
}
« Последнее редактирование: Мая 30, 2021, 12:00:42 от akl »

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

  • Живу на форуме
  • *******
  • Сообщений: 8729
  • Репутация: +961/-32
akl, Спасибо огромное! Загрузил, проверил - работает как надо :good: