Три пункта в теме этой главы, и все три касаются отображения информации о текущей проигрываемой композиции. В первую очередь мы создадим скрипт для заголовка окна Foobar2000, затем поместим в нашу строку состояния техническую информацию и еще один индикатор проигрывания, ну и, наконец, мы настроем отображение всплывающей подсказки для иконки Foobar2000 в системном трэе.
При остановленном воспроизведении заголовок окна содержит имя Foobar2000 и номер версии, такое поведение определено заранее и не может быть изменено. Но как только воспроизведение начинается, мы можем использовать Tagz для изменения внешнего вида заголовка, хотя мы и ограничены всего одной строкой, и не можем использовать цвета. В зависимости от стиля оформления Вашей Windows конечный результат будет выглядеть примерно так:
На скриншоте показан максимальный объем отображаемой информации: имя исполнителя, заголовок композиции и название альбома. Для того чтобы ввести этот скрипт перейдите на страницу Display / Title formatting в настройках и активируйте вкладку Main window title.
[%artist%' - ']%title%[' ['%album%']']
Не думаю, что этот скрипт требует каких-либо дополнительных разъяснений.
Глядя на скриншот, мы можем определенно сказать, что код для строки состояния более интерестен:
Перейдите на страницу Display / Columns UI, выберите вкладку Status bar/Systray tab и измените шрифт строки состояния (Status Bar Font) на Franklin Gothic Medium, 9pt (ну или на любой другой, который Вы выбрали до этого для плэйлистов). Затем вернитесь к Display / Title formatting, выберите Status bar и удалите тот скрипт который там есть. Наш скрипт будет отображать информацию в пяти секциях: кодек, информация о потоке, время воспроизведения, индикатор прогресса, индикатор паузы. Расмотрим каждую из них подробней.
$if($strcmp(%codec%,'ATSC A/52'),'Dolby Digital AC3', $if($info(lame_version),'Lame MP3', $if($strcmp(%codec%,'FLAC'),'FLAC lossless', $if($strcmp(%codec%,'PCM'),'PCM uncompressed', %codec% ))))
Это часть для отображения кодека. Вспомните, что мы делали при создании информации о кодеке в столбце Artist/Album и этот скрипт станет Вам понятен. Первые две строки, про AC3 и Lame MP3, полностью идентичны, отсальные строки работают по тому же принципу: «отлавливают» указанный кодек и меняют для него отображаемое имя. Вы можете расширить эту секцию как Вам угодно, добавив обработку нужных Вам кодеков.
[%bitrate%' kbit/s'][' '%samplerate%' Hz'] $ifgreater(%channels%,2, ' '%channels%' channels', [' '%channels%])
Наша вторая секция содержит технические подробности об аудио потоке. Первая строчка отображает битрэйт и частоту дискретизации (samplerate) композиции, при условии, что они присутсвуют. $Ifgreater()
в первую очередь обрабатывает файлы с числом каналов больше чем 2. К примеру, композиция со звуком в формате 5.1 будет отображена как 6 channels. Для всех остальных, имеющих число каналов меньше 3, мы будем использовать сразу же поле %channels%
которое, благодаря подстановке полей, выдает mono для одного канала, и stereo для двух канального звука. В этом случае необходима дополнительная проверка if
(квадратные скобки), т.к. выше мы проверяли наличе количества каналов больше 2, но не само наличие информации о каналах. К примеру для MIDI файлов и других трэкерных форматов, обычная концепция каналов не подходит, и, соотвественно поле %channels%
для них не существует.
%_time_elapsed%[' of '%_time_total%]
В третьей секции мы отображаем прошедшее время воспроизведения и, если это возможно, оставшееся время. Опять же используем квадратные скобки, для того чтобы корректно обработать файлы, для которых нельзя определить длину.
Поле %_time_total%
существует только для текущего проигрываемого файла и обычно по значению равно полю %_length%
. Различие состоит лишь в том что %_time_total%
получает значение непосредственно из процедур воспроизведения Foobar2000, а %_length%
- из media library или плэйлиста. Случается что иногда значения этих двух полей отличаются друг от друга, но не стоит об этом сильно беспокоиться.
Переходим к четвертой секции, оторая содержит индикатор прогресса (progress bar). Чтобы было понятней, для начала изучим общий синтаксис:
<pre class="code">
$progress2(<i>position</i>,<i>range</i>,<i>length</i>,<i>char1</i>,<i>char2</i>)
</pre>
Range задает 100% значение прогресса, а position определяет текущую позицию, до которой дошел прогресс. Другим словом, это определение до какого процента должен быть заполнен индикатор прогресса. Length задает длину индикатора в символах, char1 и char2 - символы, служащие для отображения пустого и заполненного места соответственно. В результате получим:
$progress2(%_time_elapsed_seconds%,%_time_total_seconds%, 10, $get(pbarColour1)$char(9679),$get(pbarColour2)$char(9679) )
Два аргумента, %_time_elapsed_seconds%
и %_time_total_seconds%
, определяют какая часть песни уже проиграна, и насколько индикатор должен быть заполнен. Наш индикатор будет длиной в 10 символов. Символы заданы в 3-й строке, и они у нас идентичны: $char(9679
, это большой кружок. В дополнение мы задали различные цвета для символов, заполненная часть будет красной, незаполненная серой. Мы определим переменные для цветов немного ниже. И вот уже снабженная все этой информацией, функция $progress2()
рисует индикатор прогресса. Также существует другая версия этой функции: $progress()
, использующая такие же аргументы, но отображающая индикатор немного иначе.
<pre class="code">
$if(%_time_total_seconds%
,
<font color="#808080">$progress2(%_time_elapsed_seconds%,%_time_total_seconds%,
10,
$get(pbarColour1)$char(9679),$get(pbarColour2)$char(9679)
)</font>
$rgb()' '
$muldiv(%_time_elapsed_seconds%,100,%_time_total_seconds%)
' %'
)
</pre>
Это готовый скрипт для индикатора прогресса. В $if(%_time_total_seconds%,,)
нет ничего особенного, очередная защита от ошибок в случае файлов для которых невозможно определить длину. Часть скрипта после конструкции $progress2()
отображает после индикатора прогресса прошедшее время воспроизведения, в процентах. В первую очередь мы переключаем цвет текста на значение по умолчанию, используя $rgb()
, иначе бы были использованы серый или красный цвет индикатора. Затем мы вычисляем число процентов используя $muldiv(x,y,z)
, которая умножает первый аргумент x
на второй аргумент y
, и результат умножения делит на третий аргумент z
. По сути, эта функция есть сокращенный вариант вложенного вызова $div($mul(x,y),z
. Ну и последним шагом мы отображаем знак процента. И переходим к последней, пятой секции.
$if(%_ispaused%,$char(9)'pause {on} ')
Поле %_ispaused%
работает точно также как и %isplaying%
, но только указывает на композицию в паузе. Если воспроизведение запаузено, то мы отобразим pause {on}. C помощью $char(9)
мы вставляем знак табуляции, выравнивая тем самым строку по правому краю строки состояния.
Теперь настала пора собрать все кусочки в одно целое, и еще сделать 2 вещи. Во-первых, вставить несколько разделителей между секциями, для этого нам прекрасно подойдут пробелы. И, во-вторых, определить переменную для красного цвета во второй секции (часть технической информации), для того чтобы еще более разделить секции. Ниже приведен законченный скрипт.
<pre class="code">
$puts(AltColour,$rgb(126,16,16))
$puts(pbarColour1,$rgb(126,16,16))
$puts(pbarColour2,$rgb(170,170,170))
<font color="#808080">$if($strcmp(%codec%,'ATSC A/52'),'Dolby Digital AC3',
$if($info(lame_version),'Lame MP3',
$if($strcmp(%codec%,'FLAC'),'FLAC lossless',
$if($strcmp(%codec%,'PCM'),'PCM uncompressed',
%codec%
))))</font>
$get(AltColour)' '
<font color="#808080">[%bitrate%' kbit/s'][' '%samplerate%' Hz']
$ifgreater(%channels%,2,
' '%channels%' channels',
[' '%channels%])</font>
$rgb()' '
<font color="#808080">%_time_elapsed%[' of '%_time_total%]</font>
' '
// progress bar
<font color="#808080">$if(%_time_total_seconds%
,
$progress2(%_time_elapsed_seconds%,%_time_total_seconds%,
10,
$get(pbarColour1)$char(9679),$get(pbarColour2)$char(9679)
)
$rgb()' '
$muldiv(%_time_elapsed_seconds%,100,%_time_total_seconds%)
' %'
)</font>
// paused status
<font color="#808080">$if(%_ispaused%,$char(9)'pause {on} ')</font>
</pre>
Вы спросите для чего использовать $puts()
в начале скрипта? Определяя все переменные для цветов в начале скрипта, мы облегчаем дальнейшее редактирование этих цветов, мы же не хотим рыскать по всему скрипту в поисках функций $rgb()
. Наиболее логичным и грамотным решением было бы определить все переменные вместе в одном месте, на вкладке Globals в настройка Columns UI, но, к сожалению, настройки Display / Title formatting не являются частью настроек Columns UI, это часть ядра Foobar2000. Поэтому получит отсюда доступ к переменным Columns UI просто невозможно.
Наш последний скрипт касается всплывающей подсказки, появляющейся при наведении курсора мыши на значок Foobar2000 в системном трэе.
Он задается на вкладке Notification area icon tooltip.
[%artist%' - ']%title% [$crlf()%album%][' #'%tracknumber%]
Это уже готовый скрипт, отображающий исполнителя и заголовок песни на одной строке, и соответствующую информацию об альбоме и номере трэка на другой. Функция $crlf()
вставляет перенос строки. Я решил не использовать здесь шестнадцатеричные номера трэков, они хорошо смотрятся в контексте плэйлиста, но здесь они выглядят немного нелепо. Я остановил свой выбор на использовании знака # за которым следует номер трэка.