Напольный midi контроллер своими руками. Динамическая MIDI клавиатура на PIC16F84. Считывание положений потенциометров

Уже давно для продюсеров и звукорежиссеров MIDI-контроллер стал важным атрибутом, который помогает создавать прекрасную музыку. Виртуальные инструменты всегда звучат особенно, поэтому они являются украшением любой мелодии.

Из-за того, что многие музыканты сильно заботятся о качестве выпускаемых продуктов, возникает вопрос: как же выбрать контроллер типа MIDI? В данной статье будут описаны советы и основные критерии выбора.

Что представляет собой MIDI-контроллер?

В далеких 80-х годах такое устройство, как контроллер, использовалось для того, чтобы музыкант мог управлять работой сразу нескольких синтезаторов с помощью одной клавиатуры. Эта идея имела успех, поэтому приборы данного типа моментально получили распространение. Если тогда приобрести их мог не каждый, то на данный момент контроллеры сильно снизились в цене. Музыканты, звукорежиссеры, авторы песен, исполнители, диджеи - все используют подобные устройства.

Что же собой представляет прибор, который имеет клавиатуру. Она похожа на клавиши пианино и синтезатора. К ней добавлены ручки, различные кнопки и ползунки. При взаимодействии с ними мелодия передается на звуковые модули, которые имеют внешний тип. Речь идет о ноутбуках и других устройствах. Иными словами, контроллеры (большинство из них) не способны самостоятельно издавать звук. Они созданы для регулирования битов, нот и других параметров, воспроизводимых с постороннего устройства (звукового модуля).

Какие плюсы имеет MIDI-контроллер? Самые очевидные: он универсален и портативен. Благодаря ему, можно применять все виртуальные эффекты и управлять современным программным обеспечением. Переносить его легко с помощью, например, сумки для портативного компьютера.

На что обратить внимание при покупке?

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

Для чего контроллер будет использоваться? Прибор, который предназначается для выступлений на сцене, должен иметь материал, стойкий к механическим воздействиям. Учитывая то, что большинство контроллеров сделано из пластика, нужно обращать внимание на металлические варианты. Также необходимо определиться с типом механизма и количеством клавиш. Если их будет слишком много, то есть вероятность перепутать назначение каких-либо во время живого выступления.

Диджею вполне подойдет небольшой MIDI-контроллер. Своими руками его сделать совсем нетрудно, если человек разбирается в электронике. Имеется в виду, что часто диджеи используют самодельные приборы. Более подробно об этом можно прочесть немного ниже. Приобретать же такое устройство нужно с учетом того, что необходимы также рукоятки и ползунки. Без них программа (MIDI-контроллер работает только в паре с ней) не будет выполнять желаемых функций.

В том случае, если музыкант редактирует треки в постели, самолете, машине или другом месте, то главным нюансом при выборе будет портативность. Учитывая, что прибор работает от питания, нужно обратить внимание на те, которые способны заряжаться от шины USB.

MIDI-контроллеры от Pioneer

MIDI-контроллер Pioneer - прибор, который всегда пользовался спросом. На рынке подобной техники данный производитель уже давно в тройке лидеров. Что же отличает «родственные» модели «Пионера» друг от друга? Всего лишь наличие дополнительных функций, которые на панели управления выглядят обычными механическими кнопками. Любой контроллер данной марки имеет отличные джоги. Внешний вид серьезный и элегантный. Внушительные размеры прибора компенсируются его максимальной функциональностью.

Не нужно задаваться вопросом о том, какую модель выбрать. Следует сразу присмотреться к DDJ-T1. Устройство советуют многие Соотношение цены и качества вполне удачное. Панель управления удобная, кнопки нажимаются без проблем, переносится аппарат легко.

Контроллер Novation Launchpad

MIDI-контроллер Novation Launchpad разработан специально для работы с Ableton Live. Устройство подходит как для деятельности на сцене, так и в домашней студии. С ним также будет легко проводить дискотеки. Сетка прибора состоит из 64 кнопок. Он оснащен дополнительными эффектами, а также функциями для работы с программным обеспечением. К компьютеру устройство можно подключить через работает как с семейством «Виндовс», так и с некоторыми другими операционными системами.

MIDI-контроллер своими руками - реальность или миф?

Самодельные MIDI-контроллеры уже давно пользуются спросом. Что необходимо для воплощения задумки в жизнь? Нужна схема, по которой будет происходить спаивание и сборка устройства, бюджет, физик или электрик, разбирающийся в данной сфере.

Помимо знания технической стороны, нужно также задать себе вопрос о том, как много создатель знает о контроллерах. Для правильной сборки устройства, которое оправдает все ожидания, нужно понимать, какую лучше базу использовать, для чего будет собрана модель, а также где необходимо устанавливать панель управления. Вопрос достаточно сложный, но вполне решаемый. На сегодня существует множество уже готовых схем, по которым можно собрать контроллер. Главное - уверенность в задуманном и терпение.

Модель марки Akai

Компания Akai недавно выпустила новый контроллер, который получил название MPC Touch. В отличие от родственных приборов, данный имеет дисплей на 7-дюймов. Это значительно облегчает работу с ним. Отталкиваясь от отзывов, нужно сказать, что именно описываемая модель приводится в пример, когда речь идет о профессиональных контроллерах. Глядя на нее и рассматривая функционал, сразу отпадает вопрос о том, как выбирать подобное устройство. Программное обеспечение работает достаточно быстро и эффективно, проблемы не возникают, а сбои крайне редки.

Единственной недоработкой можно назвать то, что контроллер не способен функционировать без источника питания, так как батареи у него нет. Уже давно на рынке известна марка Akai. MIDI-контроллер ее производства представляет собой мощное и высококлассное устройство, способное выдержать сильные нагрузки. Часто некоторые модели используются на сцене.

Клавиатура предназначена для подключения к внешнему саунд-модулю или компьютеру (при наличии соответствующего интерфейса) с использованием MIDI протокола – для записи музыки в секвенсерную программу или живого исполнения. Количество клавиш в предложенном варианте 48, может быть увеличено без переделки схемы до 64. Отличительной особенностью предлагаемой клавиатуры является чувствительность к силе удара по клавише.

История создания устройства

Некоторое время назад в связи с покупкой квартиры я вынужденно лишился шикарного инструмента, выполнявшего у меня роль MIDI клавиатуры – это была легендарная YAMAHA DX-7. Когда печаль поутихла, во всей остроте и неприглядности встал вопрос: а на чем же работать? Именно в этот момент стараниями моего приятеля в мои загребущие ручонки попала полусобранная схема на КР1816ВЕ39 (по супостатски этот процессор зовется 8048). Схема проста и в сборке, и в наладке, и, главное, подвернулась под руку в нужное время. Клавиатуру я собрал в виде матрицы 8x6, применив КР1533ИД7 и КР1533КП7. Не обошлось и без ложки дегтя – два недостатка этой схемы насмерть убивают все ее достоинства: отсутствие чувствительности к скорости нажатия клавиши (динамики) и колеса PITCH WEEL. Ну, я когда-то программировал на Z-80 (и даже сделал работающий секвенсор) и решил тряхнуть стариной. Z-80 как CPU я решительно отмел, как морально устаревший. Кроме того, не хотелось много паять, и я решил взять за основу этот самый девайс на КР1816ВЕ39, оснастив его еще одним мультиплексором для размыкающих (верхних) контактов клавиш. Я отыскал документацию (вы не поверите – в библиотеке, книга «Проектирование цифровых устройств на однокристальных микропроцессорах») на ассемблер КР1816ВЕ39 и накарябал программу… И тут выяснилось, что у приятеля сдох программатор ПЗУ, и зашить программу просто нечем... От горя я совсем потерял разум и решил переписать тот же алгоритм под PIC. За полдня был спаян программатор (LUDIPIPO), затем макет из панельки, КР1533ИД7 и пары КР1533КП7, а весь монтаж сделан МГТФом без всякой печатки. И процесс пошел…

Сначала был запущен нединамический вариант программы (его я тоже привожу для тех, у кого клавиатура имеет один контакт на клавишу). Потом запустилась динамическая версия. И тут созрела мысль добавить кнопки и индикатор. Дело в том, что у меня без дела давно валялась платка WAVEBLASTER (дочерний wavetable синтезатор для очень старых звуковух). Подключивши ее к моему творению, я получил нечто, на чем можно играть (в меру сил и таланта) без компьютера, что иногда довольно удобно. Это и определило набор функций на кнопках – он может пригодиться при подключении к звуковым модулям при “живой” игре. Функции кнопок легко изменить, написав свои обработчики и используя мои процедуры опроса и индикации. Кое-как собранная в железном корпусе клавиатура оказалась удобнее, чем YAMAHA PSS (все же полноразмерные клавиши, педаль и, главное, динамика!). В разгаре творческого процесса возникло труднопреодолимое желание сделать версию MIDI клавиатуры чисто для компьютера – индикатор и кнопки необязательны, но нужны колеса PITCH WEEL и MODULATION. Некоторое время я с ним боролся, но, в конце концов, сдался и снова включил паяльник. Электронику собрать несложно, с механикой – несколько сложнее, и я начал морщить лоб над устройством колеса. Поразмыслив, я решил отказаться от второго колеса - все равно я никогда не кручу их сразу оба, обычно сначала пишу ноты и pitch, затем дописываю modulation. Не последним соображением было и уменьшение в два раза объема столь любимых мною механических работ. Для менее ленивых я ниже объясню, как почти не усложняя схему сделать два колеса. Чтобы все-таки иметь возможность писать modulation, я решил организовать три режима работы колеса: pitch на 2 полутона, pitch на 1 полутон (удобно), и modulation. Переключать это все можно одной кнопкой, а индицировать режим – парой светодиодов. Чтобы упростить схему, остальные кнопки и индикаторы я ликвидировал, для работы с современными программами-секвенсорами это все не нужно.

Колесо, конечно же, должно быть надето на ось потенциометра, это-то понятно, а вот к чему его подключить? Первой мыслью было использовать одновибратор на таймере 555. Но расчет показал, что будет трудно добиться точности и стабильности измерения длительности импульса при попытке обеспечить приемлемую частоту опроса колеса, ведь процессор в основном занят измерением времени переключения клавиатурных контактов. Остался путь использования аналого-цифрового преобразователя (АЦП). Поскольку у меня использовался Pic16F84 без встроенного АЦП, я вспомнил инженерное прошлое (и родной завод) и сделал АЦП из нескольких резисторов с компаратором (и куска программы). Получилось просто, дешево и довольно точно.

Я привожу обе схемы – и с кнопками, и с колесом, а также программы для них. При желании обе схемы можно легко совместить, слегка изменив адреса внешних устройств, нужно только помнить, что режим CHORUS (STEREO) использует pitch для получения расстройки и его нужно или убрать, или озаботится передачей pitch с расстройкой по каналам.

Итак – собственно клавиатура

Схема устройства

Первым появился нединамический вариант, нечувствительный к силе удара по клавише – для проверки работоспособности макета.

Я использовал PIC16F84 в качестве процессора из нескольких соображений: эта микросхема доступна, дешева и удобно программируется, кроме того – именно она оказалась у меня под руками. Внимание: PIC16C84 не годится - у него ОЗУ всего 36 ячеек и программа не будет работать. Впрочем, схема с колесом использует меньше ячеек ОЗУ и ее программу можно втиснуть и в PIC16C84, сократив еще пару ячеек, например MIDCH (присвоив постоянный MIDI канал всем передаваемым данным).

Схема динамической клавиатуры с индикацией приведена ниже:

Схема во многом традиционна - трудно изобрести велосипед без педалей и колес.J Порт B работает на передачу - младшие 7 бит выводят адрес клавиши в матрице или данные для внешних устройств (индикатор и ЦАП колеса). Старший бит используется для вывода MIDI данных последовательным кодом - преобразование и вывод сделаны программными. Поэтому кварц должен быть на 4 MHz, если вы не хотите переписывать процедуру вывода байта по MIDI. Два младших бита порта A работают на прием - на них поступают сигналы с мультиплексоров “отпущенных” и “нажатых” контактов клавиш, а три старших бита определяют адрес внешнего устройства (через еще один дешифратор КР1533ИД7). В схеме с колесом от дешифратора адреса внешнего устройства я отказался для упрощения схемы и освобождения старшего бита порта PA4 для ввода данных с компаратора, поэтому адреса клавиатуры и кнопок другие. При совмещении схем эту микросхему придется вернуть, для дешифрации адреса использовать биты порта PA2 и PA3,и адресовать 4 устройства: клавиатуру, кнопки, регистр данных динамической индикации и регистр знакоместа динамической индикации. Индикацию режимов колеса придется переписать.

Схема с колесом PITCH WEEL / MODULATION выглядит так:

На каждую клавишу ставится один диод для развязки. Резисторы на входах мультиплексоров не должны быть более 8k, иначе возможны глюки из-за емкости монтажа. Индикатор - любой с общим анодом на 3 разряда, если выводы сегментов каждого разряда выведены отдельно, выводы одноименных сегментов нужно объединить - индикация динамическая и разряды зажигаются последовательно. Кнопки любые, без фиксации, дребезг контактов давится программно. Светодиоды установлены возле одноименных кнопок и индицируют включение соответствующих режимов, кнопки «+» и «- » светодиодов не имеют. Транзисторы на индикаторе любые маломощные высокочастотные обратной проводимости. Два регистра КР1533ИР23 использованы для поочередного защелкивания адреса и кода текущего разряда индикатора (светодиоды тоже сгруппированы в два квазиразряда). У меня использована стандартная клавиатура от еще советских электроорганов на 48 клавиш (она выпускалась и отдельно как радиоконструктор «СТАРТ», и довольно широко распространена). Чтобы уменьшить высоту клавиатуры и толщину инструмента, из шести контактных групп под каждой клавишей оставлено две, и все это обрезано и переклеено. Вообще достаточно одной переключающей группы на клавишу, но так было удобней клеить. Сборные шины “отпущенных” и “нажатых” контактов имеют длину 8 клавиш. При желании можно использовать и клавиатуру, где вместо переключающей группы контактов используется две пары замыкающих контактов – одна пара замыкается в начале движения клавиши, другая в конце (как на инструментах YAMAHA). В этом случае сигнал на PA0 нужно подавать с инверсного выхода мультиплексора (вывод 6). Без изменений в схеме можно использовать клавиатуру на 64 клавиши (стандарт – 61, т.е. 5 октав). При необходимости число клавиш может быть увеличено хоть до 127, для этого в схему нужно ввести еще один дешифратор КР1533ИД7.

Очень важно хорошо отстроить механику - верхние контакты ОБЯЗАТЕЛЬНО должны замыкаться при отпускании клавиш. Если этого не сделать, программа считает такие клавиши нажатыми и пытается их обрабатывать, поэтому повторное нажатие этих клавиш звука не дает. Кроме того, максимальное количество одновременно звучащих нот – 10 (если у кого-нибудь на руках выросло больше пальцев, это количество легко изменить), и не отпущенные клавиши уменьшают это количество. Из этих же соображений число клавиш, указанное в процедуре опроса клавиатуры, должно ОБЯЗАТЕЛЬНО совпадать с количеством реальных клавиш. Дребезг контактов давится программно.

Для резистивной матрицы R-2R АЦП желательно подобрать резисторы с точностью 1–2%, причем абсолютные значения могут быть и другие, важно отношение. Впрочем, сильно увеличивать номинал не стоит, это увеличит время преобразования из-за входной емкости компаратора. Я использовал SMD резисторы без подбора, хотя измерения показали, что в одной монтажной полоске резисторы обычно согласованы с точностью выше 1%. Я уверен, что схема будет работать и с неточными резисторами, но линейность характеристики ухудшится. Само колесо сделано из ручки от старого телевизора и имеет пружинку на оси потенциометра, возвращающую его в среднее положение. Для удобства настройки механики, при включении питания с нажатой кнопкой режима, включается отладочная программа, зажигающая светодиод, когда колесо находится в среднем положении, это позволяет точно настроить нулевой положение колеса на оси потенциометра. Если есть потребность и желание сделать отдельное колесо MODULATION, его нужно подключить к свободному элементу компаратора (их там четыре), причем матрица R-2R у обоих колес общая. Для коммутации выходов компараторов лучше применить дополнительную микросхему, а в качестве управляющего сигнала использовать PA2.

При желании можно собрать динамический вариант клавиатуры и без индикации, кнопок и колеса PITCH WEEL / MODULATION – просто не собирая неиспользуемую часть схемы. Все изменяемые параметры будут установлены по умолчанию при включении питания…

Питать это все можно от чего угодно, ток потребления зависит от конкретного индикатора и не превышает 100 mA. У меня прямо на плате стоит стабилизатор 7805 без радиатора (его хорошо видно на фотографии). Небольшой радиатор нужен, если на него подавать более 9v. Компаратор питается напряжением 9 – 12 v, желательно стабилизированным. Да, я использовал микросхемы советского производства из старых запасов – существует большое количество их современных аналогов, замена возможна и даже желательна – современные аналоги имеют меньшее потребление.

Программа

Алгоритм обработки нажатых клавиш происходит от предложенного в журнале «Микропроцессорные средства и системы» №5 за 1986г. Именно эта публикация (а точнее, ошибка в предложенной программе) и побудила меня к изучению ассемблера. Собственно, оттуда взята лишь идея записывать номер каждой нажатой клавиши в специально выделенную область ОЗУ (CHAN), чтобы при повторном опросе клавиатуры не обрабатывать снова уже обработанную клавишу. У меня под каждую из нажатых клавиш (всего не более 10) отведено две ячейки ОЗУ: в первой записывается номер нажатой клавиши, во второй – ее VELOCITY (скорость нажатия). Повторюсь – этих ячеек всего 20 и начальный адрес задан именем CHAN. Признаком свободной пары является установленный старший бит первой ячейки. Установленный старший бит второй ячейки означает, что NOTE ON для этой клавиши уже передано и в дальнейшей обработке она не нуждается.

Подробно описывать всю программу я не буду, исходник изобилует комментариями и для подготовленного человека вполне доступен. Для остальных я даю сразу готовые прошивки в файле Dinamic.hex и Pitchmod.hex. Поясню только некоторые неочевидные моменты. Ну, прежде всего о динамике: в момент размыкания верхних контактов клавиши ее номер записывается в первую ячейку первой же свободной пары из области CHAN, одновременно сбрасывая признак свободной пары. Во вторую ячейку записывается начальное значение VELOCITY = 127. Чувствительность клавиатуры определяется частотой следования прерываний, так как обработка прерывания уменьшает значения VELOCITY для всех клавиш, NOTE ON которых еще не передано. Прерывания вызываются встроенным таймером. В момент замыкания нижних контактов клавиши в соответствующей ячейке CHAN устанавливается признак «переданности» и передается NOTE ON с текущей VELOCITY. Для улучшения кривой чувствительности уменьшение значений VELOCITY идет по логарифмическому закону: из текущего значения VELOCITY вычитается 1/16 его часть, уменьшенная на 1. Таким образом, во время движения клавиши от верхнего контакта к нижнему значение VELOCITY в соответствующей ячейке CHAN уменьшается по логарифмическому закону, и чем быстрее движется клавиша, тем больше VELOCITY в момент замыкания нижних контактов клавиши и передачи NOTE ON. Прерывания также управляют динамической индикацией, это сделано для устранения мерцания индикатора.
Функции кнопок: TRANSPOSE - все тональности приводятся к любимому ля-минору: диапазон +/- 15 полутонов. PRG назначает тембр (инструмент) для заданного пресета (UP1-UP5), а VOL – его громкость. Текущий параметр выводится на индикатор и может изменяться кнопками «+» и «-».TWIN выводит «двойной» тембр – звучат одновременно один из пресетов (UP1-UP5) и, одновременно пресет LOWER. STEREO выводит звук текущего пресета в правый и левый стереоканалы с небольшой «расстройкой» (эффект «хорус»). Кнопка SPLIT не задействована. Педаль SUSTAIN схемотехнически выполнена, как одна из кнопок, емкость ее провода не должна быть очень большой. Адреса обработчиков кнопок собраны в таблицу в начале программы, при изменении функций кнопок можно подставить свои.

АЦП колеса наполовину программный, работает по алгоритму последовательных приближений, матрица R-2R выполняет преобразование “цифра - аналог”. Вначале на матрицу R-2R подается 1 в старшем разряде, и компаратор определяет, много это или мало. Если мало, в старшем разряде остается 1, если много – 0.Далее то же самое происходит с каждым следующим младшим разрядом (всего 6 шагов) и мы получаем шестибитное число, соответствующее углу поворота колеса. Такая точность мне представляется достаточной, но можно добавить еще один бит, увеличив матрицу и программу преобразования.

Конструкция

В качестве собственно клавиатуры я использовал конструктор «Старт» советского производства, сейчас, пожалуй, легче найти старую неработоспособную Ямаху или Касио, это решит и проблему изготовления корпуса – если он конечно у старого инструмента относительно цел…

Печатная плата не разрабатывалась – я посчитал нецелесообразным для изготовления единичного экземпляра устройства тратить время на разводку и изготовление платы, а макет был изготовлен на монтажной плате с помощью перемычек из МГТФа. В качестве разъема и шлейфа к клавиатуре был использован шлейф от флоппи-дисководов из компьютера с соответствующим разъемом с каждой стороны – это облегчает сборку/разборку готового устройства.

В моем случае корпус был выгнут из тонкой листовой стали (что было под руками) – с деревянными боковинами (как у старых советских инструментов).

Ну вот, вкратце, и все. Творческих успехов!

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Схема №1.
Микроконтроллер PIC16F84 1 В блокнот
Микросхема КР1533ИД7 1 В блокнот
Микросхема КР1533КП7 1 В блокнот
Линейный регулятор

LM7805

1 В блокнот
Диод

КД522А

64 В блокнот
Конденсатор 22 пФ 2 В блокнот
Конденсатор 0.1 мкФ 2 В блокнот
100 мкФ 2 В блокнот
Резистор

220 Ом

2 В блокнот
Резистор

6.8 кОм

8 В блокнот
Кварцевый резонатор 4 МГц 1 В блокнот
Клавишная кнопка 64 В блокнот
Схема №2.
Микроконтроллер PIC16F84 1 В блокнот
Микросхема КР1533ИД7 2 В блокнот
Микросхема КР1533КП7 2 В блокнот
Микросхема КР1533ИР23 2 В блокнот
Линейный регулятор

LM7805

1 В блокнот
Биполярный транзистор

КТ315А

5 В блокнот
Диод

КД522А

80 В блокнот
Конденсатор 22 пФ 2 В блокнот
Конденсатор 0.1 мкФ 2 В блокнот
Электролитический конденсатор 100 мкФ 2 В блокнот
Резистор

180 Ом

7 В блокнот
Резистор

220 Ом

2 В блокнот
Резистор

6.8 кОм

16 В блокнот
Резистор

8 кОм

1 В блокнот
Кварцевый резонатор 4 МГц 1 В блокнот
3-х разрядный светодиодный цифровой индикатор, с общими анодами. 1 В блокнот
Светодиод Красный 12 В блокнот
Клавишный переключатель 64 В блокнот
Кнопка 16 В блокнот
Схема №3.
Микроконтроллер PIC16F84 1 В блокнот
Микросхема КР1533ИД7 1 В блокнот
Микросхема КР1533КП7 2 В блокнот
Компаратор

Большинство статей в интернете по изготовлению 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

В основном статья рассчитана на гитарастов и иже с ними, так как мало кому необходим ножной контроллер, включил доп клаву, забиндил клавиши и вперед. Хотя может вот для диджеев такое управление вполне уместно. Но лучше всего оно подходит для Guitar Rig и TH1. В общем сегодня мы будем собирать нечто похожее на:

И так, для начала необходимо собрать необходимые запчасти. Вот их небольшой список:

Корпус. Первое и самое основное что требуется, сложно найти подходящее. Я прикупил для этого дела чехол для кия.
- USB клавиатура, желательно не очень древняя, ибо возможно распайка не подойдет.
- Клавиши (те, что я подобрал): PBS-16B (ФУТЫ), SPA-101B4 (ДОПЫ), PBS-15B push ON (ВКЛ). Все без фиксации. Приобрести можно в Чип и Дипе.
- Провода. Много одножильных. Я думаю для этого лучше всего подойдет витая пара. 2х метров за глаза. Только разматывать неудобно.
- Ну и паяльник думаю почти у каждого найдется, кто решил собирать сей девайс.
- Инструменты для проделывания отверстий в корпусе. Кто чем горазд, можно хоть саморезом, а потом править ножом, но опять же думаю у всех найдется дрель.

Ну что ж, приступим. Первое что необходимо сделать это наметить и просверлить отверстия в корпусе:

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

Должно получится что-то типа этого:

Сейчас начнется очень ювелирный процесс по пайке к контроллеру от УСБ клавиатуры. Замечу, если вам повезло купить/найти/отнять клавиатуру с таким контроллером, как на прикрепленной выше схеме, то без паяльной станции не обойтись. Прикрепить к корпусу плату можно почти любыми подручными средствами, жидкие гвозди, саморезы, суперклей, силикон, да и вообще если пинать сильно не будите, то и так держится, но зависит от корпуса, витая пара плотно прижимает плату.

Делаем косметические улучшения, кто захочет, припаяет диод на корпус от NUB LOCK"а... Сделает отверстие под провод и перепротянет USB кабель. Ну а там, на что уж фантазии хватит. Конечный результат:

Фаза 2. Настройка программного обеспечения. Надеюсь это для каждого изготовившего сей девайс не станет проблемой. Для Guitar Rig делается все проще некуда, включаем NUM Lock, включаем ригу, открываем OPTIONS - CONTROLLER, нажимаем MENU, ищем необходимое действие, кикаем на клавишу Learn и выбираем подходящую кнопку на нашем контроллере. Затем нажимаем на Add Controller и проводим снова те же операции. И так пока не наберем все что необходимо или не закончатся клавиши. Так же можно назначить клавишу на почти любое действие в 3ей риге, нажимаем правой кнопкой мыши на объект и жамкаем снова на Learn.

А вот теперь если есть интерес настроить все это детище на Midi команды, то придется еще немного развлечься.
Значит нам необходимо ПО, которое биндит клавиши на миди команды. И такая программуля есть, правда аналогов не встречал, благо лечить от жадности не нужно. Называется Virtual Midi Controller, настраивается действие по клавише во вкладке C IN, установка - Setup - Далее - Далее. Вот ссылка .


Вместе с ней ставиться и виртуальный MIDI кабель, так что лишних телодвижений делать не придется. Для совсем ленивых выкладываю предустановку банка для футсвича: банк - им следует заменить файл в корне папки с программой, по умолчанию C:\Program Files\Virtual Midi Controller\ , предварительно выйдя из VMC. Для удобства в SETUP поставить галку Run In Background и в основном окне VMC ткнуть на букву К, после чего принимать команды прога будет и в свернутом режиме. Теперь для выхода из проги требуется ликвидировать ее в трее. И вот начиная с этой минуты вы сможете управлять и Nuendo и Sonar с футсвича. Ну и естественно TH1 тоже через миди хватает нашу клаву.

Будут вопросы, обращайтесь...

Следующий задуманные проекты:
- Экранирование гитары.
- Комбик своими руками.

Успехов Вам в муздеятельности...

В очередной раз играя на гитаре и управляя звуком через 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 и печатка на гитхабе.