Как сделать клавиши для пианино

Делаем 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-клавиатуру б/у и она будет на порядок лучше этой игрушки. Я решил оставить эту игрушку как она есть, но сделать некоторые модификации с ней:

  1. Оставить оригинальный корпус.
  2. Поставить исправные динамики и сделать усилитель для них.
  3. Сделать так, чтобы она работала в режиме «детской игрушки» без подключения к компьютеру, то есть, чтобы сама могла играть звуки.
  4. Сделать возможность подключения FootSwitch (та самая педаль на пианино внизу), чтобы можно было сделать удержание звука после отпускания клавиш, как на нормальном инструменте.
  5. Добавить в прошивке поддержку клавиш, которые сейчас не опрашиваются и не задействованы.
  6. Подключить в схему переменный резистор, который остался физически на панели игрушки-синтезатора, и добавить его функциональность в прошивку.

Реализацию большинства пунктов, пока все мы дружно «сидим дома», сделать не могу, так как у меня дома просто нет всех требуемых компонентов для этого.

Для реализации пункта 3 в интернете было найдено решение под названием SamplerBox. Суть проекта в том, что можно подключать любую MIDI-клавиатуру к плате Raspberry Pi, которая обрабатывает MIDI-команды с клавиатуры и воспроизводит звуки или переключает инструменты и т.д. Остается только поставить плату Raspberry Pi внутрь корпуса игрушки, без возможности замены SD-карты (не разбирая корпус), настроить кнопки на корпусе игрушки так, чтобы они переключали инструменты и этого будет достаточно, чтобы оставить этот проект в таком виде.

Но все это будет уже после того, когда закончится период самоизоляции.

Надеюсь, что кому-нибудь мой опыт окажется полезным.

Источник

Превращаем клавиатуру в пианино с помощью Python

Как-то заинтересовался я теорией музыки. Но пианино, увы, у меня нет, поэтому я отправился в поиски программы со следующий функционалом: после нажатия на кнопку звучит определенная нота. Сперва я посмотрел высокопрофессиональные программы, но в них слишком, уж слишком много функций. И это очень хорошо, но на текущем моменте моей жизни мне это попросту ненужно. Это будет только мешать и отвлекать. В программах с меньшим функционалом максимально неудобный интерфейс. Потому я решил просто написать такую программу сам. Подробности под катом.

Немножко о MIDI

MIDI — стандарт цифровой звукозаписи на формат обмена данными между электронными музыкальными инструментами. Это отдельный большой мир, который заслуживает отдельного разговора. Но нам необходимо знать лишь некоторые правила:

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

В каждом треке хранятся определенные команды для синтезатора. Например, noteon – включить определенную ноту; noteoff – выключить определенную ноту; change_program – изменить инструмент, control_change – изменение настроек, влияющих на воспроизведение нот, их смену, и тп. Все команды можно посмотреть здесь.

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

Запись MIDI-файлов с помощью Mido

Mido – это библиотека на python, созданная для работы с MIDI-сообщениями и портами. Установка.

Классический пример прочтения файла:

Классический пример создания файла:

Обратите внимание на параметр «time». Поподробней можно прочитать здесь.

Обработка событий клавиатуры c keyboard.

Словарь можно сделать так (начинается с малой октавы):

Воспроизведениe нот в реальном времени с помощью mido

Сперва надо установить python-rtmidi.

Получаем список портов (у меня всего один):

При нажатии на клавишу передаем порту сообщение о включении или выключении ноты:

Но у этого способа есть одна проблема – качество звучания. Да и превратить midi в wav просто так нельзя.

Воспроизведениe нот в реальном времени с помощью fluidsynth

Fluidsynth – это бесплатный программный синтезатор.

Установка fluidsynth (в Windows):

Скачайте fluidsynth для Windows и распакуйте в любой папке.

Добавьте подкаталог «fluidsynth\bin» в свой path. Для этого в поисковой строке напишете «Изменение системных переменных среды», запустите; далее по порядку «Переменные среды», «Path», «Изменить», «Создать» и введите путь к подкаталогу «fluidsynth\bin».

Теперь нужно проверить работоспособность fluidsynth. Скачайте любой midi файл и выполните в консоли «fluidsynth FluidR3_GM.sf2 file_name.mid». Не забудьте перейти в необходимый каталог.

Теперь нужно установить pyfluidsynth.

Скачайте pyfluidsynth (разработка ведется на github) и распакуйте.

Чтобы додуматься до этого шага мне пришлось потратить 1.5 дня (еще один намек на то, чтобы нормально выучить язык, а не с помощью статей в интернете). Перейдите в каталог «fluidsynth\bin» и найдите там файл «libfluidsynth-3.dll» (Быть может, у вас другая цифра). Теперь откройте файл «fluidsynth.py» в каталоге «pyfluidsynth», найдите строчку «lib = find_library(‘fluidsynth’) or…» (она должна быть в начале) и поменяйте «fluidsynth» или любой другой аргумент на «libfluidsynth-3.dll» (У вас может быть другая цифра).

В каталоге «pyfluidsynth» выполните команду «py setup.py install». После чего данный каталог можно удалить.

Также может потребоваться установить numpy.

Соединяем с keyboard:

Из midi в wav

Выполните в консоли:

Спасибо за прочтение статьи. Удачи!

Читают сейчас

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Domain-driven design, Hexagonal architecture of ports and adapters, Dependency injection и Python

Сокрытые драгоценности Python

В аквариуме: вычислительная генетика на Python и Mathcad (часть 1)

Курсы

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Минуточку внимания

Комментарии 22

На обычной клавиатуре можно играть (а на midi- контроллере набирать текст). Но зачем?

Ну ок, имеют. Но, видимо, без видеокарты.

Ну мой доход позволяет взять миди клавиатуру, но в компьютере тоже нет видеокарты. Это как-то может помешать музыке?

То есть у вас нет ни видеокарты, ни midi-клавиатуры 😉 Значит, ни одно ни другое вам не нужно.
Музыке ничто не сможет помешать 😉 Издавать музыкальные звуки можно из чего угодно, но профессиональные музыканты обычно играют на дорогих музыкальных инструментах.

Всё правильно, парень! Пили код и ни в чём себе не отказывай.

Ну вот у меня за спиной стоит MPK-88, подключенная к другому компу, а на рабочем столе этого, рабочего, всё равно висят ярлыки на VMPK и Vanilin MIDI Keyboard. Ну вот хочется иногда и пошалить, а иногда и просто проверить себя по-быстрому. А вот двадцать лет назад, тыкая мышой в Cakewalk’е — как я был рад какой-то такой же поделке. Дела резко в гору пошли! 🙂 Правда, ненадолго, но это уже другой вопрос.

Автору респект и успехов!

Затем, что ты программист. Допустим, тебе просто интересно это реализовать, но покупать специализированную клавиатуру не нужно. Или у заказчика есть такая клавиатура, и он поручает тебе внести правку в приложение. А правка — на пару часов.

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

Рад, что похожая идея посетила не только мою голову. В тележном чятике я уже давно описывал свои мысли по этому поводу. Во-первых, возможно люди быстрее осознают нажатие клавиш если есть звуковое сопровождение. Обычно это щелчок, но многие клавиатуры не щёлкающие в силу конструкции ранее содержали пьезопищалку. Второе, если вы посмотрите ролики про работу слепых программистов, то заметите, что их голосовые синтезаторы настроены на скорость существенно более высокую чем средняя. Для неподготовленного человека работа такой программы звучит как тарабарщина, но тренированное ухо быстро распознаёт там знакомые паттерны. И вот что я подумал: а что если повесить на кнопки разные звуки. Слева более низкие, справа более высокие, да ещё и с разным тембром. Скажем ряд QWERTY звучал бы бояном, ряд ASDFGH — органом, а ряд ZXCVB — кларнетом (названия рядов условные, я не предполагаю использовать раскладку QWERTY на клавиатуре которую делаю). В этом случае типичные конструкции типа if-скобка или длинные названия переменных будут звучать как некоторая какафония, но каждый раз одна и та же какафония, тот самый узнаваемый паттерн. Не знаю что из этого получится.

Я сейчас собираю (на самом деле пока ещё не собираю, но готовлюсь) клавиатуру с двойным подключением USB HID и MIDI. Пока даже макетов нет, но я уже размышляю какие ноты повесить на кнопки? Хроматическую ли гамму, или мажорную, или пентатонику?

Пентатоники хватит точно. У меня же по идее слева-направо меняется высота, сверху-вниз (или ближе к монитору — ближе к телу) — тембр. Я предполагаю использовать Corjik, то есть расположение кнопок будет как на этой клаве:

Там, как видите, слева-направо всего 12 кнопок. Одна хроматическая гамма, пара мажорных или пара пентатоник и ещё децл.

Вообще я думал использовать в качестве тембров разные регистры органа. А для кнопок больших пальцев поставить какие-нибудь резкие короткие звуки вроде щелков или ударов по барабану, при этом менялся бы ещё какой-нибудь регистр органа, потому одна и та же кнопка (буква) с Shift’ом и без давала бы звуки одинаковой высоты, но разного тембра. У настоящих органов регистров порою десятки, и каждый меняет тембр. Ну и мечта, конечно же, покодить подключив клаву к настоящему органу с MIDI:

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

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Источник

Оцените статью