Created
November 27, 2016 17:12
-
-
Save arion/f77003ddc6c2a8cbde8de82c09972598 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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