Jump to content
Денис_85

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

Recommended Posts

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

Нашел инфу про 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();
}

}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By jaz240 O_o
      Доброго всем времени суток,так уж вышло что я занимаю музыкой,и у меня есть синтезатор casio 811-ex,но связать его по средством усб с пк невозможно:так как на нём есть только midi вход и выход.Тогда я загорелся этой идеей.Нашел на али дешевый китайский адаптер и заказал его ,когда он ко мне пришёл я был очень разочарован,так как он работал но очень через Очко.Он посылал ошибочные команды на пк,смотрел программой midi-ox,во общем когда я нажимаю клавиши то идут команды без ошибок но когда я нажимаю на педаль сустейна то вместе с педалью нажимается ещё куча других клавиш которые я не трогал так что не берите дешевую китайщину. После долгих мучений мне пришла идея сделать самому такой шнур на меге8 но как выяснялось что схем и прошивок таких адаптеров нету я с трудом нашел на каком то сайте не русского происхождение этот переходник там была и с схема и прошивка и исходники так вот собрал я адаптер и о чудо всё заработало как надо команды шли без ошибок и можно было полноценно играть если бы не одно НО из за которого я и прошу помощи,этот переходник грубо говоря тупит в том плане что если midi команд слишком много например я нажал одновременно 10 клавиш и все их 10 одновременно отпустил то клавиши 2-3 остаются нажатыми то есть адаптер, на отключение этих нот,команды не успел передать их а пропустил,но когда я их отпускаю по очереди то всё ок,Может кто та сможет улучшить код или портировать его на более быстрый контроллер или может есть у кого другие предложения как это чудо сделать лучше Очень Очень прошу ????Всё что есть схема прошивка исходники я вылаживаю на яндека диск и здесь если кто то не может посмотреть пишите я могу и на почту скинуть и на другой диск скинуть например на майловский вот ссылка https://yadi.sk/d/aKHsRfh33QLnpL ,у меня пришла мысль на счёт другого контролера но потом понял что дела наверное не в нём так как разобрал китайский адаптер, и увидел что там стоит кварц на 6 Мгц н а на моём адаптере кварц на 16Мгц да и атмега мне кажется быстрее китыйской чёрной капельки,а нормальной карточки з midi портом нету,во общем я зашёл в тупик HELP????????
      USB-MIDI.rar
    • By Adrian_Chevalier
      Всем доброго вечера! Произошёл у меня один страшный нежданчик и вот даже не знаю куда обратиться с этим вопросом. Решил создать тему здесь, в надежде, что на данном форуме есть люди, разбирающиеся в такого рода технике, как midi-клавиатуры (так же надеюсь, что тему поместил в правильный раздел).

      Я давно занимаюсь музыкой и имеется у меня midi-клавиатура Axelvox key49w. Ей около 7 лет. По различным причинам я не музицировал последнее время и к ней не прикасался год-полтора, она у меня просто стояла всё это время дома. Никаких с ней проблем не было, я просто пропылесосил всё внутри, почистил от пыли, кошачьей шерсти ну и поставил её в полностью рабочем виде. Недавно решил снова заняться творчеством, достал значит клаву и обнаружил, что некоторые клавиши не нажимаются вообще, некоторые при нажатии с любой силой едва прослушиваются с велосити 20-40% где-то, а некоторые как не нажми орут с велосити 100% и выше. Разобрал, посмотрел... на вид всё целое вроде как, пропылесосил, протер снова - толку ноль. Пробовал водить фольгой от шоколадки по плате - все ноты работают, но с разным велосити (не знаю почему, уж какая там чувствительность у фольги, тем более, что я ей водил, а не нажимал ничего). Пробовал стёркой по плате с контактами проходиться, пробовал карандашом мягким натирать - всё без толку. Принцип я так понял, что практически тот же, что и у пульта простого от любой техники, единственное только, что у каждой кнопки по 2 контакта - здесь же чувствительность к нажатию. Понятно только то, что скорее всего дело в контактах, но вот что теперь мне с ней делать даже и не знаю. Судя по тому, что пишут в инете и что мне объяснил один мой друг - дело может быть в потере токопроводящих свойств резины, на которую давят клавиши. Но с чего бы вдруг? Износа тут никакого нет, ибо я пользовался аккуратно и не каждый день на ней бренчал все эти годы. В общем не знаю... Может стоит испытать какой-нибудь токопроводящий клей/маркер/лак? Но вдруг дело не в этом. Тем более что с фольгой она так же звучала по-разному. Мыть с мылом резинки пока не пробовал, хотя видел такой совет в инете. Может быть есть здесь люди, кто сталкивался с подобной проблемой, кто имеет опыт в этом... Подскажите пожалуйста что можно сделать и в чём может быть дело. Обидно, что вроде как рабочий агрегат теперь просто стоит мёртвым грузом из-за этих проблем с велосити. Только захотелось вернуться к творчеству, а тут такой облом...

      Всех заранее благодарю за любую помощь!




    • By Lanrus
      Доброго настроения.
      Была рабочая клавиатура Fatar TB49, сгорел процессор с маркировкой  zilog 1138 fatar k5 9411 судя по цоклевке процессора и организации схемы это наверно аналог 8048 или 8051. Процессор такой уже не найти, есть мысль прикрутить вместо него at89s53, ищу  примеры законченных текстов на си для подобных устройств (midi клавиатур) с измерением скорости нажатия и временные характеристиках для клавиатуры fatar. Если у кого есть опыт или тексты программ, ссылки на ресурсы с примерами прошу поделиться.
    • By activik
      Всем привет! Ситуация следующая:
      Электронное пианино KURZWEIL, на нем пропал звук, сгорел ЦАП и унес за собой часть процессора с которой выходит цифровой сигнал на цап. По миди остался сигнал и очень хорошо работает. Возможно ли собрать миди преобразователь или наверняка уже есть платы которые преобразуют миди сигнал в аудио сигнал, чтобы можно было подать данный сигнал на усилитель инструмента без каких либо внешних звуковых карт.
    • By Arthur
      Короче есть такая задумка, и не плохо было бы её воплотить в жизнь. Вот такая вот кнопка (чем то похожа на кнопку пианинки (почти xD)) под этой кнопкой расположен пьезодатчик который регистрирует силу удара этой кнопки по нему, т.е. чем сильнее стукнет кнопка по пьезо датчику тем сильнее будет считаться нажатие. сбоку у этого устройства имеются две кнопки "-" и "+" которые выбирают ноту по октавной системе (до, ре, ми, фа, соль, ля, си) и всё это передаётся по MIDI каналу, даже желательно бы по USB(MIDI) но с усб придется ещё драйвер писать для этой кнопки что усложняет задачу. Вопрос такой, протокол MIDI он сложный и как всё это осуществить на одном МК, из рода AVR? Впринципе пьезодатчик думаю повесить на встроенный в мк АЦП, хотя можно обойтись несколькими компораторами. Но итог всё равно, как организовать этот MIDI интерфейс, и плюс еще выбор ноты.
×
×
  • Create New...