MIDI клавиатура на матричной клавиатуре от старого синтезатора

Тема в разделе "Arduino & Shields", создана пользователем Oleg2000, 18 дек 2019.

Метки:
  1. Oleg2000

    Oleg2000 Нуб

    Поскольку не смог починить старый японский синтезатор Casio ct-310, пришла идея сделать из его клавиатуры MIDI, на этом сайте нашел статью http://forum.amperka.ru/threads/midi-usb-клавиатура-на-arduino-nano.11123/ и решил делать по ней, за основу была взята Nano. Сразу скажу что это вообще мой первый опыт работы с Arduino.
    Не могу разобраться с написанием скетча для этого, в той статье был код, я из него выкинул все что связано с кнопками повышения и понижения октав, поскольку они мне не нужны и вот что вышло
    IMG_20191220_023023_HDR.jpg
    Код (C++):
    #include <Keypad.h>
    uint32_t val = 0;
    const byte ROWS = 9;
    const byte COLS = 6;
    char keys[ROWS][COLS] = {
    {48,56,64,72,80,88},
    {49,57,65,73,81,89},
    {50,58,66,74,82,90},
    {51,59,67,75,83,91},
    {52,60,68,76,84,92},
    {53,61,69,77,85,93},
    {54,62,70,78,86,94},
    {55,63,71,79,87,95},
    {56,64,72,80,88,96}
    };
    byte rowPins[ROWS] = {2, 3, 4, 5, 6, 7, 8, 9};
    byte colPins[COLS] = {10, 11, A0, A1, A2, A3};
    Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    unsigned long loopCount;
    unsigned long startTime;

    int octave = 0;
    int lstval = 0;
    void setup() {
    Serial.begin(115200);
    loopCount = 0;
    startTime = millis();

    }


    void loop() {

    if (kpd.getKeys())
    {
    for (int i=0; i<LIST_MAX; i++)
    {
    if ( kpd.key.stateChanged )
    {
    switch (kpd.key.kstate) {
    case PRESSED:
    kpress(kpd.key.kchar);
    break;
    case HOLD:
    break;
    case RELEASED:
    kreleased(kpd.key.kchar);
    break;
    case IDLE:
    break;
    }
    }
    }
    }
    }
    void noteOn(int cmd, unsigned long pitch, int velocity) {
    Serial.write(cmd);
    Serial.write(pitch);
    Serial.write(velocity);
    }

    void kpress(char knum) {

    noteOn(0x90, ((knum - 7) + octave), 0x7F);
    }
    void kreleased(char knum) {
    noteOn(0x90, ((knum - 7) + octave), 0x00);

    }
    void alloff() {
    for (int i=0; i <= 131; i++){
    noteOn(0x90, i, 0x00);
    }
    но с таким кодом получается каша, хочу разобраться как каждой клавише из матрице, там где ои 48 до 96 прмисвоить свой номер, который будет понимать fl studio (программа с виртульгыми муз. инст.)
    Код (C++):

    void kpress(char knum) {
    noteOn(0x90, 1, 0x7F);
    }
    void kreleased(char knum) {
    noteOn(0x90, 1, 0x00);

    }
     
    вот если его сюда (там где едениица) писать вместо ((knum - 7) + octave) то все клавиши воспроизводят только эту указанную ноту, вот как сделать так чтобы для каждой по отдельности?
     

    Вложения:

    Последнее редактирование: 22 дек 2019
  2. parovoZZ

    parovoZZ Гуру

    А вопрос-то в чем?
     
    Oleg2000 нравится это.
  3. Oleg2000

    Oleg2000 Нуб

    как прописать код так чтобы каждая отдельная клавиша воспроизводила отдельную ноту, в той статье не понятно обьяснено, то есть вообще какие-то отрывки, которые не компилируются ни как, если я пишу
    void kreleased(char knum) {
    noteOn(0x90,1, 0x00);
    void kreleased(char knum) {
    noteOn(0x90, 1, 0x00);
    void kreleased(char knum) {
    noteOn(0x90,2, 0x00);
    void kreleased(char knum) {
    noteOn(0x90, 2, 0x00);
    то ничего не компилируется, а мне так 49 раз нужно (49 клавиш)
    это все через библеотеку Keypad.h, ничего подобного нигде не нашел
     
  4. parovoZZ

    parovoZZ Гуру

    Есть замечательная библиотека - называется LUFA. В ней есть примеры по миди и довольно простые.
    USB Миди надо делать на Леонарде или производной от неё.
     
    Oleg2000 нравится это.
  5. Oleg2000

    Oleg2000 Нуб

    тоесть как в той статье не получится, просто я там почитал коменты и у кого-то даже получилось, суть просто в том чтобы сделать именно на nano, иначе пропадает вся целесообразность проэкта, проще будет уже купить готовый б/у контроллер[/QUOTE]
     
  6. parovoZZ

    parovoZZ Гуру

    Oleg2000 нравится это.
  7. Oleg2000

    Oleg2000 Нуб

    хорошо, тоесть Леонардо будет работать с матрицей без всяких дополнительных сдвиговых регистров? достаточно только ее? или нужно все таки собирать схему, делать отдельные выводы от каждой кнопки?
    P.S. спасибо за ответы
     
  8. asam

    asam Гик

    Для нано тоже никаких сдвиговых регистров не надо.
    Для начала возьмите пример MultiKey из библиотеки Keypad и добейтесь что бы клавиши нормально работали, а потом уже миди функционал прикручивайте.
     
    Oleg2000 нравится это.
  9. Oleg2000

    Oleg2000 Нуб

    о, а это уже что-то, но все равно не понятно будет ли работать с нано, в примерах уно, мне интересно как должен был работать этот скетч, я его вгружаю и получается каша, клавиши воспроизводят комбинации по 7 клавиш, тоесть нажимаешь 1, а программа воспроизводит 7 или больше нот, вот этот скетч
    #include <Keypad.h>
    uint32_t val = 0;
    const byte ROWS = 8;
    const byte COLS = 6;
    char keys[ROWS][COLS] = {
    {48,56,64,72,80,88},
    {49,57,65,73,81,89},
    {50,58,66,74,82,90},
    {51,59,67,75,83,91},
    {52,60,68,76,84,92},
    {53,61,69,77,85,93},
    {54,62,70,78,86,94},
    {55,63,71,79,87,95},
    };
    byte rowPins[ROWS] = {2, 3, 4, 5, 6, 7, 8, 9};
    byte colPins[COLS] = {10, 11, A0, A1, A2, A3};
    Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    unsigned long loopCount;
    unsigned long startTime;

    int octave = 0;
    int lstval = 0;
    void setup() {
    Serial.begin(115200);
    loopCount = 0;
    startTime = millis();

    }


    void loop() {

    if (kpd.getKeys())
    {
    for (int i=0; i<LIST_MAX; i++)
    {
    if ( kpd.key.stateChanged )
    {
    switch (kpd.key.kstate) {
    case PRESSED:
    kpress(kpd.key.kchar);
    break;
    case HOLD:
    break;
    case RELEASED:
    kreleased(kpd.key.kchar);
    break;
    case IDLE:
    break;
    }
    }
    }
    }
    }
    void noteOn(int cmd, unsigned long pitch, int velocity) {
    Serial.write(cmd);
    Serial.write(pitch);
    Serial.write(velocity);
    }

    void kpress(char knum) {

    noteOn(0x90, ((knum - 7) + octave), 0x7F);
    }
    void kreleased(char knum) {
    noteOn(0x90, ((knum - 7) + octave), 0x00);

    }
    void alloff() {
    for (int i=0; i <= 131; i++){
    noteOn(0x90, i, 0x00);
    }
     
  10. asam

    asam Гик

    Значит с подключением накосячили или
    Код (C++):
    byte rowPins[ROWS] = {2, 3, 4, 5, 6, 7, 8, 9};
    byte colPins[COLS] = {10, 11, A0, A1, A2, A3};
    Не соответствует вашему подключению.

    Когда вставляете код - делайте это между тегами [cоde=cpp] и [/cоde]
     
    Oleg2000 нравится это.
  11. Oleg2000

    Oleg2000 Нуб

    На счет подключения
    Код (C++):
    byte rowPins[ROWS]={2, 3, 4, 5, 6, 7, 8, 9};//Пины ардуино, на которые подключены выводы от кнопок
    byte colPins[COLS]={10, 11, A0, A1, A2, A3};//Пины ардуино, на которые подключены выводы от анодов диодов
    но эти коментарии из той статьи, написано выводы от анодов, у меня так и было, но в схеме показаны воводы от катодов и я решил перепаять все 49 диодов так чтобы получилось [​IMG]
    после этого она хотябы стала хоть как-то реагировать на нажатия
     
    Последнее редактирование: 19 дек 2019
  12. ИгорьК

    ИгорьК Гуру

  13. Oleg2000

    Oleg2000 Нуб

    ой, спасибо, не знал,
    исправил
     
  14. asam

    asam Гик

    Давайте сюда схему вашего подключения клавиатуры.
     
  15. Oleg2000

    Oleg2000 Нуб

     

    Вложения:

  16. Oleg2000

    Oleg2000 Нуб

    добавил
     
  17. Oleg2000

    Oleg2000 Нуб

    Пожалуйста, скажите, вы можете помочь с єтим разобраться?
     

    Вложения: