Arduino
Попался давеча мне на глаза мой старый детский синтезатор. Ему уже лет 30, а из поломок — только замена блока питания, все остальное работает, а главное что клавиши у него оказались неубиваемые. Однако ни мне, ни моим детям он уже не нужен — для серьезного занятия музыкой было куплено электронное пианино на 7 октав (к слову тоже casio). Хотел я его уже отнести не помойку, но подумал: а не сделать ли мне из него midi-клавиатуру?
Что же такое midi-клавиатура и чем она отличается от синтезатора
Основное отличие между MIDI-клавиатурой и синтезатором заключается в том, что MIDI-клавиатура не имеет встроенных звуков. Она представляет собой просто контроллер, который отправляет MIDI-сигналы на другое устройство, например, компьютер или синтезатор, которое занимается генерацией звука. Синтезатор, с другой стороны, это полноценный инструмент, который имеет встроенные звуки и может использоваться самостоятельно, без подключения к другому устройству.
Одним из главных преимуществ MIDI-клавиатуры является ее гибкость. Она может быть подключена к любому устройству, которое имеет MIDI-вход, включая компьютеры, синтезаторы, семплеры и другие устройства. Это позволяет использовать ее для контроля над различными звуками и программами для создания музыки.
Еще одним преимуществом MIDI-клавиатуры является ее компактность. Она обычно имеет меньший размер, чем синтезатор, и может быть легко перенесена с места на место. Это делает ее отличным выбором для тех, кто часто выступает в живую музыку или записывает музыку дома.
Кроме того, MIDI-клавиатуры часто имеют большее количество клавиш, чем синтезаторы, что делает их более удобными для игры на рояле или других инструментах с большим количеством клавиш.
Между тем, синтезаторы имеют свои преимущества. Они имеют встроенные звуки, которые могут быть управляемыми с помощью клавиатуры. Это делает их отличным выбором для тех, кто хочет играть на инструменте без необходимости подключения к другому устройству.

Также синтезаторы имеют встроенные эффекты, которые могут быть использованы для изменения звука. Они также могут иметь встроенные секвенсоры, которые позволяют записывать и воспроизводить музыку.
В итоге, выбор между MIDI-клавиатурой и синтезатором зависит от ваших потребностей и предпочтений. Если вам нужна большая гибкость и универсальность, MIDI-клавиатура может быть лучшим выбором. Если вы хотите иметь встроенные звуки и эффекты, то синтезатор может быть более подходящим выбором.
Выбор платформы
Для реализации задуманного была выбрана плата Arduino Pro Micro, так как она имеет встроенный USB Host при подключении к ПК она определяется как USB-устройство, например как клавиатура.

Собственно, этот проект очень похож по своей технической части на сделанную мной механическую клавиатуру.
Итак, основная сложность заключается в том, чтобы подключить все 32 клавиши к Arduino, имеющей намного меньше пинов. Для этого мы поступим так же, как при создании механической клавиатуры: расположим клавиши в виде матрицы и соединим все ее столбцы и строки с пинами платы через диоды.

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

Оказалось, что в нем ровно та же реализация подключения клавишей к контроллеру, все диоды и клавиши уже распаяны, и остается только «прозвонить» контакты мультиметром в режиме «прозвона диодов» и вычислить, какие контакты относятся к столбцам, какие — к строками и какие клавиши расположены в полученной матрице подключения.
После этого остается припаять нашу Arduino к шлейфу вместо контроллера синтезатора, на чем собственно вся техническая часть самоделки будет завершена — можно закрывать корпус, выведя наужу usb-кабель.

Программирование
В отличии от механической компьютерной клавиатуры, где мы прошивали Arduino прошивкой qmk, здесь мы напишем небольшой скетч, который будет постоянно проверять, какие из клавиш в данный момент нажаты, и отправлять соответствущий midi-сигнал на ПК. Причем отправлять его нужно только при изменении состояния клавиши — если она перешла из ненажатого состояния в нажатое и наоборот.
Полный код прошивки выложен на github.
При написании кода было найдено несколько midi библиотек для Arduino, из которых была выбрана Control_Surface как наиболее функциональная и хорошо работающая.
Сам код максимально прост и в пояснениях, как мне кажется, не нуждается.
В итоге у нас получилось полностью функциональная midi-клавиатура, которую можно использовать с DAW-программным обеспечением, например, с моей любимой FL Studio, или с любым другим. Однако при желании всегда можно найти, что улучшить. Мы никак не использовали остальные кнопки синтезатора. А на Arduino контроллере еще есть свободные пины для них. Я бы реализовал как минимум такой функционал, как управление громкостью, сдвиг октав, а также pitch band и modulation. Эти функции есть на многих midi-клавиатурах и поддерживаются почти всеми DAW-программами как говориться «из коробки». Ну а остальное по желанию — например барабаны и тд.
И еще одно пояснение: многие midi-клавиатуры реагируют на скорость нажатия на клавиши и проигрывают звук тем громче, чем быстрее нажата клавиша. В нашей самоделке этого функционала нет по той причине, что его не было и синтезаторе-доноре. Для его реализации нужна возможность получения как начала нажатия клавиши, так и его завершения, что позволит посчитать время, прошедшее между ними, и вычислить скорость, передав пропорциональную ей velocity в midi-сигнале. Но midi-клавиатуру вполне можно использовать и без этого функционала.
Как использовать синтезатор как миди клавиатуру через usb

Здравствуйте, дорогие друзья. Порой нам нужно записать звук клавишных и у нас для этого есть синтезатор. Как же лучше его использовать для этих целей?
Можно записать звук инструмента напрямую через большой джек. Однако, так мы не сможем больше никак обработать полученный звук, повыбирать разные пресеты, отредактировать саму партию и так далее.
Поэтому лучше всего использовать синтезатор, как миди клавиатуру.
Сделать это можно если в синтезаторе есть usb выход. Я расскажу на примере синтезатора Yamaha PSR-333.
USB-выход на нём выглядит так:
рис. 1
С помощью нужного кабеля подключаем синтезатор к компьютеру, через стандартный usb-разъём.
То есть мы подключаем синтезатор не в звуковую карту, а напрямую к компьютеру.
Далее, чтобы синтезатор заработал как миди клавиатура нам нужно скачать и установить драйвер с сайта yamaha (можно это сделать по этой ссылке: https://europe.yamaha.com/en/support/updates/umd_win64_kbd.html). Или просто введите в яндексе: драйвер для синтезатора yamaha psr333 скачать.
Далее нам нужно открыть любую daw программу. Я буду использовать Reaper.
Настройка миди-клавиатуры
Первое, что нужно сделать это зайти в Preferences/midi device и найти в этом разделе нашу миди клавиатуру.
Конкретно psr-333 может называться Digital KBD-1.
рис. 2
Кликаем дважды по этой миди клавиатуре и в появившемся окне включаем две галочки: «enable input from this device» и «enable input for control messages».
рис. 3
Настройка трека для записи клавишных
Теперь нам нужно чтобы миди клавиатура зазвучала. Для этого создадим пустой трек в рипере (кликните правой кнопкой на поле слева и нажмите «insert new track»).
рис. 4
Для того, чтобы при нажатии на клавиши синтезатора был звук в самом рипере нужно установить какой-нибудь плагин для обработки звука миди клавиатуры. Например, можно использовать встроенный плагин REASynth. Просто кликаем на FX и находим его в списках плагинов.
рис. 5
Но звука всё еще не будет слышно. Для того чтобы звук шел нужно кликнуть на рекорд в нужном треке и в input выбрать input:MIDI/DigitalKBD-1/All channels.
рис. 6
Теперь (играть надо обязательно с включенным record) у нас будет слышен звук клавиш, обработанных с помощью выбранного плагина, и сами клавиши можно записать.
Каждую, из записанных таким образом нот, можно отредактировать в piano roll (чтобы его открыть нужно дважды кликнуть по записанному треку), что очень удобно. Также плагин можно поменять, сделав звук клавиш каким угодно (снова нажимаем FX в треке для клавишных и ищем нужный плагин).
Для обработки клавишных существуют такие плагины как Addictive Keys, Nexus и так далее. В них можно найти очень качественные звуки клавишных и не только.
Делаем MIDI-клавиатуру из старого детского синтезатора

В один из дней, возвращаясь домой, возле мусоропровода в подъезде я увидел старую детскую игрушку-синтезатор. Прошел мимо, так как брать с мусорки «грешно», но в душе захотелось утащить ее оттуда. Уже поздно ночью, где-то часа в 2 я решил посмотреть, не стоит ли она все еще там. И да, она все еще была там! С виду она был вполне целой и чистой, так что никакой брезгливости, чтобы не забирать ее не было. Так что да, я ее забрал.
Давно хотел себе пианино, я не профессиональный музыкант, но просто побаловаться — почему нет? Покупать что-то «ради побаловаться» меня «душила жаба», а тут — халявная игрушка. Когда я ее забирал с мусорки, то даже мысли не было пользоваться ей как детской игрушкой, была сразу мысль: «О-о-о…, хорошая база, чтобы попробовать сделать MIDI-клавиатуру».
Так как у меня уже есть некоторый опыт общения с профессиональными клавишными инструментами и MIDI-клавиатурами, то я сразу понимал все минусы моей идеи. То есть игрушка по факту так игрушкой и останется. На базе нее невозможно будет реализовать силу нажатия клавиш. Сами «легкие» пластиковые клавиши, которые к тому же еще и неполноразмерные не дадут возможности что-то на ней достойно исполнять.
В первую очередь синтезатор-игрушка была разобрана «до винтика», хорошо вымыт с мылом весь пластик. Также почищены платы и контактные группы клавиш.
После разборки пришло понимание, почему люди ее выкинули. У игрушки (не знаю от чего: от времени, от китайского качества комплектующих или жесткой эксплуатации) во-первых: развалились встроенные динамики, а во-вторых: в разъеме наушников торчал отломанный разъем от них, так что вытащить его не было практически никакой возможности. Наверное, после того как игрушка перестала играть встроенными динамиками, ей пользовались с наушниками, а потом после того как и там сломали разъем – просто выкинули.
Внутри игрушка-синтезатор состояла из трех плат, которые между собой были спаяны шлейфом проводов. Центральная плата, которая отвечала за генерацию звука и прочего, была сразу же отпаяна от двух других плат и отложена в сторону. На двух других платах находились контакты для кнопок на лицевой панели игрушки и непосредственно самих клавиш пианино. К ним я припаял разъемы PBS, тем более что шаг отверстий на платах как раз был 2.54 мм.


После этого я потратил пару часов на составление схем этих плат с клавишами. Как выяснилось, схема представляет простую матричную клавиатуру.

На картинке в желтых кружочках цифры – это номера контактов «горизонталей», а цифры на клавишах – номера контактов «вертикалей» в разъеме PBS-13 на плате клавиатуры.



После этого все это было закинуто в угол и пылилось целый год. И тут наступил период самоизоляции… Стало скучно и захотелось что-то поделать своими руками, тем более что ходить некуда, да и нельзя…
В итоге решил все-таки попробовать хоть немного доделать эту игрушку. В качестве основы для контроллера взята плата Arduino, а так как количество цепей клавиш больше, чем количество выводов Arduino UNO, то решил использовать сдвиговые регистры 74HC595 и 74HC165. В итоге получилась вот такая схема.

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

Следующие несколько дней я не спеша занимался «домашним творчеством», а именно, аккуратно распаивал все компоненты платы на макетную плату. Собирал это все из того, что было у меня дома. В качестве управляющей платы взял Arduino NANO.

Такой «бутерброд» из плат обусловлен тем, что две платы игрушки (одна с кнопками, а вторая с клавиатурой) расположены на разном уровне и я, прежде чем паять все это подумал: «а нельзя ли это как-то соединить между собой, используя те компоненты, которые есть у меня дома, чтобы выглядело более или менее хорошо»? Так и получилась эта конструкция из двух плат, соединенных между собой разъемами. С моей точки зрения для домашнего варианта, когда сидим в самоизоляции, получилось достаточно хорошо. Пришлось только обрезать макетную плату и чуть-чуть доработать корпус игрушки, чтобы можно было подключать кабель USB в плату Arduino.

Осознание что устройство работает не совсем так, как я хотел, пришло тогда, когда доработал тестовую программу. Алгоритм был простой: по очереди включить каждый выход микросхемы 74HC595, считав при этом состояние входов у микросхемы 74HC165, и записать результат в отдельные переменные. Всего на клавиатуру подключено 5 выходов 74HC595, поэтому в итоге я получил 40 бит (5*8) данных после этого опроса. Строка из 40 бит выводилась в консоль, и нажимались клавиши, чтобы посмотреть, как устройство обрабатывает одновременные нажатия нескольких клавиш.

Тут-то и всплыла проблема: если нажимать по одной клавише, то все было отлично, но при попытке нажать более 2-х клавиш одновременно возникала ситуация, когда невозможно было предугадать, что будет прочитано. Результат мог быть правильным при одном сочетании, а при другом мог быть совсем непредсказуем. Проблема была в том, что не была учтена особенность данной схемы. При нажатии нескольких клавиш одновременно происходит замыкание не только нескольких вертикалей сканирования клавиатуры (это допустимо), но и могут быть замкнуты через клавиши несколько горизонталей (что никак не допустимо). Более подробно об этой проблеме и о способах ее решения можно почитать вот здесь.
Я выбрал «кардинальное решение» проблемы, а именно: решил, что на каждую клавишу в клавиатуре будет поставлено по диоду.
В голове я уже мысленно начал думать, как мне придется перерезать дорожки на плате и ставить в разрыв диод в SMD корпусе. Залез в свои запасники и увидел, что диодов в SMD корпусе в таком количестве у меня просто нет (не забываем, что все мы сидим на самоизоляции и поход в магазин за радиодеталями не очень возможен – так как это точно не предметы первой необходимости). Немного расстроившись, решил более внимательно посмотреть на плату: может быть есть возможность поставить на часть дорожек выводные диоды (их тоже какое-то количество у меня было). И тут я увидел, что у каждой клавиши, есть перемычка (плата односторонняя) и схема сделана так, что вместо этой перемычки можно поставить по диоду. Сразу же подумалось – даже и ничего резать не надо, надо только везде поставить вместо перемычек выводные диоды. Такого количества выводных диодов у меня тоже не было. В голове мелькнула мысль: «а может быть поставить светодиоды»? Работа схемы идет на уровне +5V и если поставить красные светодиоды, у которых минимальное падение напряжения (среди светодиодов), то в итоге должно хватать логического уровня для правильного определения: нажата клавиша или нет.

С этой мыслью я снова полез в свои запасы и выгреб откуда только можно было красных светодиодов. Их оказалось ровно столько, сколько клавиш на клавиатуре! Это знак, подумал я, и впаял для пробы несколько светодиодов вместо перемычек. Результаты тестирования показали, что решение рабочее. После этого запаял остальные светодиоды вместо перемычек. Тестовая программа показала, что можно нажать хоть все клавиши одновременно, и они все считываются правильно.

На дополнительные кнопки, которые есть на игрушке, решил не ставить диоды, потому что вряд ли их будут нажимать сразу несколько штук одновременно. Тем более что в программе у меня пока нет обработки нажатий на эти кнопки. Ну и я банально пока не придумал, как их использовать.
Настало время разобраться с тем, как сделать, чтобы это устройство виделось в компьютере как MIDI-клавиатура и в каком формате нужно отправлять данные.
Информация, найденная в интернете, говорила мне о том, что можно из Arduino сделать MIDI-клавиатуру очень легко и просто, если залить в нее прошивку, которая заставит компьютер видеть ее не как COM-порт, а именно как MIDI-клавиатуру. Изначально я на это решение и ориентировался, особо не вдаваясь в то, как оно реализовано.
Теперь, когда я добрался до него и внимательно прочитал, то понял, что моя плата Arduino NANO не подойдет для этого решения, так как у нее COM порт был реализован на базе микросхемы CH340. Для использования прошивки по ссылке выше подойдут только те платы, где USB-порт уже есть на контроллере (например: AtMega32u4) или же общение по COM-порту сделано не на микросхемах преобразования типа FT232RL и им подобным, а на микроконтроллерах AtMega. Поэтому прошивка в плате должна отдать данные в формате MIDI в COM порт, а на компьютере придется установить и настроить программное обеспечение, которое будет эти данные перехватывать и передавать в виртуальный MIDI-порт.
Алгоритм считывания клавиш и формирования MIDI-команд у меня получился следующий:

Нет смысла расписывать подробно, как работать с MIDI данными, потому что это можно прочитать здесь.
Остановлюсь чуть более подробно на программном обеспечении для компьютера и тех проблемах, с которыми я столкнулся. Проблемы возникли, просто из-за отсутствия нормальной документации на это программное обеспечение. Итак, для того, чтобы компьютер успешно мог принимать MIDI-данные с такого устройства как у меня, понадобится две программы: loopMIDI и Serial-Midi Converter. Для программы Serial-MIDI Converter дополнительно нужно установить Java, если на компьютере она не установлена.
Запускаем программу loopMIDI и создаем два виртуальных порта. Я назвал их «Arduino IN» и «Arduino OUT». Эта программа как раз и будет виртуальным MIDI-устройством.

Далее запускаем Serial-MIDI Converter и при запуске проходим процесс ее настройки. К сожалению, это приходиться делать каждый раз при запуске, но это не очень страшно, делается буквально в четыре нажатия на клавиатуре. Номер COM-порта может быть другой, он появляется на компьютере при подключении платы Arduino NANO. Скорость порта задается в прошивке Arduino NANO. Красными стрелками обозначены мои параметры, при которых у меня все работало.

Собственно на этом процесс настройки завершен и можно уже использовать какое-либо программное обеспечение, которое будет воспроизводить звуки, принимая нажатия клавиш от устройства. В настройках программного обеспечения необходимо выбрать в качестве входа «Arduino_OUT». На картинке ниже пример настройки Kontakt Player.

Работает в конечном итоге это вот так:
Что дальше? А дальше все произошло именно так, как я и ожидал – игрушка остается игрушкой ровно со всеми теми недостатками, о которых я упоминал в самом начале. Наверное, ребенку поиграть на таком будет в кайф, но вот взрослому человеку, после нормальных клавишных инструментов… Проще купить достаточно дешево любую MIDI-клавиатуру б/у и она будет на порядок лучше этой игрушки. Я решил оставить эту игрушку как она есть, но сделать некоторые модификации с ней:
- Оставить оригинальный корпус.
- Поставить исправные динамики и сделать усилитель для них.
- Сделать так, чтобы она работала в режиме «детской игрушки» без подключения к компьютеру, то есть, чтобы сама могла играть звуки.
- Сделать возможность подключения FootSwitch (та самая педаль на пианино внизу), чтобы можно было сделать удержание звука после отпускания клавиш, как на нормальном инструменте.
- Добавить в прошивке поддержку клавиш, которые сейчас не опрашиваются и не задействованы.
- Подключить в схему переменный резистор, который остался физически на панели игрушки-синтезатора, и добавить его функциональность в прошивку.
Реализацию большинства пунктов, пока все мы дружно «сидим дома», сделать не могу, так как у меня дома просто нет всех требуемых компонентов для этого.
Для реализации пункта 3 в интернете было найдено решение под названием SamplerBox. Суть проекта в том, что можно подключать любую MIDI-клавиатуру к плате Raspberry Pi, которая обрабатывает MIDI-команды с клавиатуры и воспроизводит звуки или переключает инструменты и т.д. Остается только поставить плату Raspberry Pi внутрь корпуса игрушки, без возможности замены SD-карты (не разбирая корпус), настроить кнопки на корпусе игрушки так, чтобы они переключали инструменты и этого будет достаточно, чтобы оставить этот проект в таком виде.
Можно ли синтезатор использовать как миди клавиатуру?
Есть синтезатор Casio CTK-810. Установил драйвер для него. Подключаю через USB на комп и включаю в Ableton. Не работает. Скажите, мож я че не так делаю? Как правильно подключить.
Комментарии
Сё ребята облом:( Понял я. Вот почему не играет:
«Наличие USB-порта на синтезаторе не гарантирует возможность использования синтезатора как MIDI-клавиатуры при помощи этого USB-порта. Дело в том, что на некоторых синтезаторах USB-порт, несмотря на его наличие, не предназначен для передачи MIDI-сигнала, а служит лишь для удобного обмена с компьютером MIDI-файлами и/или файлами стилей автоаккомпанемента и проч. Это характерно, например, для синтезаторов Roland EXR-3/5/7; в аналогичных моделях из более свежей линейки EXRs этот недостаток устранён.»
