пятница, 18 мая 2012 г.

Настройка воспроизведения MIDI в Debian GNU/Linux

С MIDI я разбирался несколько раз. Первый раз я настраивал воспроизведение MIDI для игры Doom (Музыка в PrBoom). Потом я ставил дополнительные сэмплы для того, чтобы улучшить качество воспроизведения музыки в Doom и заставить звучать те инструменты, сэмплы которых не входили в комплект программного секвенсора timidity (Музыка MIDI - улучшаем звук). Потом я купил подержанную звуковую карту Creative SoundBlaster Live 5.1! и настроил аппаратный её секвенсор.

Возможно кто-то удивится и не поймёт, зачем мне устаревшая подержанная звуковая карта? Объясняю - преимущество этой звуковой карты заключается в том, что она имеет собственную память объёмом 32 мегабайта. В эту память можно загрузить микропрограммы с эффектами или фильтрами для звука, а можно загрузить сэмплы. Современные звуковые карты во-первых зачастую уже не имеют аппаратных секвенсоров MIDI, т.к. MIDI на компьютерах давно вышел из моды, а во-вторых - используют для своих нужд прямой доступ к оперативной памяти компьютера. С одной стороны это может быть и хорошо, потому что звуковая карта может использовать сэмплы, общий объём которых ограничен только объёмом оперативной памяти компьютера, а с другой стороны это не очень хорошо, т.к. при этом звуковая карта теряет автономность и становится сильно зависимой от пропускной способности шины.

Мне же иногда хочется играть в старые игры для DOS, которые запускаются в DosBox в режиме частичной эмуляции. В старых играх мне хочется слышать ту MIDI-музыку, которая была сделана специально для игры и была встроена в неё. Но, поскольку мой компьютер староват, вычислительной мощности процессора иногда не хватает на одновременную частичную эмуляцию среды Dos и синтеза звука программным MIDI-секвенсором. В таких случаях звук начинает заикаться, а игра притормаживать. Выхода три: 1. отказаться эстетствовать и не слушать музыку в старых играх, а то и вовсе в них не играть, 2. купить мощный компьютер, что чревато лишними расходами и дополнительными хлопотами, 3. купить подходящую звуковую карту, а заодно узнать что-то новое о настройке аппаратных MIDI-секвенсоров.

Довелось мне даже испытать работу MIDI-клавиатуры (с интерфейсом USB), которую давал мне друг. Интересно, что она определилась и заработала сходу - мне для этого не понадобилось ставить никаких драйверов, не пришлось делать каких-то настроек. Я просто поставил Rosegarden (аналог Cakewalk для Linux) и клавиатура с ним прекрасно заработала.

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

1. Список секвенсоров

Узнать список доступных MIDI-секвенсоров можно с помощью следующей команды:
$ aplaymidi -l
У меня эта команда выдаёт следующее:
Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 16:0    SB Live! 5.1 Dell OEM [SB0228]   EMU10K1 MPU-401 (UART)
 17:0    Emu10k1 WaveTable                Emu10k1 Port 0
 17:1    Emu10k1 WaveTable                Emu10k1 Port 1
 17:2    Emu10k1 WaveTable                Emu10k1 Port 2
 17:3    Emu10k1 WaveTable                Emu10k1 Port 3
 20:0    CA0106                           CA0106 MPU-401 (UART)
Аппаратному MIDI-секвенсору соответствуют порты 17:0, 17:1, 17:2, 17:3. Дополнительные его характеристики можно узнать с помощью следующей команды:
$ cat /proc/asound/card0/wavetableD1
Которая должна выдать примерно следующую информацию:
Device: Emu10k1
Ports: 4
Addresses: 17:0 17:1 17:2 17:3
Use Counter: 0
Max Voices: 64
Allocated Voices: 0
Memory Size: 134217728
Memory Available: 134213632
Allocated Blocks: 1
SoundFonts: 0
Instruments: 0
Samples: 0
Locked Instruments: 0
Locked Samples: 0
2. Программный секвенсор timidity

При отсутствии аппаратных MIDI-секвенсоров (секвенсоров, имеющихся прямо в звуковой карте) можно установить программный MIDI-секвенсор:
# apt-get install timidity
Вместе с timidity будет установлен набор семплов (иначе называемых Gravis Ultra Sount Patches или коротко - GUS-патчей) freepats.

3. Улучшенные сэмплы в timidity

Набор семплов, устанавливаемый freepats, не полный и не отличается высоким качеством, поэтому можно установить дополнительный набор патчей из состава fluidsynth:
# apt-get install fluid-soundfont-gm fluid-soundfont-gs
В файле /etc/timidity/freepats.cfg добавляем следующие строчки (я добавил в начало):
dir /usr/share/sounds/sf2/
soundfont FluidR3_GM.sf2 order=0
soundfont FluidR3_GS.sf2 order=1
И перезапускаем секвенсор:
# /etc/init.d/timidity restart
4. Программный секвенсор fluidsynth

Имеется альтернативный программный MIDI-секвенсор, который называется fluidsynth. Установить его можно следующей командой:
# apt-get install fluidsynth
Секвенсор fluidsynth не имеет сценария инициализации, поэтому для его запуска необходимо написать простенький сценарий инициализации или запустить его вручную, например так:
$ fluidsynth -a alsa -i /usr/share/sounds/sf2/FluidR3_GM.sf2 -i /usr/share/sounds/sf2/FluidR3_GS.sf2 -m alsa_seq -r 44100 -s
5. Аппаратный секвенсор

Если в вашей звуковой карте имеется аппаратный MIDI-секвенсор, необходимо подгрузить модуль ядра snd-emu10k1-synth:
# modprobe snd-emu10k1-synth
Если в выводе lsmod появится подгруженный модуль, значит аппаратный MIDI-секвенсор в вашей звуковой карте есть и для его использования необходимо загрузить в звуковую карту сэмплы.

Для загрузки семплов в звуковую карту необходимо установить пакет awesfx:
# aptitude install awesfx
Загрузить сэмплы из пакетов fluid-soundfont-gm и fluid-soundfont-gs можно с помощью команд:
$ asfxload /usr/share/sounds/sf2/FluidR3_GM.sf2
$ asfxload -N /usr/share/sounds/sf2/FluidR3_GS.sf2
Первая команда загружает сэмплы вместо имеющихся, а вторая - добавляет сэмплы к имеющимся.

Для автоматической подгрузки модуля ядра при загрузке системы необходимо добавить модуль snd-emu10k1-synth в файл /etc/modules.

6. Выбор секвенсора по-умолчанию

Для настройка MIDI-секвенсора по умолчанию для определённого пользователя нужно прописать в его файл ~/.bashrc следующие строчки:
ALSA_OUTPUT_PORTS="17:0 17:1 17:2 17:3"
export ALSA_OUTPUT_PORTS
Предполагается, что оболочкой по умолчанию у пользователя назначен bash. Настройки вступают в силу при входе пользователя. Для временного применения настроек по умолчанию (до конца сеанса пользователя) можно выполнить эти команды прямо из командной строки.

7. Воспроизведение музыки

Воспроизвести музыку можно с помощью любого проигрывателя, поддерживающего воспроизведение MIDI, например pmidi:
# apt-get install pmidi
Воспроизведение музыки:
$ pmidi track.mid

7 комментариев:

Анонимный комментирует...

Когда-нибудь на смену MIDI, возможно, придет новая технология. Пока же нет не только конкурирующей технологии, но даже намека на таковую.

Unknown комментирует...

статья огонь! люто оргазмирую

Сысбургер комментирует...

Спасибо за статью. Наконец-то я нашёл, чем воспроизводить MIDI в GNOME. Я искал аналог KDE-шного KMid, нашёл pmidi :-)
А есть ли смысл заменять дефолтные soundfont на soundfont от fluidsynth? На YouTube-канале Old Robot также советуют 32-мегабайтный MasterPiece.sf2
Кстати, у меня проблемы с модулем snd-emu10k-synth. Я запускаю Doom в DosBox, и когда рычат сразу много монстров, то звук заикается. Если перезапустить DosBox, то всё работает нормально. А если вместо этого модуля использовать snd-seq (не путать с snd-seq-oss), то такой проблемы нет. Возможно, что эта проблема PulseAudio, а с чистой ALSA такого нет.
В PrBoom работает MIDI? Замечательно! Надо попробовать. А я пробовал в hheretic (это Source-порт Heretic). MIDI не играет (хотя там используется SDL 1.2, как и в DosBox). Я завёл баг-репорт - разработчики сказали, что если я предложу патч, то его примут. А сами делать не хотят (порт 2008 года)

morbo комментирует...

>А есть ли смысл заменять дефолтные soundfont на soundfont от fluidsynth?

Смысл есть. Я написал в статье, что в семплах freepats, которые устанавливаются по умолчанию, некоторые инструменты отсутствуют.

>На YouTube-канале Old Robot также советуют 32-мегабайтный MasterPiece.sf2

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

32MbGMStereo.sf2

FantaGM32.sf2

>Возможно, что эта проблема PulseAudio, а с чистой ALSA такого нет.

Возможно. Не пользуюсь PulseAudio.

Анонимный комментирует...

Ничего не работает из приведенного выше! Плата SB X-Fi Platinum.

morbo комментирует...

Это печально. Хотя программный синтезатор Timidity должен работать даже на тех звуковых картах, которые про MIDI ничего не знают и умеют просто воспроизводить звук.

Unknown комментирует...

У меня нет файла /etc/timidity/freepats.cfg