В детстве у меня было пианино, такое настоящее, советское, киллограм на 300. Мне нравилось на нем бренчать, а после окончания музыкальной школы даже кое-что играть. Пианино — это классно, аутентично, но совершенно не практично. А чтобы совсем прям для души, нужна еще и барабанная установка, пяток примочек к электрогитаре, кларнет, ситар и сэмпловые лупы…



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

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

Синтезатор ведь что из себя представляет? Большое устройство, с музыкальной клавиатурой, которое где-то должно занимать прилично места. В которое встроена акустика, а ведь у меня уже есть ресивер с колонками. В которое встроен плохенький ПК, а ведь у меня есть хороший ПК.

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

В поисках отдельной клавиатуры я набрел на такой класс устройств как USB MIDI Keyboard.
Мне всегда казалось, что MIDI это из области профессиональной музыкальной деятельности.
Но сейчас все музыку делают на ПК, в любом удобном месте, а значит, музыкантам нужны мобильные музыкальные клавиатуры, которые легко помещаются в рюкзак.

Вот оно!



В голове сразу сложился план. Подключаем MIDI-клавиатуру к домашнему медиацентру на базе Raspberry Pi 3, где крутится программный синтезатор, позволяя в любое время любому желающему исполнить свой очередной шедевр. На таких MIDI-клавиатурах как правило есть набор регуляторов и дополнительных кнопок, которые программируются на различные эффекты или дополнительные музыкальные инструменты. Выглядит и звучит это очень круто!

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

Я не спец в создании музыки на ПК, поэтому было сложно искать пути реализации своей задумки. Информацию приходилось собирать по крупицам. Пазл постепенно стал складываться и получилось собрать работающее решение, которым с вами и делюсь. Как ни странно, но в стандартном дистрибутиве Raspbian/Debian нашлось все что нужно, даже не пришлось подключать внешние репозитории.

В качестве секвенсера (приложения, воспроизводящего MIDI-файлы) используется fluidsynth.
MIDI-клавиатура сразу обнаруживается через ALSA и доступна для подключения к секвенсеру.
Для воспроизведения звуков различных инструментов используются открытые базы сэмплов в формате SoundFont2. Для начала установим это все.

sudo -s
apt-get update
apt-get -y install alsa-utils fluid-soundfont-gm fluidsynth

Подключаем MIDI-клавиатуру к Raspberry и запускаем секвенсер в режиме сервера:

fluidsynth -i -s -a alsa -g 3 /usr/share/sounds/sf2/FluidR3_GM.sf2

Выполняем команду:

aconnect -o

В результате мы увидим список доступных MIDI-клиентов:

client 14: 'Midi Through' [type=kernel]
    0 'Midi Through Port-0'
client 20: 'VMini' [type=kernel]
    0 'VMini MIDI 1    '
    1 'VMini MIDI 2    '
client 128: 'FLUID Synth (1628)' [type=user]
    0 'Synth input port (1628:0)'

Здесь нам важно запомнить номера клиентов клавиатуры и секвенсера, чтобы затем соединить их командой:

aconnect 20:0 128:0

Теперь у нас все готово для игры на Yamaha Piano (это дефолтный инструмент). Почитайте мануал по fluidsynth, там есть много интересных команд, например, чтобы сменить инструмент на ударники или духовые, задать величину реверберации или хоруса.

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

cat > /etc/init.d/fluidsynth << EOF
#!/bin/bash
 
### BEGIN INIT INFO
# Provides:          fluidsynth
# Required-Start:    $all
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Fluidsynth deamon to play via MIDI-keyboard
### END INIT INFO

startDaemon() {
      sleep 30s && fluidsynth -i -s -a alsa -g 3 --load-config=/home/osmc/midi-router >/var/log/fluidsynth &
      sleep 60s && aconnect 20:0 128:0 &
}

stopDaemon() {
    pkill -9 fluidsynth &> /dev/null
}

restartDaemon() {
    stopDaemon
    startDaemon
}

case "$1" in
    start)
        startDaemon
        ;;
    stop)
        stopDaemon
        ;;
    restart)
        restartDaemon
        ;;
    status)
        ;;
    *)
        startDaemon
esac
exit 0
EOF

Регистрируем демон для автозапуска:

chmod 755 /etc/init.d/fluidsynth
update-rc.d fluidsynth defaults

Обратите внимание, теперь при старте секвенсеру передается конфигурационный файл (/home/osmc/midi-router), содержащий команды, превращающие нашу клавиатуру в настоящий синтезатор.

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

Так вот, мне необходимо замэпить коды событий от клавиатуры на разные инструменты, а коды от ручек на коды, которые понимает секвенсер. В fluidsynth это делается при помощи router. Именно эти команды и содержатся в конфигурационном файле.

Вот пример моего конфигурационного файла, с комментариями того, что он делает.

cat > /home/osmc/midi-router << EOF
# загружаем стандартные инструменты и ударники, найденные где-то на просторах Сети
load /usr/share/sounds/sf2/FluidR3_GM.sf2
load /home/osmc/241-Drums.SF2
# связываем инструмент каждый со своим каналом
select 1 2 128 0
select 2 1 0 0
# по умолчанию звук идет на канал 0
# перенаправляем события с квадратных клавиш на канал с ударными
router_begin note
router_chan 0 0 0 1
router_par1 36 48 1 0
router_end
# события с остальных клавиш перенаправляем на канал с пианино
router_begin note
router_chan 0 0 0 2
router_par1 0 35 1 0
router_end
router_begin note
router_chan 0 0 0 2
router_par1 49 255 1 0
router_end
# события с ручек мэпим на события, которые понимает секвенсер,
# полный их список есть в документации на сайте fluidsynth
router_begin cc 
router_chan 0 0 0 2
router_par1 14 14 0 98
router_end
router_begin cc 
router_chan 0 0 0 2
router_par1 15 15 0 11
router_end
router_begin cc 
router_chan 0 0 0 2
router_par1 16 16 0 91
router_end
router_begin cc 
router_chan 0 0 0 2
router_par1 17 17 0 93
router_end
# выключаем громкость на канале 0, 
# иначе при нажатии на клавишу 
# разные инструменты будут звучать одновременнно
cc 0 7 0
EOF

Чтобы узнать какие коды генерирует именно ваше устройство, необходимо воспользоваться этой утилитой:

aseqdump -p 20:0

Она слушает и выводит на консоль события с MIDI-клавиатуры. Нажмите кнопку или покрутите ручку и вы увидите тип, канал и код события. Вы можете запрограммировать свою клавиатуру таким образом, каким захотите, а не так, как это придумали инженеры, разработавшие конкретный синтезатор. За что большое спасибо разработчикам fluidsynth, alsa, SoundFont2, Raspberry и V-Mini.

Кстати, эта тема с DIY-синтезаторами нашла отражение в нескольких изобретениях, рекомендую к изучению: раз и два.

Комментарии (28)


  1. Rumlin
    24.12.2017 15:49

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


    1. denonlink
      25.12.2017 00:55

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


      1. Rumlin
        25.12.2017 09:46

        Макбук 2011 года, которому стало тяжело жить после последнего обновления osx.


        1. denonlink
          25.12.2017 12:22

          Все таки, мне кажется, дело не в макбуке и не в оси, а в звуковой карте и драйверах.

          Я недавно отдал роителям ноут 2011 года с Core i5-2410M. Так вот, по тестам он всего на 25% медленней моего старого Core2 Quad Q9550, на котром я в свое время сводил проекты с десятками VST интсрументов и сотнями VST-эффектов: все прекрасно работало в реальном времени с минимальной задержкой на звуковой карте M-Audio Audiophone 24/96, а там было всего 4 гига оперативки и HDD.


          1. Rumlin
            25.12.2017 14:01

            В данном случае проблема в OSX
            discussions.apple.com/thread/8097885#

            I get my macbook freezing and very slow. I reset memory, pvram and smc and same issues. Then I reinstall my MacBook from scratch and works fine with macOS Sierra. Then I upgrade again to High Sierra and same freeze and slow. A last attempt was start from external drive and works very well…


    1. Yozhegg
      25.12.2017 17:44

      Может быть вот это подойдёт?
      www.nerds.de/en/ipmidi.html


      1. Rumlin
        26.12.2017 07:58

        Спасибо, еще бы open source


  1. Hidon
    24.12.2017 17:19

    я давным-давно для себя сделал так: пк с виндой+usb midi клавиатура+мониторы/наушники. в пк стоит crative audigy2zs, для неё есть программа soundfont bank manager — это как раз синтезатор чтобы побренчать(стандартно есть GM, но можно загрузить любые банки sf2). загружается мгновенно, звучит… ну тут всё зависит от банка.
    если надо что-то посерьёзней — включаю cubase и там уже есть всё, что угодно, лишь бы мощности железки хватало.


    1. kn0ckn0ck Автор
      25.12.2017 18:05

      Для себя лично я могу на ПК поиграть, есть Studio One, там все что угодно и это бесплатно, без специального оборудования (звуковухи, наушников там и т.п.). Видимо не удалось донести главного, что я не только для себя делал решение, а для всех, включая маленьких детей… «пап, ну какой еще банк» — спросят меня :)


  1. aamonster
    24.12.2017 20:38

    Автор странный… Приценивается к синтезатору за 50 тр (лично я "для дома, для семьи" — ну, чтобы поучиться играть — взял Casio LK 260 втрое дешевле — и это при том, что в нём есть подсветка клавиш для обучения, без этого явно можно дешевле найти, а уж миди-клавиатуру — тем паче), а потом покупает двухоктавную миди-клавиатуру. Круче было только китайскую резиновую миди-клавиатуру взять.


    И даже не упоминает параметры покупки… А там может быть что угодно, вплоть до отсутствия velocity (в младших моделях Casio LK, кстати, так и есть, 260 оказалась минимальной с velocity и подключением к компу)


    Ну а так — да, миди-клавиатура дешевле, но не автономна, так что каждый выбирает сам.


    1. kablag
      24.12.2017 22:43

      У alesis vmini есть velocity, но согласен, покупая такую клавиатуру, нужно точно знать, что её хватит по количеству клавиш — классику на такой не поиграть :)


    1. kn0ckn0ck Автор
      25.12.2017 17:54

      Чужие заскоки нужно уважать, чтобы другие в ответ гуманно относились к твоим собственным тараканам...

      Я постарался обосновать свой выбор, но если идти от фактов, то CASIO LK-260 в три раза дороже, в четыре раза тяжелее, в три раза габаритнее и при этом… в нем нет Pitch Bend, нет Velocity, нет падов и захардкоженные сэмплы неизвестного происхождения. Я своим выбором по-прежнему доволен :)


      1. aamonster
        25.12.2017 18:49

        Понятно, что LK-260 вам не подошёл бы (хотя бы в силу того, что он заточен под обучение чайников — т.е. перегружен ненужным вам функционалом, и вообще вы хотели не синтезатор, а миди-клавиатуру). Я его привёл лишь как пример, что заявление «синтезатор стоит 50 тысяч» не совсем верно.

        Но две октавы? Это же очень-очень мало.


        1. kn0ckn0ck Автор
          25.12.2017 19:07

          На самом деле я заявлял 40 тысяч, с другой стороны в Ашане можно купить и за 4 тысячи. (для детей, разумеется). Цена конечно здесь не самое главное :) Кто-то всегда будет считать, что лучше потратить 40 тысяч, чем свое время на «сделай сам».

          Мало для чего? Для классики — конечно, для начального обучения — вполне хватает, чтобы «поиграть» с электронной музыкой — вполне.


  1. copypasta
    24.12.2017 21:55

    Мидиклава+звуковой модуль. Да и самограек на рынке 100500 разных. Но если делать нечего — изобретать велосипеды.


    1. kn0ckn0ck Автор
      25.12.2017 18:01

      Для меня было важно дешево сделать детям цифровое пианино, чтобы оно не занимало много места. Звуковые модули и ПК тут сразу не годятся, дети маленькие еще и для зрения все это не полезно.


      1. sslobodyan
        25.12.2017 21:01

        Для детей намного проще подключить VS1053 — он умеет принимать МИДИ. Да, звук там не фонтан, но для деток и его будет достаточно.


  1. artskep
    24.12.2017 22:49

    Хм… Тут приходит на ум старая картинка про троллейбус из буханки.
    Но если серьезно, с midi клавами важны не столько «ручки настройки», сколько динамика клавиш. Я, если честно, не совсем понял какая у вас клавиатура вообще использовалась и вообще передает ли она velocity хотя бы. Я уж не говорю о клавиатурах с молоточковой механикой, которая хорошо имитирует динамику настоящего пианино/рояля, но стоит, увы, небюджетно (ибо механика).
    А по поводу того к чему ее подключать отдельный вопрос по задержкам между нажатием на клавишу и откликом. Насколько я экспериментировал на даже нормальном компе без звуковой карты с midi банками — задержка была совершенно неприемлимая для нормальной игры. Вангую, что в RPi не сильно веселее получилось, но интересно узнать результат.


    1. kn0ckn0ck Автор
      25.12.2017 17:59

      Velocity передает, но для меня это не было важным моментом конечно. На обычном компе все очень приемлемо работает на Studio One.


    1. philya
      27.12.2017 23:51

      casio cdp 120 стоит от 25 тыс.рублей. Вполне годное цифровое пианино с механикой.


  1. myldy
    25.12.2017 07:17

    Автор только вскользь упоминает лупер, а ведь это то самое, чего сейчас не хватает в поделках на малинке.


    1. kn0ckn0ck Автор
      25.12.2017 17:58

      Пока я собирал материал, я часто на эту тему натыкался, думаю это вопрос решенный, поскольку для Linux тут много всего уже понаделано, было бы только желание в этом разобраться. Мне пока хватает этого. Лупер у меня есть в бесплатной Studio One, когда очень хочется.


  1. Pinsky
    25.12.2017 11:49

    Но мою Yamaha CS-10 оно все равно не заменит


  1. Vbeerby
    25.12.2017 18:06

    Какой получилась задержка при использовании такой связки?


    1. kn0ckn0ck Автор
      25.12.2017 18:09

      Тут важно иметь ввиду, что у меня еще на RPi стоит OSMC, HomeAssistant в докере. Все это не очень способствует сокращению задержки. Более того, у fluidsynth есть набор параметров по этому поводу, я с ними не играл еще, но это нужно делать, да. В «лесу родилась ёлочка» играется отлично ;)


  1. sslobodyan
    25.12.2017 18:11

    Хорошее решение. Не хватает описания Вашей звуковой карты (надеюсь, встроенный звук Вас не удовлетворил?) и измерения задержки звукоизвлечения (времени от момента нажатия на клавишу до начала воспроизведения ноты). Задержку легко измерить двумя микрофонами. Один подключаете в левый канал и кладете рядом с клавишей. Второй подключаете в правый канал и кладете рядом с динамиком. Включаете запись с микрофонов. Ударяете по клавише. При этом одновременно запишется и удар по клавише и звук из динамика. В звуковом редакторе затем смотрим разницу во времени между началом звуков в левом и правом канале. Получите менее 10 мс — отлично.


    1. kn0ckn0ck Автор
      25.12.2017 18:12

      Ok, спасибо за методику, может займусь. Боюсь не оправдать ожиданий — штатный модуль RPi меня вполне удовлетворяет, это же все совсем любительская история.


      1. sslobodyan
        25.12.2017 20:56
        +1

        Любительская — не любительская, но на RPI достаточно просто добавляется I2S звуковушка. Даже простейшая на pcm5102 даст отличный звук за смешные деньги. Я на другом одноплатничке под SamplerBox-ом получал латентность 8-11мс.