MIDI-router на Raspberry Pi

    Хочу рассказать о том, как решить проблему, которая наверняка знакома любителям аппаратных синтезаторов.


    Что делать, если хочется состыковать MIDI-контроллер и синтезатор, но у одного из них есть только USB разъем и нет MIDI? Причем, по понятным причинам хочется все это сделать не используя компьютер.


    Я несколько раз перерывал интернет в поисках устройства для этого, но так ничего и не нашел — кроме пары ссылок на пару малотиражных устройств за немалые деньги, которые уже сняты с производства.


    В какой-то момент меня осенило: можно же взять Raspberry Pi и сделать все на нем — это самый настоящий компьютер, а на нем такие вещи делаются легко.


    Он, наверное, будет слабоват для полноценной обработки звука, но поток сообщений MIDI уж должен прокачать.


    [К слову, существует звуковой эффект процессор для Raspberry Pi, но он требует последней модели Raspberry Pi, которая намного дороже, плюс дополнительного шилда, который тоже недешев, и я решил не заморачиваться].


    Сказано — сделано. Обзавелся Raspberry Pi самой первой модели и за пару вечеров собрал рабочий прототип. В двух словах как он работает.


    ALSA Midi


    Сперва я планировал взять PureData и написать для него несложный патч, который будет перекладывать midi-сообщения из одного порта в другой.


    Но когда я начал заводить в нем MIDI на линуксе я нашел гораздо более простой подход.


    В Linux есть стандартная система звукового ввода-вывода — ALSA. Она поддерживает работу как со звуковыми потоками, так и с MIDI.


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


    Вот что получилось в итоге.


    aconnect


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


    Реально же нам нужны всего две операции: вывести список имеющихся устройств и подключить одно устройство к другому:


    # Вывести список MIDI-устройств, имеющихся в системе
    aconnect -l
    
    # Пересылать весь вывод с Arturia Keystep на Xio
    aconnect 'Arturia KeyStep 32' 'Xio'

    Я обернул эти команды systemd-скриптами для автостарта и настроил, чтобы запускались постоянно в цикле, можно посмотреть как я это сделал здесь.


    Альтернативы


    Если нужно все же как-то обрабатывать MIDI-поток до пересылки его на выход, можно воспользоваться несколькими вариантами:


    • Каким-то из языков обработки звука:
    • Mididings

    Если знаете еще варианты — присылайте.


    Upd: Резюме


    Через полтора месяца экспериментов резюмирую.


    В итоге практика показала, что для передачи нот оно подходит неважно — ноты частенько съезжают и проскакивают.


    Для передачи clock более-менее нормально — в синхронизации арпеджиатора управляемого синта с мастер-ритмом косяков я не слышу.


    А вот для передачи сообщений контроллеров, похоже, подходит идеально.
    Теперь можно подключить Launch Control XL к любому синту.


    Ссылки


    Когда я в прошлый раз изучал этот вопрос почему-то мне не удалось ничего найти.


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


    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 17

      0
      USB-MIDI шнур по каким критериям не подошел? на ардуино тоже были преобразователи USB-MIDI
        0
        Ему тоже нужен USB Host.

        Или бывают шнуры, которые можно одной стороной воткнуть в синт по MIDI, другой стороной в синт по USB, и при этом стоят в пределах $20-30?
        Если есть это было бы идеально.

        Arduino я не стал смотреть, потому что если что-то колхозить, лучше это сделать на том, что лучше знаешь. Моя цель была не поиграться с устройством, а соединить два устройства.
          0
          Про хост лично мне из текста непонятно. Можно тогда блок-схему приложить и пытаться двигать это решение как коммерческий продукт.
          На рынке их есть пара штук, от зарубежных товарищей и тоже на малине.
            0
            Коммерческие продукты я видел от $70-100 (и снятые с производства), что кмк дороговато для такой штуки.

            По ссылкам в конце статьи в обсуждениях тоже про коммерческие продукты что-то говорится, но я эти ссылки уже нашел после того как собрал себе устройство на малине.
              0
              Это не так дорого, за кастом вещь, с низким спросом. Да и реальность весьма сурова, даже просто приличный корпус встанет в кругленькую сумму.
                0
                Мне Raspberry Pi первой модели (с корпусом) + пересылка по России + SDCard к ней встала в общей сумме в 1500р или около того.

                Проблема в том, что чем закидывать $100 в миди-роутер можно закинуть эти же $100 в покупку синта или контроллера, у которых есть нормальные MIDI In/Out.
                Т.е. целевая аудитория еще сильнее сужается.
                  +1
                  Это разовая удача, а не система. Мне Pi ZeroW обошелся в 1200р, без сд карт, только в корпусе а-ля два кусочка оргстекла.

                  Музыканты — это особая каста. Может оказаться любимая мастерклава на 2 октавы, такие как, правило, не умеют в MIDI, а только USB. Или еще какая ситуация. Многие не приемлют ПК, к примеру.
                  Кроме того, линукс — не реалтайм, а значит начнет прилетать «аларм, лагает задержки, играть невозможно!»
                    +1
                    вот по последнему предложению неистово плюсую.
                    миди+комп — это всегда была зубная боль, в силу разных микролагов и приоритетов прерываний трек мог уплыть запросто. Штайнберг даже в своем midex 8 использовал фирменную технологию чтобы синхронизировать выдачу мидисообщений с тактами композиции.
                    Попадались и другие решения, вроде тактирования миди-переходника отдельной звуковой дорожкой, которая (с ASIO) не имела такого разброса по таймингу какой был у обычных миди-переходников и плат.
                    Не знаю как там ALSA от расбиан, насколько она дружит с JACK чтобы понять есть там вероятность появления задержки или нет, этот момент интересен.
                      0
                      Ну это был эксперимент, который оказался удачным :-)
                        0
                        В итоге практика показала, что для передачи нот оно подходит неважно — ноты частенько съезжают и проскакивают.

                        Для Clock более-менее нормально — в синхронизации арпеджиатора управляемого синта с мастер-ритмом косяков я не слышу.

                        А вот для передачи сообщений контроллеров, похоже, подходит идеально.
                        Теперь можно подключить Launch Control XL к любому синту.
                0
                на классической ардуине это и не сделаешь, она не увидится ни как миди-устройство на как USB-host.
                в принципе можно сделать на STM32.
                смысла особого не вижу, в студии можно и через комп гонять (там и роутер не нужен, обычно пишется все потреково), а таскать на лайвы/репетиции тяжелые старинные синты, которые могут помереть в любой момент от старости — так себе идея.
                хорошо сгодится только для стримов с dawless jamming :)
                  0
                  Мне нужно было на Novation Xiosynth подать секвенцию с Arturia Keystep.
                  Это, конечно, не последнее слово техники, но тяжелым старинным синтом я это не назову.

                  Другой случай, который потенциально я вижу — подключить Launchpad к синту в качестве клавиатуры.

                  Студию не рассматриваю, это отдельный мир со своими законами :-)
                    +1
                    Ради лола и фана делал из arduino micro, линейного потенциометра и сенсорной резистивной полоски девайс, определяющийся как USB-HID MIDI. Так же я нагуглил несколько примеров подключения через USB-host шилд к ардуине разных девайсов (например, мыши) и что-то мне думается, что если задаться целью, то и USB-HID MIDI устройство к ней можно подключить.
                      0
                      почитал, да, некоторые модели могут. просто у меня как-то отложилось что ардуина — это в первую очередь 8битный AVR+FTDI чип для связи по USB. А там где FTDI эмулируется самим контроллером — конечно можно и другой HID сделать.
                0
                Причем, по понятным причинам хочется все это сделать не используя компьютер.

                В какой-то момент меня осенило: можно же взять Raspberry Pi и сделать все на нем — это самый настоящий компьютер, а на нем такие вещи делаются легко.


                Вы уж определитесь, нужен компьютер или не нужен. :)
                Такие вещи, конечно, надо делать на микроконтроллере, если нужен хороший реалтайм.
                  +1
                  Есть и готовый продукт — USB Host Controller Board за 15 фунтов (без пересылки), но они-же продают и сам PIC24FJ64GB002 (£5.40) с соответствуюшим фирмваром. Правда, они сами пишут, что МИДИ хост не умеет работать с усб хабом — «Some Complex MIDI devices use a built-in USB Hub. These MIDI devices are not supported and will NOT work with our USB Host Board».
                    0
                    Т.е. предлагается этот борд скрестить с arduino? Интересный вариант, спасибо.

                  Only users with full accounts can post comments. Log in, please.