Как сделать дешевый MIDI контроллер на базе Arduino своими руками. Информационный портал по безопасности

Индикатор нажатия клавиш

Используем цветную светодиодную ленту для индикации номера и силы нажатия клавиши синтезатора.

Понадобится:

midi-ledStrip.ino #include #include #ifdef __AVR__ #include #endif // Светодиодная лента подключена к пину 11 #define PIN 11 // Она состоит из 50 светодиодов #define NUMPIXELS 50 // Создаём объект для управления лентой Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800) ; // Создаём объект для связи по MIDI через Serial1 MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, myMidi) ; // Вспомогательные переменные int r, g, b, pitchPot; // Функция, пересчитывающая оттенок в RGB. // Подробности: http://сайт/projects:christmastree void f_HSV_to_RGB(int hue, int sat, int val) { int base; if (sat == 0 ) { r = val; g = val; b = val; } else { base = ((255 - sat) * val) >> 8 ; switch (hue / 60 ) { case 0 : { r = val; g = (((val - base) * hue) / 60 ) + base; b = base; break ; } case 1 : { r = (((val - base) * (60 - (hue % 60 ) ) ) / 60 ) + base; g = val; b = base; break ; } case 2 : { r = base; g = val; b = (((val - base) * (hue % 60 ) ) / 60 ) + base; break ; } case 3 : { r = base; g = (((val - base) * (60 - (hue % 60 ) ) ) / 60 ) + base; b = val; break ; } case 4 : { r = (((val - base) * (hue % 60 ) ) / 60 ) + base; g = base; b = val; break ; } case 5 : { r = val; g = base; b = (((val - base) * (60 - (hue % 60 ) ) ) / 60 ) + base; break ; } case 6 : { r = val; g = 0 ; b = base; break ; } } } } // Обработчик события NoteOn. Эта функция будет вызвана автоматически при // при приёме сообщения NoteOn по MIDI-входу. void handleNoteOn(byte channel, byte pitch, byte velocity) { // Velocity имеет значение от 0 до 127 // Чтобы не снижать диапазон значений оттенка цвета (0-255), // мы сдвигом влево умножаем силу нажатия на 2. byte doubleVelocity = velocity << 1 ; // Переводим оттенок в RGB f_HSV_to_RGB(doubleVelocity, 255 , 255 ) ; // Номер ноты имеет значение от 0 до 127, // а светодиодов всего 50. Чтобы лента отображала ноты // в нужном интервале, подкрутим ленту под нужные ноты потенциометром. // Чтение значения с потенциометра происходит в loop(); int activePitch = pitch - pitchPot; // Устанавливаем цвет светодиода в нужную позицию... pixels.setPixelColor (activePitch, pixels.Color (r, g, b) ) ; // ... и зажигаем ленту. pixels.show () ; } // Обработчик события NoteOff. Эта функция будет вызвана автоматически при // при приёме сообщения NoteOff по MIDI-входу. // Подробнее: http://arduinomidilib.fortyseveneffects.com/a00022.html void handleNoteOff(byte channel, byte pitch, byte velocity) { // Гасим светодиод, который был зажжён от NoteOn int activePitch = pitch - pitchPot; pixels.setPixelColor (activePitch, pixels.Color (0 , 0 , 0 ) ) ; pixels.show () ; } void setup() { // Инициализируем светодиодную ленту... pixels.begin () ; // ... и гасим все светодиоды pixels.show () ; // Присоединяем обработчик события NoteOn myMidi.setHandleNoteOn (handleNoteOn) ; // Присоединяем обработчик события NoteOff myMidi.setHandleNoteOff (handleNoteOff) ; // Инициализируем MIDI-интерфейс на прослушку всех // MIDI-каналов. myMidi.begin (MIDI_CHANNEL_OMNI) ; } void loop() { // Здесь мы просто вызываем MIDI.read, // остальное библиотека сделает сама myMidi.read () ; // Считаем значение с потенциометра. // Нам нужно значение в диапазоне (0-127), // его можно получить из диапазона (0-1024) сдвигом на 3 бита вправо pitchPot = analogRead(A4) >> 3 ; }

В очередной раз играя на гитаре и управляя звуком через Peavey ReValver и прочие Amplitube, задумался о приобретении MIDI-контроллера. Фирменные устройства, вроде Guitar Rig Kontrol 3, стоят около 13 000 рублей, и обладают только напольным исполнением. То есть оперативно менять положения нескольких регуляторов весьма проблематично.

Различные контроллеры DJ направленности выглядели интереснее за счет обилия фейдеров и энкодеров. Решено было совместить приятное с полезным и сделать MIDI-контроллер самому.

Начальные требования: 2-7 фейдеров, столько же роторных потенциометров/энкодеров, около 10 кнопок, подключение по USB.

Далее стал выбирать компоненты. Arduino выбрал по причине наличия, в принципе можно использовать ту же ATmega32u4, STM, либо другой контроллер. Фейдеры и кнопки нашел в местном радиомагазине. Энкодер и потенциометры уже были когда-то куплены. Тумблеры нашел в гараже. Корпус решил изготовить из верхней крышки DVD плеера.

Комплектующие:

  • Arduino UNO R3 1 шт.
  • Фейдеры сп3-25а 5 шт.
  • Рот. потенциометры 3 шт.
  • Энкодер 1 шт.
  • Кнопки pbs-26b 16 шт.
  • Крышка от DVD 1 шт.
  • Тумблеры 2шт.

Сначала согнул корпус и пропилил в нем бормашиной отверстия под фейдеры:

Затем просверлил отверстия для тумблеров и рот. потенциометров, разметил положение кнопок. Так как сверла на 19 (да и соответствующего патрона для дрели) у меня не было, то отверстия для кнопок сверлил на 13, а затем увеличивал разверткой.

Основа готова, теперь можно думать, как подключать все это добро к Arduino. Во время изучения данного вопроса наткнулся на замечательный проект HIDUINO . Это прошивка для ATmega16u2 на борту Arduino, благодаря которой устройство определяется как USB-HID MIDI device. Нам остаётся только отправлять данные MIDI по UART со скоростью 31250 бод. Чтобы не захламлять исходники дефайнами с кодами MIDI событий, я воспользовался этой библиотекой .

Так как я использовал Arduino, то решил сделать шилд, к которому уже и будут подключаться вся периферия.
Схема шилда:

Как видно из схемы кнопки подключил по матричной схеме. Задействованы встроенные подтягивающие резисторы ATmega328, поэтому логика инверсная.

Инициализация кнопок

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); }

Считывание значений

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




Забыл разместить на печатке диоды, пришлось подпаивать к кнопкам.

Потенциометры подключены через мультиплексор 4052b к вводам АЦП.

Считывание положений потенциометров

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


Энкодер повесил на аппаратное прерывание.

Считывание энкодера

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(); } }


Печатную плату развёл в Sprint layout, Затем изготовил старым добрым ЛУТ"ом с использованием самоклеющейся плёнки и хлорного железа. Качество пайки страдает от ужасного припоя.

Готовый шилд:



Для заливки прошивки в ATmega32u4 я кратковременно замыкал 2 пина ICSP, затем использовал Flip . В дальнейшем подключил к этим пинам кнопку.

Прошивка работает, осталось прикрутить стенки и лицевую панель. Так как я размечал все по месту, то на рисование панели времени ушло больше, чем на всё остальное. Выглядело это так:

  • 1. В качестве фона картинки выставлялась миллиметровка
  • 2. Размечались отверстия
  • 3. Полученное выводилось на печать
  • 4. Вырезались все отверстия
  • 5. Откручивались и снимались все элементы
  • 6. Устанавливалась панель, устанавливались на места все кнопки/потенциометры
  • 7. Отмечались несоответствия шаблона и корпуса
  • 8. Переход к пункту 2, пока все отверстия не совпадут
Панель изготовлена из миллиметрового ПЭТ, покрытого плёнкой с принтом и ламинированием, отверстия вырезались лазером по cdr файлу. У иркутских рекламщиков все это обошлось мне всего в 240 рублей.

Боковые стенки выпилил из фанеры.

Вид устройства на текущий момент:

Стоимость комплектующих:

  • Arduino UNO R3 320 р.
  • Фейдеры сп3-25а 5х9=45 р.
  • Рот. потенциометры + ручки 85 р.
  • Энкодер 15 р.
  • Кнопки pbs-26b 16х19=304 р.
  • Панель 240 р.
  • Мультиплексор 16 р.
  • Фанера, текстолит, тумблера, корпус от DVD - в моём случае бесплатно.
Итого: 1025 руб.

Контроллер справляется с возложенными на него задачами и рулит звуком практически в любой программе аудио обработки.

В планах покрыть фанеру морилкой и вырезать из оргстекла нижнюю крышку. Так же добавить порт расширения для подключения напольного контроллера.

Код для Arduino и печатка на гитхабе.

В очередной раз играя на гитаре и управляя звуком через Peavey ReValver и прочие Amplitube, задумался о приобретении MIDI-контроллера. Фирменные устройства, вроде Guitar Rig Kontrol 3, стоят около 13 000 рублей, и обладают только напольным исполнением. То есть оперативно менять положения нескольких регуляторов весьма проблематично.

Различные контроллеры DJ направленности выглядели интереснее за счет обилия фейдеров и энкодеров. Решено было совместить приятное с полезным и сделать MIDI-контроллер самому.

Начальные требования: 2-7 фейдеров, столько же роторных потенциометров/энкодеров, около 10 кнопок, подключение по USB.

Далее стал выбирать компоненты. Arduino выбрал по причине наличия, в принципе можно использовать ту же ATmega32u4, STM, либо другой контроллер. Фейдеры и кнопки нашел в местном радиомагазине. Энкодер и потенциометры уже были когда-то куплены. Тумблеры нашел в гараже. Корпус решил изготовить из верхней крышки DVD плеера.

Комплектующие:

  • Arduino UNO R3 1 шт.
  • Фейдеры сп3-25а 5 шт.
  • Рот. потенциометры 3 шт.
  • Энкодер 1 шт.
  • Кнопки pbs-26b 16 шт.
  • Крышка от DVD 1 шт.
  • Тумблеры 2шт.

Сначала согнул корпус и пропилил в нем бормашиной отверстия под фейдеры:

Затем просверлил отверстия для тумблеров и рот. потенциометров, разметил положение кнопок. Так как сверла на 19 (да и соответствующего патрона для дрели) у меня не было, то отверстия для кнопок сверлил на 13, а затем увеличивал разверткой.

Основа готова, теперь можно думать, как подключать все это добро к Arduino. Во время изучения данного вопроса наткнулся на замечательный проект HIDUINO . Это прошивка для ATmega16u2 на борту Arduino, благодаря которой устройство определяется как USB-HID MIDI device. Нам остаётся только отправлять данные MIDI по UART со скоростью 31250 бод. Чтобы не захламлять исходники дефайнами с кодами MIDI событий, я воспользовался этой библиотекой .

Так как я использовал Arduino, то решил сделать шилд, к которому уже и будут подключаться вся периферия.
Схема шилда:

Как видно из схемы кнопки подключил по матричной схеме. Задействованы встроенные подтягивающие резисторы ATmega328, поэтому логика инверсная.

Инициализация кнопок

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); }

Считывание значений

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




Забыл разместить на печатке диоды, пришлось подпаивать к кнопкам.

Потенциометры подключены через мультиплексор 4052b к вводам АЦП.

Считывание положений потенциометров

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


Энкодер повесил на аппаратное прерывание.

Считывание энкодера

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(); } }


Печатную плату развёл в Sprint layout, Затем изготовил старым добрым ЛУТ"ом с использованием самоклеющейся плёнки и хлорного железа. Качество пайки страдает от ужасного припоя.

Готовый шилд:



Для заливки прошивки в ATmega32u4 я кратковременно замыкал 2 пина ICSP, затем использовал Flip . В дальнейшем подключил к этим пинам кнопку.

Прошивка работает, осталось прикрутить стенки и лицевую панель. Так как я размечал все по месту, то на рисование панели времени ушло больше, чем на всё остальное. Выглядело это так:

  • 1. В качестве фона картинки выставлялась миллиметровка
  • 2. Размечались отверстия
  • 3. Полученное выводилось на печать
  • 4. Вырезались все отверстия
  • 5. Откручивались и снимались все элементы
  • 6. Устанавливалась панель, устанавливались на места все кнопки/потенциометры
  • 7. Отмечались несоответствия шаблона и корпуса
  • 8. Переход к пункту 2, пока все отверстия не совпадут
Панель изготовлена из миллиметрового ПЭТ, покрытого плёнкой с принтом и ламинированием, отверстия вырезались лазером по cdr файлу. У иркутских рекламщиков все это обошлось мне всего в 240 рублей.

Боковые стенки выпилил из фанеры.

Вид устройства на текущий момент:

Стоимость комплектующих:

  • Arduino UNO R3 320 р.
  • Фейдеры сп3-25а 5х9=45 р.
  • Рот. потенциометры + ручки 85 р.
  • Энкодер 15 р.
  • Кнопки pbs-26b 16х19=304 р.
  • Панель 240 р.
  • Мультиплексор 16 р.
  • Фанера, текстолит, тумблера, корпус от DVD - в моём случае бесплатно.
Итого: 1025 руб.

Контроллер справляется с возложенными на него задачами и рулит звуком практически в любой программе аудио обработки.

В планах покрыть фанеру морилкой и вырезать из оргстекла нижнюю крышку. Так же добавить порт расширения для подключения напольного контроллера.

Код для Arduino и печатка на гитхабе.

Большинство статей в интернете по изготовлению MIDI клавиатур, контроллеров, пультов и т.п. основываются на использовании MIDI-разъемов, подключение которых к современному компьютеру может оказаться проблематично. На старых звуковых картах был Game-порт, к которому можно было подключить джойстик или MIDI-устройство:

Однако, все новые материнские платы идут с встроенным звуковым контроллером, да и на звуковых картах зачастую отсутствует возможность подключения MIDI-устройств.
Остается либо покупать современную MIDI-клавиатуру, ди-джейский пульт и т.п. с USB выходом подключения к компьютеру, либо покупать/паять переходник, или же покупать специальную звуковую карту с возможностью подключения MIDI-устройств. Купить конечно не проблема, но мы же на этом сайте не для этого собрались, верно?

В данной статье я хочу показать, как можно на недорогом контроллере Arduino изготовить простейшую MIDI-клавиатуру с USB-подключением на 8 клавиш и колесом прокрутки.

Итак, я использовал:
контроллер Arduino UNO
8 шт. кнопок
8 резисторов 10 кОм
поворотный энкодер 25LB22-Q
макетная плата и перемычки

Схема подключения следующая:

Для подключения я использовал самый простейший вариант: 1 клавиша - 1 вход. Однако при большем числе клавиш, различных контролеров и т.п. входов может не хватить, поэтому придётся задействовать считывание данных либо через аналоговые входы (путем добавления резисторов разного номинала), либо путем мультиплексирования. Однако, если повесить несколько клавиш на аналоговый вход, то могут возникнуть проблемы со считыванием состояния, когда нажаты одновременно несколько клавиш. Поэтому, на мой взгляд мультиплексирование более приемлемый вариант.

Программное обеспечение Arduino

Структуру MIDI-данных я не буду рассматривать, т.к. это описано в статье:

Энкодер подключен к входам аппаратного прерывания, описание работы с ним я рассматривать не буду, т.к. программа проста и взята с официального сайта Arduino.

В данном проекте энкодер используется как колесо прокрутки для изменения модуляции (modulation wheel), однако его можно переназначить и для других целей (pitch bend и т.п.).

MIDI-данные от энкодера, с Arduino посылаются следующей строкой:
noteOn(0xB0, 0x01, encoder0Pos);
где 0xB0 - сообщение контроллера (control change)
0x01 - код контроллера (в нашем случае Modulation)
encoder0Pos - значение контроллера (в нашем случае 0-127).
Меняя коды контроллера вы можете использовать колесо прокрутки (энкодер) для самых разных контроллеров.

Отдельно стоит упомянуть Pitch Bend. Из спецификации MIDI следует, что необходимо послать сообщение из трех байт: 0xE0 (код Pitch Bend), MSB (старший байт), LSB (младший байт).

Два крайних байта хранят 14-битное значение pitch которое может лежать в пределах 0...16383 (0x3FFF). Середина находится 0x2000, все что выше этого значения - происходить изменение высоты тона вверх, если ниже, то высота тона изменяется вниз.
В коде программы я закомментировал строчки если вы вдруг вместо modulation захотите использовать Pitch Bend (середина значения, разложение на 2 байта и др.)

Код определения нажатия клавиши включает в себя три состояния: клавиша нажата, клавиша удерживается и клавиша отпущена. Сделано это для того, чтобы можно было передавать значение длительности нажатия клавиши. Если это не нужно, то можно оставить только одно состояние (нажатие клавиши), программа в данном случае существенно упростится.
Для обработки состояния каждой из восьми клавиш, используется следующий код:

If (buttonState_C == HIGH && note_C_send_on == false) // Нажатие клавиши { noteOn(0x90, note_C, 0x7F); note_C_send_on = true; // Команда Note On послана note_C_send_off = false; // Команда Note Off не послана } else if (buttonState_C == HIGH && note_C_send_on == true) // Если клавиша удерживается { noteOn(0x00, note_C, 0x7F); note_C_send_on = true; note_C_send_off = false; } else if (buttonState_C == LOW && note_C_send_off == false) // Если клавишу отпустили { noteOn(0x90, note_C, 0x00); note_C_send_on = false; note_C_send_off = true; encoder0Pos = 0; // Возвращаем позицию колеса в ноль } ....... ....... ....... // Функция посылки MIDI-сообщения в последовательный порт void noteOn(int cmd, int pitch, int velocity) { Serial.write(cmd); Serial.write(pitch); Serial.write(velocity); delay(20); }

Обратите внимание, что если будет использоваться pitch bend, то encoder0Pos нужно будет возвращать не в ноль, а в 0x2000 (а лучше задать define в начале программы).

Итак, схема собрана, скетч в контроллер залит, запускаем Serial Monitor, меняем скорость передачи на 115200 и нажимая клавиши или крутя энкодер смотрим значения.
Если все нормально, то переходим к следующей части. Сразу скажу, что для меня она оказалось самой проблемной, и если бы я не нашел виртуального USB -> Midi конвертора, то этой статьи не было бы.

Программное обеспечение ПК (Windows)

Для того, чтобы принимать данные через USB виртуальный COM-порт от Arduino и передавать их в какую-либо программу MIDI-секвенсор, необходима специальная утилита: Serial MIDI Converter V2D (оф. сайт)

Программа мультиплатформенная, у меня заработала под Windows 7 x64, правда с некоторыми тормозами.

Запускаем ее, выбираем порт USB, скорость передачи (115200) и MIDI Input Port и MIDI Output Port.

Теперь, все те MIDI-данные, которые поступают на USB виртуальный СОМ-порт 12 перенаправляются на порт MIDI Yoke 6 (для создания виртуальных MIDI портов я воспользовался программой MIDI Yoke). Можно перенаправить их на Microsoft GS Wavetable Synth и др. порты.
Программа постоянно должна быть включенной. При нажатии клавиш или повороте ручки энкодера, внизу должен мигать индикатор Serial RX.

Для визуального отображения поступающих MIDI данных с порта мне очень пригодилась программа MIDI-OX (оф. сайт):

Обратите внимание, что в настройках MIDI Devices необходимо выставить порт MIDI Input.

Теперь, нажимая клавиши нот или вращая колесо, в Monitor-Output вы увидите MIDI-данные.

Т.о. при помощи программно-аппаратных средств мы получили возможность сделать на контроллере Arduino простейшую MIDI-клавиатуру с передачей данных в компьютер, для последующей их обработки, например в Cubase, в. т.ч. в реальном времени.
На основе данного проекта можно сделать DJ-пульт, полноценную MIDI-клавиатуру и т.п.

Ниже вы можете скачать скетч INO, Serial MIDI Converter V2D, MIDI-OX и MIDI Yoke

Некоторые музыканты, которые разбираются в электронике, или электронщики, которым нравится музицировать, хотели бы подключить своё MIDI-устройство к Arduino, но не знают как это правильно сделать. Данный проект поможет разобраться в этом вопросе.


Для начала немного разберемся, что такое MIDI. MIDI расшифровывается как Musical Instrument Digital Interface или по-русски цифровой интерфейс музыкальных инструментов. В передаваемом коде этого интерфейса могут быть зашифрованы параметры громкости, тональности, темпа и других характеристик музыкальных инструментов. Данные интерфейса MIDI обычно передаются по пятипрошодным шинам с разъемами круглой формы DIN 41524 также с пятью контактами, как показано будет на схеме, приведенной ниже. Стандартная скорость передачи данных такого последовательного интерфейса составляет 31.25 кбит/с. Передача осуществляется однонаправленно, то есть в связанной интерфейсом MIDI системе музыкальные инструменты, например, синтезаторы могут только передавать данные головному устройству, например, пульту управления звуковым окружением или компьютеру. Следует помнить, что данные интерфейса MIDI представляют собой не оцифрованный звук, а команды и значения, например, ноты, параметры звука и т.п.


Необходимые компоненты

  • 5-выводной разъём DIN/MIDI – 1 шт.
  • Оптопара 4n35 или аналог – 1 шт.
  • Диод IN914 или аналог – 1 шт.
  • Резистор 220 Ом – 1 шт.
  • Резистор 560 Ом (можно 220 и 230 в послед.) – 1 шт.
  • Монтажная плата – 1 шт.
  • Arduino – 1 шт.
  • Кабель MIDI – 1 шт.
  • MIDI-устройство – 1 шт.

Схема подключения Arduino к MIDI-устройствам




Схема, созданная с помощью fritzing, довольно подробно показывает соединения компонентов. Всё здесь подключается достаточно просто и легко. В основе схемы мы видим микросхему оптической гальванической развязки. Эта оптопара нужна для гальванической развязки линии MIDI от схемы Arduino. Без неё можно сжечь вход Arduino. В данном случае была взята оптопара серии 4n35, состоящая из светодиода и фототранзистора, впрочем, вместо нее подойдет любой другой оптрон со схожими характеристиками.


Будьте внимательны при подключении диода, соблюдайте полярность. Данная схема была создана с учетом стандартов и характеристик интерфейса MIDI. Оригина схемы можно найти здесь http://www.midi.org/techspecs/electrispec.php


Код (скетч для Arduino)


Это простой скрипт взаимодействия с MIDI с использованием библиотеки MIDI.h (скрипт MIDI CALLBACK). Он проверяет, поступил ли сигнал (нота) NoteOn и переходит в соответствующую область обработки. В эту область вы можете вставить свой код.


#include MIDI_CREATE_DEFAULT_INSTANCE(); void handleNoteOn(byte channel, byte pitch, byte velocity) { // место для вашего кода при поступившем сигнале } void handleNoteOff(byte channel, byte pitch, byte velocity) { // место для вашего кода при отсутствии сигнала } void setup() { MIDI.setHandleNoteOn(handleNoteOn); MIDI.setHandleNoteOff(handleNoteOff); MIDI.begin(MIDI_CHANNEL_OMNI); } void loop() { MIDI.read; }