MIDI - USB клавиатура на Arduino Nano

Тема в разделе "Глядите, что я сделал", создана пользователем XxOinvizioNxX, 20 фев 2017.

  1. Nick56

    Nick56 Нуб

    автор очевидно ошибся, на схеме правильно. Я не ставил не резисторы, не диоды. В описании библиотеки на кнопки , сказано, что это поддерживается программно. Игра аккордами это подтверждает. Я бы не стал использовать 49 клавишу, всё таки переключение октав полезная штука.
     
  2. Oleg2000

    Oleg2000 Нуб

    хм, зачем использывать переключения октав когда 49 клавишь достаточно для полноценной игры
     
  3. Nick56

    Nick56 Нуб

    не буду спорить, я не музыкант. Главное запустить программу, у вас заработало?
     
  4. Oleg2000

    Oleg2000 Нуб

    не получается, все клавиши работают, но очень в разброс, то есть клавиши не соответствуют нотам, я пытался менять комбинации подключения к пинам, особо ничего не меняется, менятся, но все равно каша, может в коде ошибка
    Код (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, 12};
    byte colPins[COLS] = {A0, A1, A2, A3, 10, 11};

    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[i].stateChanged )
                {
                    switch (kpd.key[i].kstate) {
                        case PRESSED:
                        kpress(kpd.key[i].kchar);
                    break;
                        case HOLD:
                    break;
                        case RELEASED:
                        kreleased(kpd.key[i].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 - 0) + octave), 0x7F);
    }
    void kreleased(char knum) {
        noteOn(0x90, ((knum - 0) + octave), 0x00);
     
    }
    void alloff() {
      for (int i=0; i <= 131; i++){
        noteOn(0x90, i, 0x00);
      }
    }
     
  5. Nick56

    Nick56 Нуб

    #include <Keypad.h>
    uint32_t val = 0;
    const byte ROWS = 8;
    const byte COLS = 6;
    char keys[ROWS][COLS] = {
    {48,49,50,51,52,53},
    {54,55,56,57,58,59},
    {60,61,62,63,64,65},
    {66,67,68,69,70,71},
    {72,73,74,75,76,77},
    {78,79,80,81,82,83},
    {84,85,86,87,88,89},
    {90,91,92,93,94,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() {
    pinMode(A5, INPUT);
    pinMode(A4, INPUT);
    pinMode(12, OUTPUT);
    Serial.begin(115200);
    loopCount = 0;
    startTime = millis();
    // msg = "";
    }


    void loop() {
    if (digitalRead(A4) == HIGH)
    {
    delay(300);
    if (octave >= 36)
    {
    octave = 0;
    }
    else
    {
    octave = octave + 12;
    }
    alloff();
    }
    if (digitalRead(A5) == HIGH)
    {
    delay(300);
    if (octave <= -36)
    {
    octave = 0;
    }
    else
    {
    octave = octave - 12;
    }
    alloff();
    }
    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) {
    digitalWrite(12, HIGH);
    noteOn(0x90, ((knum - 0) + octave), 0x7F);//смещение строя
    }
    void kreleased(char knum) {
    noteOn(0x90, ((knum - 0) + octave), 0x00);//смещение строя
    digitalWrite(12, LOW);
    }
    void alloff() {
    digitalWrite(12, HIGH);
    for (int i=0; i <= 131; i++){
    noteOn(0x90, i, 0x00);
    }
    digitalWrite(12, LOW);
    }

    у меня минимум переделок
     
  6. Oleg2000

    Oleg2000 Нуб

    а есть разница в подключении строк и колонок к пинам?
     
  7. Nick56

    Nick56 Нуб

    у вас в матрице одинаковые ноты у разных клавиш(56,64 и т.д)Такого быть не должно.Достаточно было добавить одну строку {96,97,98,99,100,} и назначить любой свободный порт
     
  8. Nick56

    Nick56 Нуб

    разницы нет, порядок выборки матрицы вы указываете в строках под матрицей
     
  9. Oleg2000

    Oleg2000 Нуб

    это очень странно что ваш скетч компилировался, в воилд лупе нигде нет i
     

    Вложения:

  10. Oleg2000

    Oleg2000 Нуб

    я думал там в столбец счет идет
     
  11. Oleg2000

    Oleg2000 Нуб

    да и я просто убираю эту строку и порт, и все равно ничего не меняется
     
  12. Nick56

    Nick56 Нуб

    скетч не мой, а автора. -7заменил на-0, и закомментировал msg
     
  13. Oleg2000

    Oleg2000 Нуб

    о, заметил у вас матрица по другому построина
     
  14. Nick56

    Nick56 Нуб

    без схемы трудно понять где вы напутляли.
     
  15. Oleg2000

    Oleg2000 Нуб

    ну вот как так, одно и то же копируем, а получается разное
     
  16. Oleg2000

    Oleg2000 Нуб

    специально нарисовал
     

    Вложения:

  17. Nick56

    Nick56 Нуб

    матрица у вас не правильная, подмените , может всё и заработает
     
  18. Oleg2000

    Oleg2000 Нуб

    спасибо, буду пробовать, странно что эта матрица была в статье
     

    Вложения:

    • Снимок.PNG
      Снимок.PNG
      Размер файла:
      101,7 КБ
      Просмотров:
      398
  19. Oleg2000

    Oleg2000 Нуб

    УРА!!!! получилось, спасибо вам огромное, долгих лет жизни и крепкого здоровья)))))
     
  20. Nick56

    Nick56 Нуб

    просто у автора на клавишах распаяно по другому.
    Я рад , что у нас всё получилось!