Skip to content

Instantly share code, notes, and snippets.

@arion
Created November 27, 2016 17:12
Show Gist options
  • Save arion/f77003ddc6c2a8cbde8de82c09972598 to your computer and use it in GitHub Desktop.
Save arion/f77003ddc6c2a8cbde8de82c09972598 to your computer and use it in GitHub Desktop.
#include <MIDI.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <math.h>
SoftwareSerial mySerial(11, 10); // RX, TX
MIDI_CREATE_DEFAULT_INSTANCE();
bool isMp3Mode = false;
const byte ROWS = 4; //--Количество столбцов матричной клавиатуры
const byte COLS = 4; //--Количество строк матричной клавиатуры
byte rowPins[ROWS] = {2, 3, 4, 5}; //--Пины столбцов
byte colPins[COLS] = {6, 7, 8, 9}; //--Пины строк
byte buttonState[COLS][ROWS] = { //--Массив состояния кнопок
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
byte kpdNote[COLS][ROWS] = { //Массив нот
{51, 47, 43, 39},
{50, 46, 42, 38},
{49, 45, 41, 37},
{48, 44, 40, 36}
};
byte mp3File[COLS][ROWS] = { //--Массив файлов
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
byte dval = 0;
int pval = 0;
int potPrVal[4] = {0, 0, 0, 0}; //--Массив состояниея потенциометров
byte potPins[4] = {1, 2, 3, 4}; //--Пины потенциометров
byte mp3Pin = 12;
byte folder = 0;
void setup() {
MIDI.begin(); //Инициализация MIDI интерфейса
for(byte i = 0; i < COLS; i++){ //--Конфигурируем строки мтрчн клвтр как выходы--
pinMode(colPins[i], OUTPUT); //--и подаём на них лог. 1-----------------------
digitalWrite(colPins[i], HIGH); // ----------------------------------------------
}
for(byte i = 0; i < ROWS; i++) { //--Конфигурируем столбцы мтрчн клвтр как входы---------
pinMode(rowPins[i], INPUT); //--и включаем встроенные в мк подтягивающие резисторы--
digitalWrite(rowPins[i], HIGH); //------------------------------------------------------
}
pinMode(mp3Pin, INPUT);
digitalWrite(mp3Pin, HIGH);
Serial.begin(115200);
mySerial.begin(9600);
mp3_set_serial(mySerial); //--set softwareSerial for DFPlayer-mini mp3 module
delay(1); //--delay 1ms to set volume
mp3_set_volume(20); //--value 0~30
}
void loop() {
for(byte chn = 0; chn < 4; chn++) //-Цикл чтения значений потенциометров-----------
{
pval = analogRead(potPins[chn]);
if (abs(pval-potPrVal[chn]) > 10) { //--Если текущее значение отл. от прошлого
MIDI.sendControlChange(1, chn, pval);
if (isMp3Mode) {
Serial.println("Change channel: chn:" + String(chn) + " val:" + String(pval));
}
potPrVal[chn] = pval;
if (chn == 3) {
mp3_set_volume(round(pval / 35));
}
if (isMp3Mode && (chn == 0 || chn == 1 || chn == 2)) {
folder = (round(potPrVal[0] + potPrVal[1] + potPrVal[2]) / 123) + 1;
if (folder > 15) { folder = 15; }
Serial.println("Change folder:" + String(folder));
}
}
}
//-------------------------------------
for(byte col = 0; col < COLS; col++) //-Цикл чтения матричной клавиатуры-----
{
digitalWrite(colPins[col], LOW); //--На считываем столбец выставляем 0---
for(byte row = 0; row < ROWS; row++) //--Построчно считываем каждый столбец--
{ //--И при нажатой кнопке передаём ноту--
dval = digitalRead(rowPins[row]);
if ( dval == LOW && buttonState[col][row] == HIGH ) {
MIDI.sendNoteOn(kpdNote[col][row], 127, 1);
if (isMp3Mode) {
Serial.println("Start play: row:" + String(row) + " col:" + String(col) + " note:" + String(kpdNote[col][row]));
}
}
if ( dval == HIGH && buttonState[col][row] == LOW ) {
MIDI.sendNoteOff(kpdNote[col][row], 0, 1);
if (isMp3Mode) {
mp3_play_file_in_folder(folder, mp3File[col][row]);
Serial.println("Stop play: row:" + String(row) + " col:" + String(col) + " note:" + String(kpdNote[col][row]));
}
}
buttonState[col][row] = dval;
}
digitalWrite(colPins[col], HIGH);
}
//--------------------------------------
isMp3Mode = (digitalRead(mp3Pin) == HIGH);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment