Как сделать клавиши-модификаторы на клавиатуре в Arduino IDE - PullRequest
0 голосов
/ 04 июля 2019

Я делаю MIDI-контроллер, использующий Teensy и Arduino IDE, контроллер использует матричную клавиатуру (0-9, #, *, A, B, C, D) для отправки сообщений MIDI-нот. Я хотел бы использовать буквенные ключи в качестве модификаторов.

У меня работает матричная клавиатура и отправляются миди-ноты вкл / выкл и значения скорости для каждой из 16 клавиш (0-9, #, *, A, B, C, D). Я хотел бы, чтобы клавиши 0-9 отправляли миди-ноты, а клавиши A, B, C, D при их удерживании действуют как кнопки изменения октавы. Например, скажем, у меня настроено так, что когда я нажимаю 1, он отправляет ноту № 40, я хотел бы иметь возможность удерживать нажатой клавишу А, нажимая 1, и он передает ноту № 52.

#include "MIDIUSB.h"

/* Settings for Keypad */
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
const int NB_BUTTONS = ROWS * COLS;


int notes[NB_BUTTONS] = {37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52};

int keymodifier;
/* Keypad Init */
//https://github.com/Nullkraft/Keypad
#include <Keypad.h>
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

//Keypad pins
byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the kpd
byte colPins[COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the kpd
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//Keypad state : 1 = DOWN 3 = UP (there are other state which are unused here)
unsigned int buttons_state[NB_BUTTONS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};


void setup() {
  Serial.begin(115200);
  kpd.setHoldTime(250); // THIS IS WHERE I SET HOLD TIME NPF
}



void loop() {
  if (kpd.getKeys()) {
    for (int i = 0; i < LIST_MAX; i++) // Scan the whole key list.
    {
      if ( kpd.key[i].stateChanged )   // Only find keys that have changed state.
      {
        buttons_state[kpd.key[i].kcode] = kpd.key[i].kstate;

        if (kpd.key[i].kstate == 1) { //DOWN
          Serial.print(kpd.key[i].kcode);
          Serial.print(":");
          Serial.println("1");



            key_down(kpd.key[i].kcode);


        }


        if (kpd.key[i].kstate == 3) { //UP
          Serial.print(kpd.key[i].kcode);
          Serial.print(":");
          Serial.println("0");
          // If key is up we send a midi note off
          key_up(kpd.key[i].kcode);
        }
      }
    }
  }
}

//Key down (pressed)
void key_down(int key) {
  //Serial.print(buttons_state[velocity_button]);
  noteOn(0, (notes[key] + keymodifier), 127);

  //Display note and velocity on screen
  MidiUSB.flush();
}

//Key up (unpressed)
void key_up(int key) {

    noteOff(0, notes[key], 127);

  MidiUSB.flush();
}

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
}

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

Я заметил, что в библиотеке клавиатуры есть режим удержания, но кроме этого я не знаю, с чего начать. Я довольно новичок в программировании на Arduino.

...