Как я могу воспроизвести MIDI-файл с терминала?

29

Я ищу самое простое приложение командной строки (или встроенный инструмент на Mavericks, о котором я не знаю) для воспроизведения файла midi из терминала. Как можно проще, что-то вроде play myfile.mid.

Контекст: я играю с миди в Python, и мне нужно что-то, что я могу запустить из скрипта. Нет графического интерфейса, нет окон, просто воспроизведение. Он должен быть вызван из скрипта Python, чтобы быть принятым, но все, что работает в терминале, должно быть.

DCS
источник

Ответы:

36

Это оказалось более сложной проблемой, чем я первоначально ожидал.

QuickTime X не может воспроизводить MIDI-файлы, хотя QuickTime 7 может.

Насколько я могу судить, это означает, что не существует «встроенного» решения для воспроизведения MIDI-файлов в Mac OS X (например, afplayне работает). Поэтому я считаю, что любое решение будет связано с загрузкой и установкой какой-либо другой программы.

Вариант № 1: Загрузите и установите QuickTime 7, который по-прежнему отлично работает на Mavericks, а затем вы можете воспроизводить MIDI-файлы:

open -a QuickTime\ Player\ 7 /path/to/your/file.mid 

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

Вариант № 2: использовать FluidSynth

Чтобы установить его, вы должны использовать Fink, MacPorts или (по моей рекомендации) Homebrew. Как только Homebrew установлен, введите это в Терминале:

brew install fluidsynth

(Команда MacPorts будет, sudo port install fluidsynthа команда Финка будет fink install fluidsynth.)

Тем не менее, загрузка fluidsynthтолько дает вам часть пути туда. Тогда вам нужен файл "SoundFont", о котором я никогда раньше не слышал. Здесь есть информация о них

Я скачал один из S. Christian Collins под названием «GeneralUser», который является бесплатным. Текущая версия (по состоянию на 2013-11-27) - версия 1.44 FluidSynth . {Если эта прямая ссылка прекратит работу в будущем, используйте предыдущую ссылку, которая приведет вас на обычную веб-страницу для GeneralUser.}

После того, как вы загрузили и распаковали его, у вас будет ряд файлов, включая «GeneralUser GS FluidSynth v1.44.sf2» (очевидно, имя может измениться в будущем). Я переименовал этот файл и переместил его в /usr/local/share/fluidsynth/generaluser.v.1.44.sf2.

Как только файл SoundFont будет размещен и fluidsynthустановлен, вы можете воспроизвести миди с помощью этой команды:

fluidsynth -i /usr/local/share/fluidsynth/generaluser.v.1.44.sf2 ~/Music/example.mid 

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

(fluidsynth -i /usr/local/share/fluidsynth/generaluser.v.1.44.sf2 ~/Music/example.mid 2>&1) >/dev/null

вместо.

Очевидно, я никогда не буду помнить все это, поэтому я сделал zshфункцию под названиемplaymidi

function playmidi {

    SOUNDFONT='/usr/local/share/fluidsynth/generaluser.v.1.44.sf2'

    if [ -e "$SOUNDFONT" ]
    then 

        for i in "$@"
        do 
            if [ -e "$i" ]
            then
                (fluidsynth -i "$SOUNDFONT" "$i"  2>&1) >/dev/null
            else
                echo "[playmidi]: cannot find file at $i"   
                return 1
            fi  
        done 
    else
            echo "[playmidi]: SOUNDFONT file not found at $SOUNDFONT"
            return 1
    fi  
}

(Это должно работать на bashслишком я верю.)

Теперь все, что мне нужно сделать, это набрать:

playmidi example.mid 

и example.midбудет играть.

Ти Джей Луома
источник
StackExchange в лучшем виде! Хотя параметр fluidsynth гораздо более хакерский, чем я готов был принять (не у всех установлен brew ...), он работает действительно хорошо и запускается в скрипте быстрее, чем VLC. Поэтому я подожду день или два, если появится какое-то смехотворно простое альтернативное решение, но если нет, то щедрость ваша. Кстати, для меня Fluid-Synth появляется в /usr/local/Cellar/fluid-synth/1.1.6. (Мне не нравится старая версия решения Quicktime, вы никогда не знаете, как долго это будет работать).
DCS
Да, я согласен с тем, что «использовать Homebrew | MacPorts | Fink» не идеал, но а) любой, кто тратит какое-то время на использование командной строки, обнаружит, что хочет большего, чем то, что Apple может / может обеспечить, и б) Отсутствие встроенного решения показалось здесь разумным. Что касается QuickTime7, я согласен, он выжил дольше, чем я предполагал, но ОТО, я не могу поверить, что «QuickTime X» все еще не может делать то, что мог QuickTime 7. (Я боюсь будущего iWork, но это еще одно обсуждение другой темы в другой день :-)
TJ Luoma
Недавний выпуск iWorks фактически был поврежден по сравнению с прошлой версией ... Я только жду, пока Терминал исчезнет. Но хватит, иначе нас будут болтать за болтовню.
DCS
@DCS Мы не будем критиковать жалобы. В худшем случае мы попросим, ​​чтобы они появлялись в чате или открывали новую ветку, если это оправдано. Также я отредактировал некоторые детали из вашего поста. Пожалуйста, добавьте эту информацию в качестве ответа или отредактируйте один из ответов, если эта информация соответствует им.
bmike
Я попробовал это на Йосемити и не смог заставить его работать. Я даже удалил и переустановил порты Mac. Ошибка: fluidsynth: предупреждение: предустановка на канале 9 не найдена [банк = 128 prog = 56] не может обработать запрос внешнего клиента. Джек Майн поймал сигнал 31.
Роберт Васман
35

Это сработало для меня:

$ brew установить робость
$ timidity file.midi
lyderic
источник
Сработало и для меня - и это гораздо меньше проблем, чем ответ, связанный с Fluidsynth.
Гленра
1
Лучший ответ здесь. Ответ Fluidsynth действительно умный, но он может сломаться в какой-то момент (если он еще этого не сделал), потому что он намного сложнее, чем этот.
Westcroft_to_Apse
Это не сработало для меня. После выполнения первой команды, приведенной выше, я запустил вторую и получил следующее сообщение:file.midi: No such file or directory
user65526
5

Вы можете использовать VLC с неинтерактивным интерфейсом CLI с -I dummy:

/Applications/VLC.app/Contents/MacOS/VLC -I dummy file.mid vlc://quit

Чтобы включить поддержку midi, перейдите в «Настройки»> «Показать все»> «Ввод / Кодеки»> «Аудиокодеки»> «Fluid Synth» и установите для SoundFont такой файл, как «SoundFont FluidSynth», по адресу http://www.schristiancollins.com/generaluser.php .

Редактировать: поддержка MIDI была удалена из последней версии VLC. Вы все еще можете использовать Fluidsynth из оболочки, как описано TJ Luoma:

brew install fluidsynth
wget http://www.schristiancollins.com/soundfonts/GeneralUser_GS_1.44-FluidSynth.zip
unzip GeneralUser_GS_1.44-FluidSynth.zip
mkdir -p /usr/local/share/fluidsynth
mv GeneralUser\ GS\ 1.44\ FluidSynth/GeneralUser\ GS\ FluidSynth\ v1.44.sf2 /usr/local/share/fluidsynth
fluidsynth -i /usr/local/share/fluidsynth/GeneralUser\ GS\ FluidSynth\ v1.44.sf2 file.mid
LRI
источник
1
Работает! Тем не менее, VLC, будучи полноценным супер проигрывателем, имеет очень заметную задержку запуска перед началом воспроизведения, чего не было в моем небольшом приложении Windows с названием playsmf.exe. Это не убивает VLC для моей цели, но иметь что-то меньшее было бы неплохо. Я подожду несколько дней, чтобы посмотреть, появится ли другой ответ; если нет, я приму твое. BTW: vlc: // quit должен быть добавлен к аргументам, чтобы выйти из VLC и позволить моему сценарию возобновиться.
DCS
Смотрите мое обновление выше - блин, раньше это работало хорошо!
DCS
Можно ли использовать старую версию VLC?
wrossmck
@RossMcKinley: Хотя технически это возможно, это, конечно, не то, что я хочу сделать. По какой-то причине программное обеспечение обновлено, и я хочу, чтобы такая тяжелая программа, как VLC, была обновлена ​​в моей системе. Это было бы иначе, если бы это был просто мини-инструмент размером 100 Кб, но VLC не такой.
DCS
1

Согласно этому сообщению на собственных форумах VLC , администратор сайта Феликс Пол Кюне сказал:

Здравствуйте, видимо, FluidSynth потерялся в процессе компиляции для последнего обновления. Будьте уверены, что он вернется в 2.1.2 очень скоро!

Так что сейчас либо перейдите на vlc 2.0.9, либо дождитесь vlc 2.1.2. Таким образом, ваше существующее решение будет работать как раньше.

wrossmck
источник
К сожалению, это не работает с VLC 2.2.1 (ноябрь 2015)
Джесс Ридель
1

Не совсем ответ, но есть небольшое приложение, которое может отправлять промежуточные данные в командной строке Mac OS X. Он также может управлять основными функциями GarageBand: http://www.bibiko.de/music/MIDImyAPP/

user72160
источник
эй, спасибо, это именно то, что я искал, почему я просматривал сообщения на midi на stackexchange
forgotstackxpassword
0

Чтобы сделать вещи более удобными, вы можете обернуть ответ TJ Luoma в приложение AppleScript:

on open inputFile
    tell application "Terminal"
        do script "fluidsynth -i /usr/local/share/fluidsynth/generaluser.v.1.44.sf2 " & (quoted form of POSIX path of inputFile as string)
        activate
    end tell
end open

Затем вы можете выбрать «Получить информацию о случайном файле .mid», изменить «Открыть с помощью» на приложение AppleScript и нажать «Изменить все ...», чтобы сделать его стандартным способом открытия файлов .mid. Теперь, когда вы дважды щелкните по MIDI-файлу, он откроет окно терминала и воспроизведет его автоматически.

user3932000
источник
конечно, это может быть полезно для некоторых людей в целом, но операционная служба спрашивала о значении командной строки;)
forgotstackxpassword
Ой, извините, неправильно прочитал вопрос!
user3932000