Миди баян на arduino mega и uno с прошивкой dual moco

Больше
6 года 1 день назад #44253 от Денис
Помоги с ноля скетч полноценный написать.
Данный путь мне кажется очень перспективным

Нашел инфу про dual moco, что то началось получаться перешивается arduino mega и uno
Смысл прошивки сигнал midi через разъем usb напрямую без доп по и переходников передается на пк и звуковой модуль
Работает эта беда только как я понял с библиотекой midi.h
Можно как то сделать 2 а массива. Один с обычными контактными кнопками(уже реализовано и работает в скече ниже) под клавишами баяна, другой массив с оптопрерывателями на клапанах
И на несколько каналов все это поделить.
Левая правая клавиатура на отдельных каналах
скетч ниже в нем есть много лишнего но это на данном этапе не критично
#include <Keypad.h>
#include <EEPROM.h>
#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();
#define C2 0x18
#define Db2 0x19
#define D2 0x1A
#define Eb2 0x1B
#define E2 0x1C
#define F2 0x1D
#define Fd2 0x1E
#define G2 0x1F
#define Ab2 0x20
#define A2 0x21
#define Bb2 0x22
#define B2 0x23
#define C3 0x24
#define Db3 0x25
#define D3 0x26
#define Eb3 0x27
#define E3 0x28
#define F3 0x29
#define Fd3 0x2A
#define G3 0x2B
#define Ab3 0x2C
#define A3 0x2D
#define Bb3 0x2E
#define B3 0x2F
#define C4 0x30
#define Db4 0x31
#define D4 0x32
#define Eb4 0x33
#define E4 0x34
#define F4 0x35
#define Fd4 0x36
#define G4 0x37
#define Ab4 0x38
#define A4 0x39
#define Bb4 0x3A
#define B4 0x3B
#define C5 0x3C
#define Db5 0x3D
#define D5 0x3E
#define Eb5 0x3F
#define E5 0x40
#define F5 0x41
#define Fd5 0x42
#define G5 0x43
#define Ab5 0x44
#define A5 0x45
#define Bb5 0x46
#define B5 0x47
#define C6 0x48
#define Db6 0x49
#define D6 0x4A
#define Eb6 0x4B
#define E6 0x4C
#define F6 0x4D
#define Fd6 0x4E
#define G6 0x4F
#define Ab6 0x50
#define A6 0x51
#define Bb6 0x52
#define B6 0x53

#define C7 0x54
#define Db7 0x55
#define D7 0x56
#define Eb7 0x57
#define E7 0x58
#define F7 0x59
#define Fd7 0x5A
#define G7 0x5B
#define Ab7 0x5C
#define A7 0x5D
#define Bb7 0x5E
#define B7 0x5F

#define C8 0x60
#define Db8 0x61
#define D8 0x62
#define Eb8 0x63
#define E8 0x64
#define F8 0x65
#define Fd8 0x66
#define G8 0x67
#define Ab8 0x68
#define A8 0x69
#define Bb8 0x6A
#define B8 0x6B

#define C9 0x6C
#define Db9 0x6D
#define D9 0x6E
#define Eb9 0x6F
#define E9 0x70
#define F9 0x71
#define Fd9 0x72
#define G9 0x73
#define Ab9 0x74
#define A9 0x75
#define Bb9 0x76
#define B9 0x77

#define NNN 0xFF // Отсутствие ноты
//
Матричная клавиатура
const byte ROWS = 8; //Количество столбцов матричной клавиатуры
const byte COLS = 8; //Количество строк матричной клавиатуры
byte rowPins[ROWS] = {2, 3, 4, 5, 6, 7, 8, 9}; //Пины столбцов
byte colPins[COLS] = {A0, A1, 10, 11}; //Пины строк

byte buttonState[COLS][ROWS] = { //Массив состояния кнопок
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
};

byte kpdNote[COLS][ROWS] = { //Массив нот
{C2, Ab2, E3, C4},
{Db2, A2, F3, Db4},
{D2, Bb2, Fd3, D4},
{Eb2, B2, G3, Eb4},
{E2, C3, Ab3, E4},
{F2, Db3, A3, F4},
{Fd2, D3, Bb3, Fd4},
{G2, Eb3, B3, G4}
};

//

//byte tmppin = 0;

byte val = 0;
byte dval = 0;

byte PrVal[8] = {0, 0, 0, 0, 0, 0, 0, 0};

long currenttime=0;
boolean b;
byte eval;
long ltime = 0;


void setup()
{
MIDI.begin(1); //Инициализация MIDI интерфейса
attachInterrupt(1, enc, FALLING ); // Аппаратное прерывание. По спадающему фронту на пине 2 запускаем enc

pinMode(3, INPUT);//Вывод B энкодера
pinMode(4, INPUT);//Неисп.

pinMode(19, OUTPUT);//Пины A4 A5. Подключены в выводам A и B мультиплексора
pinMode(18, OUTPUT);//

pinMode(13, OUTPUT);//--Гасим встроенный светодиод--
digitalWrite(13, LOW);//

for(byte i = 0; i < COLS; i++){ //--Конфигурируем строки мтрчн клвтр как выходы--
pinMode(colPins, OUTPUT); //--и подаём на них лог. 1
digitalWrite(colPins, HIGH); //
}
for(byte i = 0; i < ROWS; i++){ //--Конфигурируем столбцы мтрчн клвтр как входы
pinMode(rowPins, INPUT); //--и включаем встроенные в мк подтягивающие резисторы--
digitalWrite(rowPins, HIGH); //

}
}


void loop()
{

for(byte chn = 0; chn < 4; chn++) //-Цикл чтения значений потенциометров
{
set_mp_chn(chn); //--Задаём параметры мультиплексора
val=analogRead(0) / 8; //--Считываем значение с канала X
if (abs(val-PrVal[chn]) > 5) //--Если текущее значение отл. от прошлого
{ //--больше чем на 5, то посылаем новое значение--
MIDI.sendControlChange(chn,val,1);
PrVal[chn]=val;
}
val=analogRead(1) / 8; //--Считываем значение с канала Y аналогично X----
if (abs(val-PrVal[chn+4]) > 5)
{
MIDI.sendControlChange(chn+4,val,1);
PrVal[chn+4]=val;
}
} //

for(byte i = 0; i < COLS; i++) //-Цикл чтения матричной клавиатуры
{
digitalWrite(colPins, LOW); //--На считываем столбец выставляем 0---
for(byte j = 0; j < ROWS; j++) //--Построчно считываем каждый столбец--
{ //--И при нажатой кнопке передаём ноту--
dval=digitalRead(rowPins[j]);
if ( dval == LOW && buttonState[j] == HIGH ) MIDI.sendNoteOn(kpdNote[j],127,1);
if ( dval == HIGH && buttonState[j] == LOW ) MIDI.sendNoteOff(kpdNote[j],127,1);
buttonState[j] = dval;
}
digitalWrite(colPins, HIGH);
} //


}


void set_mp_chn(byte chn1) // Управление мультиплексором
{
switch (chn1)
{
case 0: digitalWrite(18, LOW); digitalWrite(19, LOW); break;
case 1: digitalWrite(18, LOW); digitalWrite(19, HIGH); break;
case 2: digitalWrite(18, HIGH); digitalWrite(19, LOW); break;
case 3: digitalWrite(18, HIGH); digitalWrite(19, HIGH); break;
}
}

void enc() // Обработка энкодера
{
currenttime=millis();
if (abs(ltime-currenttime)>50) // антидребезг
{
b=digitalRead(4);
if (b == HIGH && eval<=122) eval=eval+5;
else if (b == LOW && eval>=5) eval=eval-5;
MIDI.sendControlChange(9,eval,1);
ltime = millis();
}

}

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.059 секунд
Работает на Kunena форум