Перейти к содержанию

Миди клавиатура на arduino mega и uno с прошивкой dual moco


Денис_85

Рекомендуемые сообщения

Помоги с ноля скетч полноценный написать.
Данный путь мне кажется очень перспективным

Нашел инфу про 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); //--и подаём на них лог. 1digitalWrite(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; //--Считываем значение с канала Xif (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();
}

}

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...