• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Midi keyboard Arduino Uno
#1
Proszę kolegów o pomoc w modyfikacji kodu Evan Kale, który przy użyciu rejestru przesuwnego 74HC595 adaptuje klawisze keyboardu i wysyła sygnał na port midi. Zrobiłem to w M-Audio Axiom 49 2 generacji w którym padł fabryczny soft. Działa fajnie, ale chciałbym wykorzystać porty analogowy, żeby dodać np. 3 potencjometry i 3 przyciski. Jak się da więcej to też dobrze, bo chciałbym wykorzystać te oryginalne z keyboardu. Proszę o pomoc.

Taki kod:

#define NUM_ROWS 8
#define NUM_COLS 7

#define NOTE_ON_CMD 0x90
#define NOTE_OFF_CMD 0x80
#define NOTE_VELOCITY 127

//MIDI baud rate
#define SERIAL_RATE 31250

// Pin Definitions

// Row input pins
const int row1Pin = 2;
const int row2Pin = 3;
const int row3Pin = 4;
const int row4Pin = 5;
const int row5Pin = 6;
const int row6Pin = 7;
const int row7Pin = 8;
const int row8Pin = 9;
// 74HC595 pins
const int dataPin = 11;
const int latchPin = 12;
const int clockPin = 13;

boolean keyPressed[NUM_ROWS][NUM_COLS];
uint8_t keyToMidiMap[NUM_ROWS][NUM_COLS];

// bitmasks for scanning columns
int bits[] =

  B1111110,
  B1111101,
  B1111011,
  B1110111,
  B1101111,
  B1011111,
  B0111111,
  B1111111
};

void setup()
{
  int note = 28;

  for(int colCtr = 0; colCtr < NUM_COLS; ++colCtr)
  {
    for(int rowCtr = 0; rowCtr < NUM_ROWS; ++rowCtr)
    {
      keyPressed[rowCtr][colCtr] = false;
      keyToMidiMap[rowCtr][colCtr] = note;
      note++;
    }
  }

  // setup pins output/input mode
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);

  pinMode(row1Pin, INPUT);
  pinMode(row2Pin, INPUT);
  pinMode(row3Pin, INPUT);
  pinMode(row4Pin, INPUT);
  pinMode(row5Pin, INPUT);
  pinMode(row6Pin, INPUT);
  pinMode(row7Pin, INPUT);
  pinMode(row8Pin, INPUT);
  Serial.begin(SERIAL_RATE);
}

void loop()
{
  for (int colCtr = 0; colCtr < NUM_COLS; ++colCtr)
  {
    //scan next column
    scanColumn(colCtr);

    //get row values at this column
    int rowValue[NUM_ROWS];
    rowValue[0] = !digitalRead(row1Pin);
    rowValue[1] = !digitalRead(row2Pin);
    rowValue[2] = !digitalRead(row3Pin);
    rowValue[3] = !digitalRead(row4Pin);
    rowValue[4] = !digitalRead(row5Pin);
    rowValue[5] = !digitalRead(row6Pin);
    rowValue[6] = !digitalRead(row7Pin);
    rowValue[7] = !digitalRead(row8Pin);
    // process keys pressed
    for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
    {
      if(rowValue[rowCtr] != 0 && !keyPressed[rowCtr][colCtr])
      {
        keyPressed[rowCtr][colCtr] = true;
        noteOn(rowCtr,colCtr);
      }
    }

    // process keys released
    for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
    {
      if(rowValue[rowCtr] == 0 && keyPressed[rowCtr][colCtr])
      {
        keyPressed[rowCtr][colCtr] = false;
        noteOff(rowCtr,colCtr);
      }
    }
  }
}

void scanColumn (int colNum)

{

digitalWrite (latchPin, LOW);

shiftOut (dataPin, clockPin, MSBFIRST, bits [colNum]);

digitalWrite (latchPin, HIGH);

}

void noteOn(int row, int col)
{
  Serial.write(NOTE_ON_CMD);
  Serial.write(keyToMidiMap[row][col]);
  Serial.write(NOTE_VELOCITY);
}

void noteOff(int row, int col)
{
  Serial.write(NOTE_OFF_CMD);
  Serial.write(keyToMidiMap[row][col]);
  Serial.write(NOTE_VELOCITY);
}
 
Odpowiedź
#2
Ohoho... Jako, że widzę las rąk do pomocy to zadam inne pytanie: Czy można podłączyć dwa arduina pod jeden port midi. Czyli, żeby na jednej Atmedze 328p był program obsługujący klawisze, a na drugiej inny program obsługujący potencjometry, i żeby obie wysyłały sygnał do tego samego gniaza midi, pod które podłączony byłby kabel przejściówka midi-usb?
 
Odpowiedź
#3
(26-02-2019, 07:28)benwad napisał(a): Ohoho... Jako, że widzę las rąk do pomocy to zadam inne pytanie: Czy można podłączyć dwa arduina pod jeden port midi. Czyli, żeby na jednej Atmedze 328p był program obsługujący klawisze, a na drugiej inny program obsługujący potencjometry, i żeby obie wysyłały sygnał do tego samego gniaza midi, pod które podłączony byłby kabel przejściówka midi-usb?

Nie ma ludzi do pomocy, bo nikomu nie chce się domyślać zasady działania programu.
Opisz zmienne, skomentuj funkcje, a na pewno znajdą się pomocni ludzie.

Co się tyczy pytania. Pod jeden kanał MIDI nie podłączysz dwóch urządzeń. Jeśli chcesz jednocześnie nadawać na tym samym kanale, to trzeba zastosować sumator MIDI. Albo kupić za kilka stówek, albo zbudować, np. ten: http://www.ucapps.de/midimerger.html

Aha, jeśli chodzi o pytanie z pierwszego postu, to oczywiście że się da. Zrób tylko porządek z kodem, a do niego zajrzę.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
(26-02-2019, 15:15)Robson Kerman napisał(a): 1.
Cytat:Nie ma ludzi do pomocy, bo nikomu nie chce się domyślać zasady działania programu
 - Myślałem, że jest to oczywiste i że wynika to z kodu.
Program ma za zadanie odczytywać sygnały z matrycy klawiszy keyboardu. Jest ich 49, a że w Arduino Uno nie ma tylu pinów, to zastosowano rejestr przesuwny 74HC595. Do rejestru podłączone są kolumny, a wiersze do pinów cyfrowych od 2 do 9...

tu link do filmu jak to robił Evan Kale https://www.youtube.com/watch?v=lXX8v-ZW6Tk&t=272s
tu link do jego tutoriala krok po kroku wyjaśnione https://www.instructables.com/id/Add-MID...-Keyboard/

Ja użyłem tylko jednego rejestru przesuwnego bo mam 49 klawiszy i matrycę 8x7. Evan użył 2 rejestrów przesuwnych bo ma matrycę 6x11 i 61 klawiszy.

Pod tutorialem na samym dole są zdjęcia osób które wykonały ten projekt. Mój to benwad21. Mogę wrzucić jakieś foty jeśli to kogoś interesuje.





Cytat:Opisz zmienne, skomentuj funkcje, a na pewno znajdą się pomocni ludzie.

Napisałem ten post nie bez przyczyny w dziale Piaskownica. Jestem kompletnie zielony i w pierwszym poście napisałem, że jest to kod Evan Kale. Ja po prostu go pobrałem, zmieniłem kilka intuicyjnych linijek jak np. ilość wierszy i kolumn. Także ,,opisz zmienne, skomentuj funkcje"- nic mi to nie mówi.


Cytat:Co się tyczy pytania. Pod jeden kanał MIDI nie podłączysz dwóch urządzeń. Jeśli chcesz jednocześnie nadawać na tym samym kanale, to trzeba zastosować sumator MIDI. Albo kupić za kilka stówek, albo zbudować, np. ten: http://www.ucapps.de/midimerger.html
Przejrzałem na szybko. Dosyć interesujące. Jednak chyba taniej wyjdzie dokupić drugą przejściówkę midi-usb. Tylko czy program FL Studio obsłuży 2 urządzenia midi?

Ta konfiguracja wykorzystuje piny cyfrowe, a analogowe są wolne. Chciałbym je użyć np. do sterowania za pomocą potencjometru głośnością w programie, bądź jakimś efektem. Posiadam też inny kod który właśnie tak działa. Podłączyłem 3 potencjometry pod A0, A1, A2 i w FL Studio klikam na dowolne pokrętło prawym przyciskiem>>Link to controller. Wtedy ten potencjometr steruje tym w programie.

Tutaj link do tutoriala z tym kodem i wyjaśnieniem działania: 
http://www.notesandvolts.com/2016/03/ard...eters.html

Tutaj kod do pobrania(wymaga pobrania biblioteki Midi Library w arduino)
https://drive.google.com/file/d/0BwnVMB_...Jib2M/view
 
Odpowiedź
#5
Jak jesteś kompletnie zielony to kursy do Arduino i elektroniki znajdziesz tu: https://forbot.pl/blog/kursy. 2 Arduino można połączyć ze sobą przez UART, SPI, I2C lub jakiś wymyślony przez Ciebie interfejs, wtedy jedno zbiera część danych, drugie resztę + dane z pierwszego i wysyła jednym midi do urządzenia. Jeśli liczysz, że wrzucisz jakiś program na forum, określisz wymagania modyfikacji i ktoś to zrobi za Ciebie to nie jest to raczej dział piaskownicy, bardziej zlecenia. Tu bardziej by pasowało jakbyś miał właśnie pytania co np. robi linijka rowValue[0] = !digitalRead(row1Pin);. Ale tego dowiesz się też z kursu.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
Poprostu myślałem, że dla ludzi obytych w temacie jest to dopisanie kilku linijek w ciągu kilku minut i po kłopocie. Dla mnie kompletnie nie związanego z tą dziedziną jest to czarna magia i owszem interesowałem się kursami zanim tu jeszcze napisałem, ale uczenie się całego języka po to żeby dodać kilka funkcji to przerost formy nad treścią. Ja tylko chciałem już jakoś poskładać tego keyboarda do kupy i zakończyć ten temat, a tu wychodzi że musiałbym stać sie programistą. Ale nic się nie stało. Keyboard będzie działał jako same klawisze a do potencjometrów użyje tego drugiego kodu i zrobie oddzielne urządzenie.
Mimo wszystko dzięki za pomoc. Smile
Można zamknąć posta.
 
Odpowiedź
#7
Jeszcze taka mała podpowiedź: ten drugi kod (z potencjometrami) też obsługuje klawisze, tylko zamiast rejestru przesównego użyto multiplekser 74HC4067.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
(27-02-2019, 17:36)Robson Kerman napisał(a): Jeszcze taka mała podpowiedź: ten drugi kod (z potencjometrami) też obsługuje klawisze, tylko zamiast rejestru przesównego użyto multiplekser 74HC4067.

 Domyśliłem się tego jak próbowałem z dwóch sklecić jeden.... Ale dzięki za podpowiedź.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości