Вредоносное ПО (malware) - это назойливые или опасные программы,...
It wasn’t user controllable, BUT we learned an essential lesson: How to send a midi signal from an Arduino out of a midi port and to our computer.
Today, we’ll be learning how to make an actual . It can be controlled by knobs (potentiometers), faders, buttons, or in the example we’ll be talking about, switches.
First of all, I want to thank Bharat of Randumb for providing this information. Make sure to checkout his site for more awesome projects.
First, we’ll start by making this midi controller work over usb serial. Once you get that working flawlessly, you can apply the skills learned in my previous article on sending midi signals.
Let me know what you think of this build in the comment section below!
Recommended course : The DIY MIDI Controller Course . If you want to become a master at making your own custom controller, this is the course for you! Packed with 11 action-packed modules that include downloadable images, schematics, sample code, and libraries. Even if you’re a hobby musician that doesn’t know anything about circuitry or programming, this course breaks it down to an understandable sense.
What you need
The hardware needed is pretty basic. If you are going to be converting this project to full-on midi, you’ll additionally need some midi ports.
In this example we are using switches, but feel free to use anything else! Buttons work exactly the same.
An LED, a breadboard, and an enclosure are optional. If you are still in the experimental phase of your midi-mayhem, you can get away without those.
Hardware
- Arduino Uno
- 2x Switches, potentiometers, buttons, or faders
- Spare wires
- (Optional) LED
- (Optional) Bread Board
- (Optional) Enclosure
Software
- Arduino IDE (Link )
- Serial to MIDI converter (Link )
- Midi YOKE Virtual MIDI port (Link )
- MIDI-OX (to monitor midi signals) (Link )
Schematics
Here is the diagram for this project. Keep in mind that the schematic will vary if you decide to implement a midi port into this project.
A breadboard is used in the schematic. Although it is listed as an optional item, I’d still recommend purchasing one. They’re cheap and they make prototyping a hell of a lot easier.
Code
#define LED 13 // LED pin on Arduino board
#define switch1 10 // 1st Switch
#define switch2 9 // 2nd Switch
#define MIDI_COMMAND_CONTROL_CHANGE 0xB0
#define MIDI_COMMAND_NOTE_ON 0x90
#define MIDI_COMMAND_NOTE_OF 0x80
int switch1LastState = 0;
int switch1CurrentState = 0;
int switch2LastState = 0;
int switch2CurrentState = 0;
// the format of the message to send Via serial
uint8_t command;
uint8_t channel;
void blinkLed(byte num) { // Basic blink function
for (byte i=0;i digitalWrite(LED,HIGH); digitalWrite(LED,LOW); pinMode(LED, OUTPUT); pinMode(switch1,INPUT); pinMode(switch2, INPUT); Serial.begin(115200); t_midiMsg midiMsg1; // MIDI message for Switch 1 t_midiMsg midiMsg2; //MIDI message for Swtich 2 switch1CurrentState = digitalRead(switch1); switch2CurrentState = digitalRead(switch2); if (switch1CurrentState == 1){ if(switch1LastState == 0){ midiMsg1.msg.command = MIDI_COMMAND_CONTROL_CHANGE; midiMsg1.msg.channel = 1; midiMsg1.msg.data2 = 1; midiMsg1.msg.data3 = 0; /* Velocity */ /* Send note on */ Serial.write(midiMsg1.raw, sizeof(midiMsg1)); switch1LastState = switch1CurrentState; if (switch2CurrentState == 1){ if(switch2LastState == 0){ midiMsg2.msg.command = MIDI_COMMAND_CONTROL_CHANGE; midiMsg2.msg.channel = 2; midiMsg2.msg.data2 = 2; midiMsg2.msg.data3 = 0; /* Velocity */ /* Send note on */ Serial.write(midiMsg2.raw, sizeof(midiMsg2)); switch2LastState = switch2CurrentState; Like I mentioned earlier, you can apply the knowledge from my to convert this project into a true midi controller. Bharat had an interesting way to turn your Arduino into a midi device without the need of a midi port. Here’s how it works:
Basically, we’re going to be making the Arduino show up as an HID midi device. This is possible by installing midi firmware on your Arduino’s Atmeg8u2 chip. Keep in mind that using this method will be a pain if you plan to go back and revise your code. You’d have to reinstall the previous firmware and then go back to the midi firmware all over again. voilà!!
Hopefully by now your midi controller is fully functioning. Don’t hesitate to leave a comment down below if you can’t get your Arduino midi controller to function properly. I’d be happy to answer! Мне давно хотелось разбудить в себе композитора и начать творить свою собственную электронную музыку. Однако я был (мягко говоря) обескуражен высокими ценами на MIDI контроллеры. Но порыскав по просторам интернета у меня появилась задумка создать собственный контроллер, используя для этого Arduino Uno и токопропроводящие краски! Давайте начнём)
Вы можете слегка отойти от изложенного материала и собранный вами MIDI контроллер все равно будет работать (под «слегка отойти» имею ввиду, что можете установить резистора с чуть-чуть другим номиналом или оставить один из выводов отключенным). С электроники нам понадобится: Кроме электроники, также потребуются следующие инструменты: Создание платы начнём с припаивания штырей. Разместим согнутые штырьки
в центре первого ряда на плате. Они в последующем будут служить «чувствительными» выводами, к которым будет подсоединяться клавиатура. После установки штырей, обратите внимание – короткие выводы торчат из платы. Надавливаем на них, чтобы всё зашло заподлицо. Теперь припаиваем их и сразу проверяем места соединений на предмет короткого замыкания. Примечание: Не припаивайте штырьки слишком долго, иначе они разогреются и расплавят пластик.
Для следующего этапа, расположим прямые гребёнки в слотах Arduino
. Установимповерх штырей, что вставлены в Arduino, плату. Данное действие потребовало приложения небольшого усилия, поскольку штыри не идеально отцентрованы относительно отверстий платы. После того, как успешно установили плату на штырях, убедитесь, что выводы находятся заподлицо с верхним краем платы. После чего их можно запаять. Теперь удалим плату с Arduino и перевернём её на обратную сторону. Напаяем перемычки, на которые в дальнейшем будут крепится компоненты. Есть два способа сделать это: Советую использовать второй метод, поскольку он проще и быстрее. Если вы выберете этот метод, расположите проволоку на плате, как на изображении. Как вы можете видеть, немного испортил нижний левый угол, когда нанёс слишком много припоя, поэтому будьте внимательны! Совет: Если у вас нет тонкой проволоки, используйте обрезки выводов используемых резисторов.
Устанавливаем компоненты, а именно 2.7
MОм
резисторы
, которые будут выполнять сенсорно-ёмкостные функции. Примечание: Если вы хотите узнать больше о теоретических основах и практическом применении сенсорно-ёмкостных датчиков, советую ознакомится со следующими ссылками:
Расположим один 2.7
MОм
резистор
снизу самого правого согнутого штыря и протолкнём ножки через отверстия (как на первом изображении). Теперь перевернём плату и протолкнём один вывод резистора обратно в следующее отверстие (как показано на втором изображении). Припаяем нижнюю ногу резистора к отверстию, а верхнюю ногу резистора к выводу штыря. После чего прикрепим 7
cm провод
на этот штырь (как видно с третьего изображения). Повторим процесс со всеми резисторами и проводами, припаяв их на места. Нижнее ножки резисторов должны сформировать одно длинное соединение. Совет
: Выбирайте чередующееся цвета для проводов — это позволит проще производить соединение в последующих шагах.
Начнём с размещения кнопок и резисторов на плате, как на первом и втором изображениях. В моём случае использовал 2.2
кОм резисторы
, но можно использовать любой резистор со значением между 2кОм и 10кОм. Перевернём плату и припаяем всё на свои места. Изображение 3 объясняет, какие различные соединения вам нужно будет сделать: Если всё спаяно правильно, две самые левые кнопки позволят изменять октавы
, в то время как самая правая кнопка позволит включать
LDR сенсор.
После того, как кнопки припаяны, продолжаем монтаж LDR, LED и соответствующих резисторов. Перед тем, как сделать это, будет мудро поэкспериментировать со значениями номиналов резисторов, что будут идти к LED. Возможно мой номинал слишком большой для включения вашего светодиода. Поэкспериментируйте немного, чтобы найти правильное значение резистора. Совет: Любой резистор в интервале между 330
Ом и 5
кОм
будет хорошим решением для 5
mm
LED.
Теперь расположим LED, LDR и резисторы (4.7
K для
LDR
) в нужных местах. Перевернём плату и припаяем всё. Третье изображение пояснит, какие различные соединения следует выполнить: Примечание: Перед припаиванием LED, убедитесь в том, что полярность светодиода верная. Положительный вывод LED следует соединить с резистором, а отрицательный вывод с землей.
Сейчас хорошее время протестировать удачно ли пропаяны соединения кнопок, LDR и LED. Это последняя возможность исправить ошибки, советую вам загрузить прикрепленный код и запустить программу. и загрузите Arduino_Test_Fixture_Code
на плату Arduino. Если всё удачно и тест завершён, можете двигаться к следующему шагу. Если нет, еще раз проверьте пропаянные соединения на плате. Мультиметр лучше держать под рукой, говорю это по своему личному горькому опыту. Начнём с монтажа проводов в отверстия, как видно с первого изображения. В этом шаге удобно использовать два провода разных цветов. Перевернём плату и отрежем провода нужной длины. Припаяем их к штырям, что заходят в разъемы Arduino. Прежде чем начать использовать
MIDI контроллер, сначала нужно протестировать его соединения с помощью тестового скетча . Загрузите скетч, откройте последовательный порт и прикоснитесь к «чувствительным» штырям на плате. Если вы увидите текст ‘Note x is active’ для каждого штыря, во время касания, все выводы работают корректно. После того, как плата готова, пришло время преобразовать Arduino в MIDI контроллер, который будет распознаваться музыкальными программами, такими как Ableton и Fl Studio или даже другими MIDI устройствами. Процесс состоит из двух шагов: Начнём с первого пункта. По условию в Arduino загружена прошивка
usb-последовательный порт
, что позволяет Arduino обмениваться сообщениями с ПК и Arduino IDE. С новой программой DualMoco
, добавиться второй режим, что позволит Arduino выступать в роли MIDI устройства
. Будем использовать программу FLIP и следуя инструкции изменим прошивку Arduino. Работоспособный файл вы найдете в архиве в папке Firmware — файл DualMoco.hex. После загрузки новой прошивки, переподключите Arduino к ПК. Если всё пройдёт успешно, Arduino не должен будет обнаруживаться Arduino IDE, потому что новая программа находится в режиме (MIDI
mode
). Откройте музыкальную программу, что способна записывать MIDI и проверьте, чтобы Arduino с именем MIDI
/
MOCO
for
LUFA
отображалась над MIDI настройками, как вы можете видеть на 1-ом изображении. Особенность DualMoco
в том, что у неё есть второй режим — usb-последовательный порт
, что позволяет загружать скетчи с Arduino IDE, точно также, как при обычной прошивке. Чтобы перевести Arduino во второй режим, соедините два ISCP вывода вместе, как показано на 1 и 2 изображении. Вы можете либо использовать кусочек провода или маленькую перемычку, как показано на изображениях. Теперь отключите USB кабель на несколько секунд от Arduino и переподключите его, Arduino должен обнаружится в Arduino IDE. Примечание: Когда вы захотите переключится из режима
usb-
последовательный порт
в
MIDI режим, удалите перемычку с
ISCP выводов, как показано на третьем изображении и переподключите
Arduino к ПК.
Пришло время загрузить действующий скетч в Arduino, Arduino_
Final_
Code
. Скачайте его, переведите Arduino в usb
—
последовательный порт
режим и загрузите код. Если необходимо точная настройка пороговой величины, поэкспериментируйте со значениями THRESHOLD
и RES
. После того, как все заработает, как и ожидалось, поменяйте текущую строку 17, с: boolean midiMode = false;
// if midiMode = false, the Arduino will act as a usb-to-serial device
boolean midiMode = true;
// if midiMode = true, the Arduino will act as a native MIDI device.
После того, как в код внесены последние изменения, пришло время протестировать музыкальную программу способную поддерживать MIDI устройства. Сначала переведём Arduino в MIDI режим, для этого: Если всё прошло успешно, откройте музыкальную программу и начните прикасаться к штырькам. Магические звуки должны зазвучать….
После того, как плата для Arduino полностью завершена, пришло время сфокусироваться на клавиатуре и способе её подключения к плате. Существуют миллионы вариантов сделать это, но я выбрал скрепки, которые будут закреплены на окрашенной бумаге (их легко закрепить и можно использовать повторно). Процесс припайки скрепок к проводам довольно прост: Примечание: Скрепки не должны быть покрыты никаким покрытием (краской или пластиком).
Хотя и можно играть на Arduino MIDI клавиатуре только прикасаясь к скрепкам, гораздо интереснее, сделать свой собственный трафарет и использовать его. Раскрасил распечатанный шаблон. Шаблон находится в архиве с проектами. Раскрашивание шаблона довольно простое занятие, только убедитесь в том, что оставляете пространство между линиями и используете соответствующие краски, иначе ничего работать не будет. После того, как краска высохнет, закрепите скрепки на «клавишах» и можете приступать творить музыку. Спасибо за внимание!) Некоторые музыканты, которые разбираются в электронике, или электронщики, которым нравится музицировать, хотели бы подключить своё MIDI-устройство к Arduino, но не знают как это правильно сделать. Данный проект поможет разобраться в этом вопросе. Для начала немного разберемся, что такое MIDI. MIDI расшифровывается как Musical Instrument Digital Interface или по-русски цифровой интерфейс музыкальных инструментов. В передаваемом коде этого интерфейса могут быть зашифрованы параметры громкости, тональности, темпа и других характеристик музыкальных инструментов. Данные интерфейса MIDI обычно передаются по пятипрошодным шинам с разъемами круглой формы DIN 41524 также с пятью контактами, как показано будет на схеме, приведенной ниже. Стандартная скорость передачи данных такого последовательного интерфейса составляет 31.25 кбит/с. Передача осуществляется однонаправленно, то есть в связанной интерфейсом MIDI системе музыкальные инструменты, например, синтезаторы могут только передавать данные головному устройству, например, пульту управления звуковым окружением или компьютеру. Следует помнить, что данные интерфейса MIDI представляют собой не оцифрованный звук, а команды и значения, например, ноты, параметры звука и т.п. Необходимые компоненты
Схема подключения Arduino к MIDI-устройствам
Схема, созданная с помощью fritzing, довольно подробно показывает соединения компонентов. Всё здесь подключается достаточно просто и легко. В основе схемы мы видим микросхему оптической гальванической развязки. Эта оптопара нужна для гальванической развязки линии MIDI от схемы Arduino. Без неё можно сжечь вход Arduino. В данном случае была взята оптопара серии 4n35, состоящая из светодиода и фототранзистора, впрочем, вместо нее подойдет любой другой оптрон со схожими характеристиками. Будьте внимательны при подключении диода, соблюдайте полярность. Данная схема была создана с учетом стандартов и характеристик интерфейса MIDI. Оригина схемы можно найти здесь http://www.midi.org/techspecs/electrispec.php Код (скетч для Arduino)
Это простой скрипт взаимодействия с MIDI с использованием библиотеки MIDI.h (скрипт MIDI CALLBACK). Он проверяет, поступил ли сигнал (нота) NoteOn и переходит в соответствующую область обработки. В эту область вы можете вставить свой код. В очередной раз играя на гитаре и управляя звуком через Peavey ReValver и прочие Amplitube, задумался о приобретении MIDI-контроллера. Фирменные устройства, вроде Guitar Rig Kontrol 3, стоят около 13 000 рублей, и обладают только напольным исполнением. То есть оперативно менять положения нескольких регуляторов весьма проблематично. Различные контроллеры DJ направленности выглядели интереснее за счет обилия фейдеров и энкодеров. Решено было совместить приятное с полезным и сделать MIDI-контроллер самому. Далее стал выбирать компоненты. Arduino выбрал по причине наличия, в принципе можно использовать ту же ATmega32u4, STM, либо другой контроллер. Фейдеры и кнопки нашел в местном радиомагазине. Энкодер и потенциометры уже были когда-то куплены. Тумблеры нашел в гараже. Корпус решил изготовить из верхней крышки DVD плеера. Комплектующие: Сначала согнул корпус и пропилил в нем бормашиной отверстия под фейдеры: Затем просверлил отверстия для тумблеров и рот. потенциометров, разметил положение кнопок. Так как сверла на 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();
}
}
Готовый шилд: Для заливки прошивки в ATmega32u4 я кратковременно замыкал 2 пина ICSP, затем использовал Flip . В дальнейшем подключил к этим пинам кнопку. Прошивка работает, осталось прикрутить стенки и лицевую панель. Так как я размечал все по месту, то на рисование панели времени ушло больше, чем на всё остальное. Выглядело это так: Боковые стенки выпилил из фанеры. Вид устройства на текущий момент:
Стоимость комплектующих: Контроллер справляется с возложенными на него задачами и рулит звуком практически в любой программе аудио обработки. В планах покрыть фанеру морилкой и вырезать из оргстекла нижнюю крышку. Так же добавить порт расширения для подключения напольного контроллера. Код для Arduino и печатка на гитхабе.Turning your Arduino into an actual midi device
Final Notes
Шаг 1: Подбор деталей
Шаг 2: Припаиваем штыри
Шаг 3: Напаиваем перемычки
Шаг 4: Припаиваем сенсорно-ёмкостные резисторы
Шаг 5: Припаиваем кнопки
Шаг 6: Припаиваем LDR и LED
Шаг 7: Тестируем все соединения
Шаг 8: Завершение работы с платой
Шаг 9: Преобразуем Arduino в MIDI устройство
Шаг 10: Производим последнее приготовления
Шаг 11: Припаиваем скрепки на джампепы
Шаг 12: Закрашиваем шаблон
#include
Начальные требования: 2-7 фейдеров, столько же роторных потенциометров/энкодеров, около 10 кнопок, подключение по USB.
Схема шилда:
Забыл разместить на печатке диоды, пришлось подпаивать к кнопкам.
Энкодер повесил на аппаратное прерывание.
Печатную плату развёл в Sprint layout, Затем изготовил старым добрым ЛУТ"ом с использованием самоклеющейся плёнки и хлорного железа. Качество пайки страдает от ужасного припоя.
Панель изготовлена из миллиметрового ПЭТ, покрытого плёнкой с принтом и ламинированием, отверстия вырезались лазером по cdr файлу. У иркутских рекламщиков все это обошлось мне всего в 240 рублей.
Итого: 1025 руб.