Я делаю 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.