воскресенье, 25 октября 2009 г.

Музыка MIDI - улучшаем звук

У меня есть вся музыка из Doom, Doom 2, Doom Final: Plutonia Experiment, Doom Final: TNT в формате MIDI. При проигрывании музыки с помощью timidity, запущенной из консоли я обнаружил, что timidity ругается на отсутствие сэмплов некоторых музыкальных инструментов:
$ timidity BUNNY.MID
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 30104, period size 3760 bytes
Playing /home/stupin/music/Doom/Doom/BUNNY.MID
MIDI file: /home/stupin/music/Doom/Doom/BUNNY.MID
Format: 1  Tracks: 13  Divisions: 120
No instrument mapped to tone bank 0, program 31 - this instrument will not be heard
No instrument mapped to tone bank 0, program 123 - this instrument will not be heard
((c) 1994 by <IRC:#doom:just_joe> Productions.)(MUS2MIDI v0.9 - joakim.erdfelt@swsbbs.com)(prelim DEU Music/Sound project for 'DOOM')(DEU (c) 1993,1994 by Raphael Quinet)(DOOM (c) 1993,1994 by id software)Playing time: ~65 seconds
Notes cut: 0
Notes lost totally: 0
При этом, соответственно, слышны не все инструменты, что портит восприятие музыки. Например в первом эпизоде на третьем уровне вместо музыки фактически слышно один только монотонно повторяющийся синт-бас. Я стал искать музыкальные сэмплы для недостающих инструментов.

Выяснилось, что в Debian есть MIDI-секвенсор fluidsynth, в комплекте с которым идут два банка музыкальных инструментов формате Sound Font 2. Эти банки находятся в пакетах с именами fluid-soundfont-gm и fluid-soundfont-gs. Сам секвенсор мне запустить так и не удалось. Честно говоря мне этого и не особо-то хотелось, моей задачей было услышать полноценную музыку из Doom. Но зато я нашёл каким образом можно прикрутить эти банки к секвенсору timidity. Итак, пройдём весь процесс по шагам.

Сначала установим банки:
# aptitude install fluid-soundfont-gm fluid-soundfont-gs
Вносим исправления в настройки freepats - программы, предоставляющей timidity сэмплы инструментов. В файле /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
Теперь можно запускать timidity для прослушивания музыки из Doom. Кроме появления недостающих инструментов улучшилось общее качество воспроизведения: исчезли щелчки и искажения звука. Единственным недостатком секвенсора можно считать то, что он требует для своей работы изрядной вычислительной мощности процессора. Загрузка моего 2-гигагерцового Athlon доходила до 30-40%.

Кстати, с помощью timidity можно слушать не только MIDI-файлы. timidity хорошо воспроизводит IT-, STM- и XM-файлы. В таком формате была музыка в недрах Unreal и Unreal Tournament, которую я когда-то из них извлёк. Теперь я могу слушать эту музыку и в Linux!

суббота, 17 октября 2009 г.

Музыка в PrBoom

Продолжая тему запуска старых игр от id Software в Linux, хочу написать о PrBoom. PrBoom - это свободный движок игры Doom. У меня в Debian эта игра запускалась со звуком, но почему-то без музыки. Как оказалось, исправить этот недостаток довольно просто.

Во-первых, ставим пакет timidity:
# aptitude install timidity
Во-вторых, вносим в файл /etc/default/timidity следующие изменения:
TIM_ALSASEQ=true
В-третьих, перезапускаем MIDI-секвенсор:
# /etc/init.d/timidity restart
В каталоге /dev/ должно появиться устройство midi:
$ ls -la /dev/midi
crw-rw---- 1 root audio 14, 2 Окт 17 17:29 /dev/midi
Нужно убедиться, что пользователь который будет запускать игру, будет иметь доступ к этому устройству. Для этого пользователя достаточно включить в группу audio и при необходимости завершить сеанс и войти снова.

После всех этих действий prboom всё равно не воспроизводил музыку и я обратился к страницам руководства. После непродолжительного чтения, я узнал что все настройки prboom'а находятся в файле ~/.prboom/prboom.cfg.

Поиск по файлу конфигурации слова music дал следующие две опции: music_card, music_volume.

Опция music_card располагалась под опцией sound_card, но в отличие от неё имела другое значение:
sound_card                   -1
music_card                   0
После того, как я заменил значение опции music_card на -1, музыка заработала.

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

Чтобы поиграть в оригинальный Doom, нужно взять от игры для DOS файл с расширением WAD и указать PrBoom'у использовать его. Например вот так можно запустить первый Doom:
$ prboom -IWAD DOOM.WAD
Игра хоть и старая, но кто однажды стал её фанатом, тот её никогда не забудет. Я умею играть на сложности Ultra Violence пользуясь только лишь одной клавиатурой. Да и тем, кто её никогда не видел, может понравиться, если не рассматривать её как замену более поздним играм, а относиться к ней как какой-нибудь казуальной игре вроде тетриса или зумы.

Ну и напоследок, несколько скриншотов.

FreeDoom:

Doom Ultimate E1M1. Перед входом в первую мясорубку:

Doom Ultimate E1M1. После выхода из мясорубки осталось мало здоровья - или бейся или фоткай:

среда, 14 октября 2009 г.

rtorrent + rutorrent

В последнее время нахожусь в поисках оптимального torrent-клиента. Когда-то я пользовался transmission-daemon в купе с web-интерфейсом clutch, затем пересел на rtorrent, запущенный в сеансе screen. При необходимости управлял им через ssh.

Недавно снова попробовал свежую версию transmission-daemon. Как оказалось, в свежей версии transmission-daemon web-клиент уже встроен вовнутрь демона. Работает без падений - всё отлично, но хочется рассмотреть по возможности побольше вариантов, чтобы выбрать оптимальный.

Недавно я наткнулся на лестные отзывы о web-интерфейсе rutorrent для rtorrent. Сам интерфейс очень похож на web-интерфейс (и на GUI-интерфейс) программы uTorrent.

web-интерфейс будет обслуживаться web-сервером lighttpd, а rtorrent будет запущен в screen-сеансе. Для работы web-интерфейса нам понадобится PHP, а для настройки ограничения доступа - утилита htdigest из пакета apache2-utils. Если вы не хотите её устанавливать, то вместо неё можете воспользоваться следующим сценарием lightdigest.sh.

Поставим необходимое нам:
# aptitude install rtorrent screen lighttpd php5-cgi apache2-utils
Для начала я создал простенький файл конфигурации ~/.rtorrent.rc для rtorrent в домашнем каталоге пользователя, от имени которого будет работать rtorrent:
port_range = 6925-6925
directory = /home/rtorrent
session = /home/rtorrent/.rtorrent-session/
load_start = /home/rtorrent/torrents/*
scgi_port = 127.0.0.1:5000
port_range - опция задаёт диапазон TCP-портов, который будет прослушиваться в ожидании подключения других torrent-клиентов и будет анонсироваться трекерам. В данном случае это всего один TCP-порт 6925. Если его не указать, то при каждом запуске rtorrent будет слушать и анонсировать случайный диапазон портов. Задаю я этот параметр по одной простой причине - чтобы потом проковырять в фаерволле соответствующую дырочку.
  • directory - опция задаёт каталог, в который будет производиться закачка.
  • session - опция задаёт каталог, в который будут помещаться активные торренты. При перезапуске rtorrent эти торренты автоматически будут возобновлены.
  • load_start - задаёт имена торрент-файлов, которые необходимо добавить к текущему сеансу.
  • scgi_port - настраивает прослушивание управляющего TCP-порта. Управление происходит по протоколу XML-RPC.
Теперь настроим lighttpd, добавим в файл /etc/lighttpd/lighttpd.conf следующие настройки:
server.modules += ( "mod_fastcgi" )

fastcgi.server = (
  ".php" =>
  (
    (
      "bin-path" => "/usr/bin/php5-cgi",
      "socket" => "/tmp/php.socket",
      "max-procs" => 2,
      "idle-timeout" => 20,
      "bin-environment" =>
      (
        "PHP_FCGI_CHILDREN" => "1",
        "PHP_FCGI_MAX_REQUESTS" => "10000"
      ),
      "bin-copy-environment" =>
      (
        "PATH",
        "SHELL",
        "USER"
      ),
      "broken-scriptfilename" => "enable"
    )
  )
)

server.modules += ( "mod_scgi" )

scgi.server = (
  "/RPC2" =>
  (
    "127.0.0.1" =>
    (
      "host" => "127.0.0.1",
      "port" => 5000,
      "check-local" => "disable",
      "disable-time" => 0,
    )
  )
)

server.modules += ( "mod_auth" )

auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/htdigest"

auth.require = (
  "/RPC2" =>
  (
    "method" => "digest",
    "realm" => "rTorrent RPC",
    "require" => "user=rtorrent"
  )
)
Этот фрагмент включает и настраивает три плагина lighttpd:
  1. fastcgi - для обслуживания php-сценариев web-интерфейса,
  2. scgi - для проксирования обращений к URL'у "/RPC2" на локальный TCP-сокет 5000,
  3. auth - для ограничения доступа к этому URL'у по имени пользователя и паролю.
С помощью утилиты htdigest создадим файл с паролем для пользователя rtorrent и области "rTorrent RPC":
# htdigest -c /etc/lighttpd/htdigest "rTorrent RPC" rtorrent
Если в файле паролей уже есть какие-то записи, то предыдущую команду выполним без опции "-c", чтобы файл не был перезаписан, а был только лишь дополнен новой записью. Соответственно, если вы уже использовали авторизацию по htdigest, файл паролей может находиться в другом месте, в том куда вы его до этого положили. В таком случае нужно поправить путь к файлу паролей в опции auth.backend.htdigest.userfile, указанной в фрагменте /etc/lighttpd/lighttpd.conf выше.

Теперь пришло время скачать со страницы http://code.google.com/p/rutorrent/downloads/list архив rtorrent с файлами web-интерфейса rutorrent. Остальные перечисленные на этой странице файлы являются плагинами к rutorrent.
$ wget http://rutorrent.googlecode.com/files/rtorrent-2.7.tar.gz
Создадим каталог для размещения файлов из архива:
# cd /var/www
$ mkdir rutorrent
И распакуем архив в него:
# tar xzvf rtorrent-2.7.tar.gz -C /var/www/rutorrent
Видим, что файлы распаковались в каталог /var/www/rutorrent/rtorrent. Мне это не понравилось, я переместил файлы так, как и было изначально мной задумано:
# cd /var/www/rutorrent
# mv rtorrent/* .
# rmdir rtorrent
Теперь дадим приложению права на запись в каталоги torrents и settings:
# chown www-data:www-data torrents settings
Заходим по адресу http://ваш-IP/rutorrent, проходим аутентификацию и изучаем интерфейс:

Примечания:
  1. При работе web-интерфейса выяснилось, что он неплохо умеет ронять rtorrent.
  2. Пищу для дальнейших размышлений на тему улучшения системы даёт сообщение web-интерфейса: "rTorrent скомпилирован с некорректной версией библиотеки xmlrpc-c, без поддержки 8-байтовых целых. Версия библиотеки должна быть >= 1.11. Часть функциональности будет недоступна."
  3. Заметка пока-что оставляет за кадром вопросы автозапуска rtorrent в сеансе screen, возможно в скором времени я доберусь до этого вопроса.
  4. Возможно я пропустил установку и настройку каких-то жизненно важных для работы связки пакетов.
Список использованных материалов:
  1. rutorrent - главная страница
  2. http://libtorrent.rakshasa.no/wiki/RTorrentXMLRPCGuide
  3. Lighttpd - mod_fastcgi - настройки модуля fastcgi один в один совпадают с настройками модуля sgci, поэтому документацию на модуль scgi нужно смотреть тоже здесь.