Утилита:SoundSense

Материал из Dwarf Fortress Wiki
Перейти к навигацииПерейти к поиску


Announce agreement icon.png Данная статья помечена как не оконченная.
Вы можете прочитать эту статью на английском или помочь проекту её переводом.

Soundsense - это утилита (звуковой движок), заменяющая одну единственную музыкальную композицию в игре на различные звуки и музыку, в зависимости от контекста и текущего события. Например, когда в игре появляется надпись "It has started raining.", то из колонок будет доноситься звук дождя. Утилита позволяет гибкую настройку, какие события озвучивать или нет, добавлять свои собственные музыкальные композиции.

Обсуждение: http://www.bay12forums.com/smf/index.php?topic=60287.0
Страница проекта: http://df.zweistein.cz/soundsense/
Ссылка на DFFD: http://dffd.bay12games.com/file.php?id=11849
Исходники: https://code.google.com/archive/p/df-soundsense/

Установка

Детальные инструкции по установке находятся на официальном сайте, в разделе Installation.

  • Установите java runtime 7, если у вас её ещё нет.
  • Скачайте и распакуйте SoundSense в папку с игрой.
  • Переместите скрипты и плагины для dfhack в папку hack.
  • Запустите soundsense.exe и нажмите кнопку update soundpack.

При первом запуске SoundSense сам предложит автоматически обновить пак с музыкой. Базовая версия содержит очень мало звуков, так что рекомендуется произвести обновление пака с музыкой (автоматом скачается вот этот пак).

Имейте ввиду, что SoundSense должен работать в фоне и, в идеале, быть запущенным до самого DF.

Если вы пользуетесь the Lazy Newb Pack, то SoundSense уже присутствует там и устанавливать его не надо - только обновить пак с музыкой через update soundpack.

Решение проблем

Запуск на MacOS

SoundSense был написан и протестирован только на Windows и Linux, однако может, теоретически, работать на любой ОС с поддержкой java. В случае проблем с запуском на Маке, разработчик предлагает ознакомиться с данным постом на официальном форуме.

Ошибки java

Если вдруг вы увидите сообщение типа ['java' is not recognized as an internal or external command] — значит, у вас не установлена java, или установлена неправильно. В последнем случае проблема решается правкой файла soundSense.cmd (он лежит в папке SoundSense). Откройте его блокнотом, найдите строку начинающуюся со слов "java -Dja..." и замените "java" на полный путь к исполняемому файлу java. Например: "C:\Program Files\Java\jdk1.6.0_20\bin\java.exe"

Моменты тишины

Бывает, что музыка останавливается на небольшой период (на 10, 20 или 30 секунд). Это не баг, а фича. Сделано для того, чтобы давать ушам отдохнуть. Так же некоторые треки имеют тихое начало или невысокую громкость. Если же вы не уверены, что звук проигрывается - всегда можно открыть интерфейс SoundSense и посмотреть что сейчас играет. В случае запланированной тишины там будет об этом написано.

Случайная музыка при запуске игры

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

Режим приключенца - мало звуков\музыки

Режим приключенца должен работать, вроде бы. Музыка и звуки во время боя - точно (работает так же как и в режиме крепости). Но в остальном игра не логирует множество вещей в этом режиме, а потому и SoundSense не может определить и запустить нужную музыку или звуки. Например сообщение о встрече с мегабистом или квестовым мобом отображается в сообщениях, но в лог не идет.

Отслеживание событий: лучше поздно чем никогда?

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

Отчасти это из-за того, что работает механизм, препятствующий реакции на слишком большое количество ложных событий. Так же подобное может возникнуть из-за высокого показателя FPS или из-за постановки игры на паузу.

Совместимость с другими модами DF: Должно работать, но никаких обещаний

SoundSense изначально был задуман для ванильной, немодифицированной версии Dwarf Fortress. Должен работать нормально с большинством модов, однако гарантировать совместимость со всеми автор не может. Некоторые моды (например тотальные конверсии) могут быть причиной нестандартного поведения SoundSense, а так же могут создавать события, которые нет возможности отследить.

Другими словами SoundSense не содержит звуков для событий, которые присущи модам (например звуков стрельбы из огнестрельного оружия), однако вы можете модифицировать его чтобы они там были.

On some Linux

Error on 'soundSense.sh' call: "/bin/sh^M : wrong interpret"

File "soundSense.sh" has CR+LF characters at lines ending. Convert these characters to a more suitable form, with a tool like "dos2unix":

 dos2unix soundSense.sh

Shell script should then be run without previous error.

Also using sed you can try this:

 # IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
 sed -i -e 's/\r$//' ./soundSense.sh

IF launching .sh file after that, says that something is wrong on the last line, when you try to launch sh. Just check, if "fi" is present there instead of "f" or smth like that.

Error at playing any MP3 file: "javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file: could not get audio input stream from input file"

Your Java virtual machine failed at reading MP3 files as audio stream. This could fix by adding to JVM an extra plugin: JMF MP3 Plugin. Download plugin, and put *.jar files into your JVM "lib/ext/" directory.

Error at playing any MP3 file: "javax.sound.sampled.LineUnavailableException: Audio Device Unavailable"

Whereas your JVM succeeded in reading MP3 file as audio stream, it failed to access to an audio device. If your audio system uses Alsa, you could install "aoss" utility, and "soundSense.sh" will call it. On Debian, package "alsa-oss" provides this utility. Note: if you are on Ubuntu see below. Ubuntu uses PulseAudio backend, therefore toying with aoss is a waste of time.

Goddammit I'm using PulseAudio and I still can't hear anything!

First, be sure that you are using OpenJDK 7; you can't use OpenJDK 6 as it has quiet a serious bug in its ALSA backend[1]. You can check what java you have installed by typing

 java -version

in the terminal. You can install OpenJDK like this in Ubuntu:

 sudo apt-get install openjdk-7-jdk
 sudo update-alternatives --set java /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java

(The "update-alternatives" command will only work on 64bit Ubuntu; for 32bit version you need to replace the "amd64" with "i386" or something like that.)

Now, check the

 /etc/java-7-openjdk/sound.properties

file for this:

 # OpenJDK on Ubuntu is configured to use PulseAudio by default
 javax.sound.sampled.Clip=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 javax.sound.sampled.Port=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 javax.sound.sampled.SourceDataLine=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 javax.sound.sampled.TargetDataLine=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 
 # PulseAudio not running? Please give feedback on LP: #407299.
 #javax.sound.sampled.Clip=com.sun.media.sound.DirectAudioDeviceProvider
 #javax.sound.sampled.Port=com.sun.media.sound.PortMixerProvider
 #javax.sound.sampled.SourceDataLine=com.sun.media.sound.DirectAudioDeviceProvider
 #javax.sound.sampled.TargetDataLine=com.sun.media.sound.DirectAudioDeviceProvider

This will not work, as OpenJDK's PulseAudio backend is buggy as hell. What you need to do is to comment out the PulseAudio and turn back on the old backend:

 # OpenJDK on Ubuntu is configured to use PulseAudio by default
 #javax.sound.sampled.Clip=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 #javax.sound.sampled.Port=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 #javax.sound.sampled.SourceDataLine=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 #javax.sound.sampled.TargetDataLine=org.classpath.icedtea.pulseaudio.PulseAudioMixerProvider
 
 # PulseAudio not running? Please give feedback on LP: #407299.
 javax.sound.sampled.Clip=com.sun.media.sound.DirectAudioDeviceProvider
 javax.sound.sampled.Port=com.sun.media.sound.PortMixerProvider
 javax.sound.sampled.SourceDataLine=com.sun.media.sound.DirectAudioDeviceProvider
 javax.sound.sampled.TargetDataLine=com.sun.media.sound.DirectAudioDeviceProvider

This should make the sound work. (If you don't know how to edit this then try typing "sudo nano /etc/java-7-openjdk/sound.properties" in the terminal.)

If you're using Sun/Oracle's JRE then switch to OpenJDK. If you don't want to do that (not recommended) then you might try to use the padsp wrapper or install osspd. If the padsp wrapper will not work properly for you then osspd daemon might just do the trick. (Archlinux Pulseaudio user)

Нашли недокументированный баг? Напишите об этом!

На официальном форуме Dwarf Fortress есть тема по SoundSense. Все пожелания и сообщения о багах принимаются там.

В случае каких-либо проблем указывайте в сообщении какие моды вы используете. Если SoundSense ведет себя странно только у вас, то это может быть связано именно с ними.

Customization

You can insert additional sounds and music into SoundSense by adding entries to an .xml configuration file. logPattern="regexp" is a regular expression which, if matched, will cause a random soundFile from a list to be played. (Details on how java uses regular expressions: http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html )

Sound element attributes:

  • logPattern — regular expression matching log line (see link above)
  • channel — string; Specifies a channel on which sound is played. Sounds played on a channel can be looped or stopped prematurely.
  • loop — string; Specifying "start" will start looping a sound on a channel until an expression with "stop" is triggered or until a different loop sound is played on the same channel. (If a non-looped sound is triggered on the same channel, this loop will resume when the non-looped is done playing.)
  • concurency — number; The number of concurrent (i.e., simultaneous) sounds allowed to be played besides this sound. If SoundSense is currently playing more than this, the sound is ignored. The default is unlimited.
  • timeout — number; This initiates a time out during which this particular sound is prevented from playing again. This is measured in milliseconds and the default is 0.
  • delay — number; Adds a delay before the sound is played. This is measured in milliseconds and the default is 0.
  • haltOnMatch — boolean; If this is set to True and more than one equivalent logPattern exists, SoundSense will only process the first logPattern expression. If it is False, it will continue to process matching (e.g., identical) logPatterns. The default is True.
  • speech — boolean; If this is set to True, SoundSense will echo the gamelog text line (containing the logPattern) with a speech synthesizer instead of playing a sound. The default is False.
  • playbackThreshhold — number, 0-4, defines level of filter which is applied to this sound.

SoundFile element attributes:

  • fileName — the path to and name of the sound/music file
  • weight — number; This controls the likelihood of a sound being chosen. Default is 100.
  • volumeAdjustment — number; This can be used to adjust the volume of the sample. The value can range from -40 to +6 decibles and the default is 0.
  • randomBalance — boolean, if set to true will randomply distribute sound betweem stereo channels.
  • balanceAdjustment — number, adjusts stereo channel, can range for -1 (full left) to 1 (full right).

SoundSense supports these audio formats for soundFiles:

  • mp3 (SoundSense can normalize the sound volume with this format)
  • ogg (works, but SoundSense can not normalize the sound volume)
  • wav (See note below. SoundSense only supports "Windows PCM" encoded .wav files)
  • aiff
  • au

Note: Not all .wav files are supported...

SoundSense supports .wav encoded in the "Windows PCM" format. However, some files with the .wav extention are actually encoded in some other proprietary format. A sound format conversion utility (such as FormatFactory) could be used to fix them.

Some Tips:

Control of Randomness
Each logPattern expression can contain several soundFile elements. When it is triggered, one of them is randomly chosen to play. You can control the probability of each sound being chosen by adding the weight="number" attribute.
Simultaneous Sounds
By default, only one sound will play for a given logPattern, even if there are several expression using identical logPatterns. (Only the first expression is processed.) But you can allow more than one sound to be played for same pattern by giving the first one the haltOnMatch="false" attribute. They will all start at same time (unless one or more of them also has a delay). An example is in Seasons.
Sequential Sounds
Two (or more) sounds can be played sequentially (one after the other) for the same logPattern by using the haltOnMatch="false" tip above and including a delay attribute for one of them with a delay that surpasses the length of the other.

Helpful files:

  • packSkeletons.zip ( http://df.zweistein.cz/soundsense/packSkeletons.zip ) — This contains .xml files for all known gamelog lines currently without sounds. You can use this as a starting point to expand SoundSense.
  • missingMessages.cmd — Run this program to parse your gamelog.txt file and output all lines your sound packs will not recognize.
  • logging.properties — Edit this file to enable more debug messages from SoundSense. Set ".level = ALL" to view a very verbose output.

Sources of sound & music:

The following are some sites of interest, should you want additional sounds/music. (Websites with free, creative commons, public domain, and/or GNU GPL licensed audio):

How to add music to seasonal playlist:

It is rather easy. Locate seasons.xml in soundpack/seasons directory.

This file contains definition of two sets of sounds: First, there are four definitions for playing voiced anouncements (<sound logPattern="Spring has arrived!" haltOnMatch="false" playbackThreshhold="3">) which are not interesting and should be left alone.

Seccond are main defintions of season music which start with <sound logPattern="(Spring has arrived!)|(Spring has arrived on the calendar\.)" loop="start" channel="music" playbackThreshhold="0">.

You can simply add new <soundFile fileName="Name of your.mp3"/> and put it in seasons directory.