<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hydrogenaudio.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Musicmusic</id>
	<title>Hydrogenaudio Knowledgebase - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hydrogenaudio.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Musicmusic"/>
	<link rel="alternate" type="text/html" href="https://wiki.hydrogenaudio.org/index.php?title=Special:Contributions/Musicmusic"/>
	<updated>2026-05-02T01:34:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Components/Columns_UI_(foo_ui_columns)&amp;diff=38197</id>
		<title>Foobar2000:Components/Columns UI (foo ui columns)</title>
		<link rel="alternate" type="text/html" href="https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Components/Columns_UI_(foo_ui_columns)&amp;diff=38197"/>
		<updated>2024-09-15T20:12:55Z</updated>

		<summary type="html">&lt;p&gt;Musicmusic: Remove out-of-date information about libpng and zlib&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Foobar Component Infobox&lt;br /&gt;
| name                 = Columns UI&lt;br /&gt;
| screenshot           = [[Image:Foobar2000-ColumnsUI.png|250px]]&lt;br /&gt;
| caption              = Columns User Interface&lt;br /&gt;
| module_name          = foo_ui_columns&lt;br /&gt;
| developer            = Reupen Shah (musicmusic)&lt;br /&gt;
| repository           = [https://github.com/reupen/columns_ui GitHub]&lt;br /&gt;
| released             = {{start date and age|2004|01|21}}&lt;br /&gt;
| released_ref         = &lt;br /&gt;
| stable_release       = 2.1.0&lt;br /&gt;
| stable_release_date  = 2023-09-30&lt;br /&gt;
| preview_release      = &lt;br /&gt;
| preview_release_date = &lt;br /&gt;
| foobar2000_minimum   = 1.6&lt;br /&gt;
| foobar2000_ui_module = &lt;br /&gt;
| use                  = UI&lt;br /&gt;
| license              = LGPLv3&amp;lt;ref&amp;gt;[https://github.com/reupen/columns_ui/blob/master/README.md columns_ui/README.md at master · reupen/columns_ui], accessed 2015-06-28&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Columns UI&#039;&#039;&#039; is a interface style important to [[foobar2000]]. It has its own plugin system and these plugins extend the user interface, used to customize the layout of foobar with few limitations.&lt;br /&gt;
&lt;br /&gt;
It includes the following features:&lt;br /&gt;
&lt;br /&gt;
* Columns in the default view of the playlist.&lt;br /&gt;
* Built-in volume control toolbar.&lt;br /&gt;
* Interchangeable elements through the use of panel and toolbar components.&lt;br /&gt;
&lt;br /&gt;
==Layout==&lt;br /&gt;
The definite most important aspect of Columns UI! Each item that is added is hereforth refered to as an &#039;&#039;&#039;object&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Presets===&lt;br /&gt;
&#039;&#039;&#039;Presets&#039;&#039;&#039; are used to change into a different type of layout. For example, a user might have one layout to choose songs from a playlist, one to change the actual playlist, and another to watch the lyrics. Maybe I will upload an image later.&lt;br /&gt;
&lt;br /&gt;
===Objects===&lt;br /&gt;
====Layout====&lt;br /&gt;
The only existing layout option is Tabbed Panel Stack Mod, used for foo_uie_tabs. Tabs in this case function the same way they do in Firefox, and each tab corresponds to a different layout. In order to set that layout, &#039;&#039;&#039;each child object is a new tab&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Panels====&lt;br /&gt;
Panels are the most important thing you will use. Think blocks, you can stack them, place them next to each other, and set them up however you like.&lt;br /&gt;
&lt;br /&gt;
The best examples are Album Art Panel and Track Info.&lt;br /&gt;
&lt;br /&gt;
====Playlist Views====&lt;br /&gt;
*Default Playlist&lt;br /&gt;
*Columns Playlist&lt;br /&gt;
&lt;br /&gt;
====Splitters====&lt;br /&gt;
&#039;&#039;&#039;Splitters&#039;&#039;&#039; are used to place more than one object inside any given place. &lt;br /&gt;
&lt;br /&gt;
 |- Horizontal Splitter&lt;br /&gt;
 |--- Panel A&lt;br /&gt;
 |--- Panel B&lt;br /&gt;
&lt;br /&gt;
Makes A to the left of B&lt;br /&gt;
&lt;br /&gt;
 |- Vertical Splitter&lt;br /&gt;
 |--- Panel A&lt;br /&gt;
 |--- Panel B&lt;br /&gt;
&lt;br /&gt;
Makes A on top of B&lt;br /&gt;
&lt;br /&gt;
Playlist Tabs places whatever child object contained inside a group of tabs. Those tabs are always the loaded playlists used by the player.&lt;br /&gt;
&lt;br /&gt;
====Toolbars====&lt;br /&gt;
=====Buttons=====&lt;br /&gt;
WARNING: If images disappear when you use new button layouts from the forum, you are missing two dependencies: zlib1.dll and libpng13.dll. They have to be copied into the main foobar2000 directory, not into the components directory!&lt;br /&gt;
You can download them from the official homepage at [http://yuo.be/download/libpng128-zlib123.7z]&lt;br /&gt;
&lt;br /&gt;
=====Menu=====&lt;br /&gt;
=====Playback Order=====&lt;br /&gt;
=====Seekbar=====&lt;br /&gt;
=====Volume=====&lt;br /&gt;
&lt;br /&gt;
====Visualizations====&lt;br /&gt;
Spectrum Analyzer is the only one that I have. Well, if a visualization is next to a toolbar, it will fit inside of the toolbar. If it&#039;s inside of a splitter or next to panels, then it will act as a panel.&lt;br /&gt;
&lt;br /&gt;
===Example Layout===&lt;br /&gt;
&lt;br /&gt;
==Playlist Switcher==&lt;br /&gt;
&lt;br /&gt;
Switch playlist, not very featureful.&lt;br /&gt;
&lt;br /&gt;
==Columns Playlist==&lt;br /&gt;
&lt;br /&gt;
This Playlist View (like Single Column Playlist or Default) displays different variables in columns.&lt;br /&gt;
&lt;br /&gt;
===Columns===&lt;br /&gt;
&lt;br /&gt;
===NG Playlist===&lt;br /&gt;
Allows playlist to be sorted in groups&lt;br /&gt;
&lt;br /&gt;
===Playlist filters===&lt;br /&gt;
* Playlist filters allow one to hide on playlists/show only on playlists/show on all playlists according to the playlist filter specified. &lt;br /&gt;
* Separate multiple playlists by a semi-colon and you can use wildcards and ?s.&lt;br /&gt;
&lt;br /&gt;
===Global===&lt;br /&gt;
Use this panel to configure the whole section of Columns Playlist.&lt;br /&gt;
&lt;br /&gt;
====Variables====&lt;br /&gt;
Variables are used for...something....&lt;br /&gt;
&lt;br /&gt;
====Style====&lt;br /&gt;
Style refers to each unconfigured style of column.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[:Category:Foobar2000 Columns UI components|foobar2000 Columns UI components]] (category page)&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* {{ha|https://hydrogenaud.io/index.php/topic,28647.0.html}}&lt;br /&gt;
* [https://yuo.be/columns_ui Official Columns UI website]&lt;br /&gt;
* [https://wiki.yuo.be/columns_ui:start Official Columns UI wiki]&lt;/div&gt;</summary>
		<author><name>Musicmusic</name></author>
	</entry>
	<entry>
		<id>https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Title_Formatting_Reference&amp;diff=4943</id>
		<title>Foobar2000:Title Formatting Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Title_Formatting_Reference&amp;diff=4943"/>
		<updated>2005-05-24T14:22:34Z</updated>

		<summary type="html">&lt;p&gt;Musicmusic: formatting fixes pt 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Field remappings =&lt;br /&gt;
&lt;br /&gt;
Some of the fields accessible through &#039;&#039;%name%&#039;&#039; are remapped to other values to make writing titleformat scripts more convenient.&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== %artist% ===&lt;br /&gt;
Defined as &#039;&#039;$if3($meta(artist),$meta(album artist),$meta(composer),$meta(performer))&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %album artist% ===&lt;br /&gt;
Defined as &#039;&#039;$if3($meta(album artist),$meta(artist),$meta(composer),$meta(performer))&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %disc% ===&lt;br /&gt;
Defined as &#039;&#039;$num($meta(disc),1)&#039;&#039;. Returns the discnumber without extra leading zeroes.&lt;br /&gt;
&lt;br /&gt;
=== %track artist% ===&lt;br /&gt;
Defined as &#039;&#039;$meta(artist)&#039;&#039;, if &#039;&#039;$meta(album artist)&#039;&#039; is different than &#039;&#039;$meta(artist)&#039;&#039;, otherwise this field is empty.&lt;br /&gt;
&lt;br /&gt;
=== %title% ===&lt;br /&gt;
Defined as &#039;&#039;$if2($meta(title),%_filename_ext%)&#039;&#039;. Returns the &#039;&#039;title&#039;&#039; tag if available, otherwise it returns the filename including the extension.&lt;br /&gt;
&lt;br /&gt;
=== %tracknumber% ===&lt;br /&gt;
Defined as &#039;&#039;$num($meta(tracknumber),2)&#039;&#039;. Returns the tracknumber padded to two digits from the left with zeroes.&lt;br /&gt;
&lt;br /&gt;
== Technical information ==&lt;br /&gt;
&lt;br /&gt;
=== %bitrate% ===&lt;br /&gt;
Defined as &#039;&#039;$if2(%_%%_%%bitrate_dynamic%,%bitrate%)&#039;&#039;. Returns the current bitrate, if available, otherwise it returns the average bitrate. If neither is available, nothing is returned.&lt;br /&gt;
&lt;br /&gt;
=== %channels% ===&lt;br /&gt;
Defined as &#039;&#039;$channels()&#039;&#039;. Returns the number of channels in text form; returns &amp;quot;mono&amp;quot; and &amp;quot;stereo&amp;quot; instead of &amp;quot;1&amp;quot; and &amp;quot;2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== %filesize% ===&lt;br /&gt;
Defined as &#039;&#039;%_filesize%&#039;&#039;. Returns the filesize in bytes.&lt;br /&gt;
&lt;br /&gt;
=== %samplerate% ===&lt;br /&gt;
Defined as &#039;&#039;%_%%_%%samplerate%&#039;&#039;. Returns the samplerate in Hz.&lt;br /&gt;
&lt;br /&gt;
=== %codec% ===&lt;br /&gt;
Defined as &#039;&#039;$codec()&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== %playlist_number% ===&lt;br /&gt;
Defined as &#039;&#039;$num(%_playlist_number%,$len(%_playlist_total%))&#039;&#039;. Returns the position of the track as index into the playlist. The first track has index 1. The index is padded from the left with zeroes to the same number of digits as the last track.&lt;br /&gt;
&lt;br /&gt;
= Control flow =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to conditionally execute statements.&lt;br /&gt;
&lt;br /&gt;
=== [...] (conditional section) ===&lt;br /&gt;
&lt;br /&gt;
Evaluates the expression between &#039;&#039;[&#039;&#039; and &#039;&#039;]&#039;&#039;. If it has the truth value &#039;&#039;true&#039;&#039;, its string value and the truth value &#039;&#039;true&#039;&#039; are returned. Otherwise an empty string and &#039;&#039;false&#039;&#039; are returned.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;[%artist%]&#039;&#039; returns the value of the artist tag, if it exists. Otherwise it returns nothing, when &#039;&#039;artist&#039;&#039; would return &amp;quot;?&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== $if(cond,then) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;cond&#039;&#039; evaluates to &#039;&#039;true&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise, &#039;&#039;false&#039;&#039; is returned.&lt;br /&gt;
&lt;br /&gt;
=== $if(cond,then,else) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;cond&#039;&#039; evaluates to &#039;&#039;true&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise, the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $if2(a,else) ===&lt;br /&gt;
&lt;br /&gt;
Like &#039;&#039;$if(a,a,else)&#039;&#039; except that &#039;&#039;a&#039;&#039; is only evaluated once.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== $if3(a1,a2,...,aN,else) ===&lt;br /&gt;
&lt;br /&gt;
Evaluates arguments &#039;&#039;a1&#039;&#039; ... &#039;&#039;aN&#039;&#039;, until one is found that evaluates to &#039;&#039;true&#039;&#039;. If that happens, its value is returned. Otherwise the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $ifgreater(n1,n2,then,else) ===&lt;br /&gt;
&lt;br /&gt;
Compares the integer numbers &#039;&#039;n1&#039;&#039; and &#039;&#039;n2&#039;&#039;, if &#039;&#039;n1&#039;&#039; is greater than &#039;&#039;n2&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $iflonger(s1,s2,then,else) ===&lt;br /&gt;
&lt;br /&gt;
Compares the length of the strings &#039;&#039;s1&#039;&#039; and &#039;&#039;s2&#039;&#039;, if &#039;&#039;s1&#039;&#039; is longer than &#039;&#039;s2&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $select(n,a1,...,aN) ===&lt;br /&gt;
&lt;br /&gt;
If the value of &#039;&#039;n&#039;&#039; is between 1 and N, &#039;&#039;an&#039;&#039; is evaluated and its value returned. Otherwise &#039;&#039;false&#039;&#039; is returned.&lt;br /&gt;
&lt;br /&gt;
= Arithmetic functions =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to perform arithmetic on integer numbers. A string will be automatically converted to a number and vice versa. The conversion to a number uses the longest prefix of the string, that can be interpreted as number. Leading whitespace is ignored.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;quot;c3po&amp;quot; -&amp;gt; 0, &amp;quot; -12&amp;quot; -&amp;gt; -12, but &amp;quot;- 12&amp;quot; -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
=== $add(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Adds &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$add(a,b,...)&#039;&#039; is the same as &#039;&#039;$add($add(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $div(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Divides &#039;&#039;a&#039;&#039; through &#039;&#039;b&#039;&#039;. If &#039;&#039;b&#039;&#039; evaluates to zero, it returns &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$div(a,b,...)&#039;&#039; is the same as &#039;&#039;$div($div(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $greater(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns true, if &#039;&#039;a&#039;&#039; is greater than &#039;&#039;b&#039;&#039;, otherwise false.&lt;br /&gt;
&lt;br /&gt;
=== $max(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns the maximum of &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$max(a,b,...)&#039;&#039; is the same as &#039;&#039;$max($max(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $min(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns the minimum of &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$min(a,b,...)&#039;&#039; is the same as &#039;&#039;$min($min(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $mod(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Computes the remainder of dividing &#039;&#039;a&#039;&#039; through &#039;&#039;b&#039;&#039;. The result has the same sign as &#039;&#039;a&#039;&#039;. If &#039;&#039;b&#039;&#039; evaluates to zero, the result is &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$mod(a,b,...)&#039;&#039; is the same as &#039;&#039;$mod($mod(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $mul(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Multiplies &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$mul(a,b,...)&#039;&#039; is the same as &#039;&#039;$mul($mul(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $muldiv(a,b,c) ===&lt;br /&gt;
&lt;br /&gt;
Multiplies &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;, then divides by &#039;&#039;c&#039;&#039;. The result is rounded to the nearest integer.&lt;br /&gt;
&lt;br /&gt;
=== $rand() ===&lt;br /&gt;
&lt;br /&gt;
Generates a random number in the range from 0 to 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;-1.&lt;br /&gt;
&lt;br /&gt;
=== $sub(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Subtracts &#039;&#039;b&#039;&#039; from &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$sub(a,b,...)&#039;&#039; is the same as &#039;&#039;$sub($sub(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Boolean functions =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to work with truth values (&#039;&#039;true&#039;&#039; and &#039;&#039;false&#039;&#039;), which have no explicit representation in titleformat scripts. They do not return a string or number value. You can use them for more complex conditions with &#039;&#039;$if&#039;&#039; and related functions.&lt;br /&gt;
&lt;br /&gt;
=== $and(...) ===&lt;br /&gt;
&lt;br /&gt;
Logical And of an arbitrary number of arguments. Returns &#039;&#039;true&#039;&#039;, if and only if all arguments evaluate to &#039;&#039;true&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special case: &#039;&#039;$and(x,y)&#039;&#039; is &#039;&#039;true&#039;&#039;, if both &#039;&#039;x&#039;&#039; and &#039;&#039;y&#039;&#039; are &#039;&#039;true&#039;&#039;. Otherwise it is &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $or(...) ===&lt;br /&gt;
&lt;br /&gt;
Logical Or of an arbitrary number of arguments. Returns &#039;&#039;true&#039;&#039;, if at least one argument evaluates to &#039;&#039;true&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special case: &#039;&#039;$or(x,y)&#039;&#039; is &#039;&#039;true&#039;&#039;, if &#039;&#039;x&#039;&#039; or &#039;&#039;y&#039;&#039; is &#039;&#039;true&#039;&#039;, or if both are &#039;&#039;true&#039;&#039;. Otherwise it is &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $not(x) ===&lt;br /&gt;
&lt;br /&gt;
Logical Not. Returns &#039;&#039;false&#039;&#039;, if &#039;&#039;x&#039;&#039; is &#039;&#039;true&#039;&#039;, otherwise it returns &#039;&#039;true&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $xor(...) ===&lt;br /&gt;
&lt;br /&gt;
Logical Exclusive-or of an arbitrary number of arguments. Returns &#039;&#039;true&#039;&#039;, if an odd number of arguments evaluate to &#039;&#039;true&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Special case: &#039;&#039;$xor(x,y)&#039;&#039; is &#039;&#039;true&#039;&#039;, if one of &#039;&#039;x&#039;&#039; and &#039;&#039;y&#039;&#039; is &#039;&#039;true&#039;&#039;, but not both. Otherwise it is &#039;&#039;false&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Color functions =&lt;br /&gt;
&lt;br /&gt;
=== $blend(color1,color2,part,total) ===&lt;br /&gt;
&lt;br /&gt;
Returns a color that is a blend between &#039;&#039;color1&#039;&#039; and &#039;&#039;color2&#039;&#039;. If &#039;&#039;part&#039;&#039; is smaller than or equal to zero, &#039;&#039;color1&#039;&#039; is returned. If &#039;&#039;part&#039;&#039; is greater than or equal to &#039;&#039;total&#039;&#039;, &#039;&#039;color2&#039;&#039; is returned. Otherwise a blended color is returned that is &#039;&#039;part&#039;&#039; parts &#039;&#039;color1&#039;&#039; and &#039;&#039;total&#039;&#039;-&#039;&#039;part&#039;&#039; parts &#039;&#039;color2&#039;&#039;. The blending is performed in the RGB color space.&lt;br /&gt;
&lt;br /&gt;
=== $rgb() ===&lt;br /&gt;
&lt;br /&gt;
Resets the text color to the default color.&lt;br /&gt;
&lt;br /&gt;
=== $rgb(r,g,b) ===&lt;br /&gt;
&lt;br /&gt;
Sets the color for text. &#039;&#039;r&#039;&#039;, &#039;&#039;g&#039;&#039; and &#039;&#039;b&#039;&#039; are the red, green and blue component of the color for unselected text. The color for selected text is set to the inverse color.&lt;br /&gt;
&lt;br /&gt;
=== $rgb(r1,g1,b1,r2,g2,b2) ===&lt;br /&gt;
&lt;br /&gt;
Sets the color for text. &#039;&#039;r1&#039;&#039;, &#039;&#039;g1&#039;&#039; and &#039;&#039;b1&#039;&#039; are the red, green and blue component of the color for unselected text. &#039;&#039;r2&#039;&#039;, &#039;&#039;g2&#039;&#039; and &#039;&#039;b2&#039;&#039; are the red, green and blue component for the color of selected text.&lt;br /&gt;
&lt;br /&gt;
=== $transition(string,color1,color2) ===&lt;br /&gt;
&lt;br /&gt;
Inserts color codes into &#039;&#039;string&#039;&#039;, so that the first character has &#039;&#039;color1&#039;&#039;, the last character has &#039;&#039;color2&#039;&#039;, and intermediate characters have blended colors. The blending is performed in the RGB color space. Not that color codes are additional characters that will also be counted by string manipulation functions. For example, if you need to truncate a string, you should do this before applying &#039;&#039;$transition&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Now playing info =&lt;br /&gt;
The following functions and fields are usable for scripts used with the currently playing item, for example the status bar, the main window title and the copy command script.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== %_time_elapsed% ===&lt;br /&gt;
Returns elapsed time.&lt;br /&gt;
&lt;br /&gt;
=== %_time_remaining% ===&lt;br /&gt;
Returns remaining time until track ends.&lt;br /&gt;
&lt;br /&gt;
=== %_time_total% ===&lt;br /&gt;
Returns total length of track.&lt;br /&gt;
&lt;br /&gt;
=== %_time_elapsed_seconds% ===&lt;br /&gt;
Returns elapsed time in seconds.&lt;br /&gt;
&lt;br /&gt;
=== %_time_remaining_seconds% ===&lt;br /&gt;
Returns remaining time in seconds.&lt;br /&gt;
&lt;br /&gt;
=== %_time_total_seconds% ===&lt;br /&gt;
Returns total track length in seconds.&lt;br /&gt;
&lt;br /&gt;
=== %_ispaused% ===&lt;br /&gt;
Returns &amp;quot;1&amp;quot; if playback is paused and empty string otherwise.&lt;br /&gt;
&lt;br /&gt;
= Playlist info =&lt;br /&gt;
The following functions and fields are usable for playlist scripts.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== %_isplaying% ===&lt;br /&gt;
&lt;br /&gt;
Returns &amp;quot;1&amp;quot; if file is currently playing and empty string otherwise.&lt;br /&gt;
&lt;br /&gt;
=== %_ispaused% ===&lt;br /&gt;
&lt;br /&gt;
Returns &amp;quot;1&amp;quot; if playback is paused, empty string otherwise.&lt;br /&gt;
&lt;br /&gt;
=== %_playlist_number% ===&lt;br /&gt;
&lt;br /&gt;
Returns playlist index of specified item. The first item is at index 1.&lt;br /&gt;
&lt;br /&gt;
=== %_playlist_total% ===&lt;br /&gt;
&lt;br /&gt;
Returns number of items in the playlist.&lt;br /&gt;
&lt;br /&gt;
=== %_playlist_name% ===&lt;br /&gt;
&lt;br /&gt;
Returns the name of the playlist containing the specified item.&lt;br /&gt;
&lt;br /&gt;
= String functions =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to manipulate character strings.&lt;br /&gt;
&lt;br /&gt;
=== $abbr(x) ===&lt;br /&gt;
&lt;br /&gt;
Returns abbreviation of &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $abbr(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns abbreviation of &#039;&#039;x&#039;&#039;, if &#039;&#039;x&#039;&#039; is longer than &#039;&#039;len&#039;&#039; characters, otherwise returns &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $ansi(x) ===&lt;br /&gt;
&lt;br /&gt;
Converts &#039;&#039;x&#039;&#039; to system codepage and back. Any characters that are not present in the system codepage will be removed / replaced. Useful for mass-renaming files to ensure compatibility with non-unicode-capable software.&lt;br /&gt;
&lt;br /&gt;
=== $caps(x) ===&lt;br /&gt;
&lt;br /&gt;
Converts first letter in every word of x to uppercase, and all other letters to lowercase.&lt;br /&gt;
&lt;br /&gt;
=== $caps2(x) ===&lt;br /&gt;
&lt;br /&gt;
Converts first letter in every word of x to uppercase, and leaves all other letters as they are.&lt;br /&gt;
&lt;br /&gt;
=== $char(x) ===&lt;br /&gt;
&lt;br /&gt;
Inserts Unicode character with code &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $crlf() ===&lt;br /&gt;
&lt;br /&gt;
Inserts end-of-line marker (carriage return, line feed). Can be used to generate multiple lines in the output, for example for the tooltip of the system  notification area (&amp;quot;systray&amp;quot;) icon.&lt;br /&gt;
&lt;br /&gt;
=== $cut(a,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns first &#039;&#039;len&#039;&#039; characters on the left of &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $directory(x) ===&lt;br /&gt;
&lt;br /&gt;
Extracts directory name from the file path &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $directory(x,n) ===&lt;br /&gt;
&lt;br /&gt;
Extracts directory name from the file path &#039;&#039;x&#039;&#039;; goes up by &#039;&#039;n&#039;&#039; levels.&lt;br /&gt;
&lt;br /&gt;
=== $ext(x) ===&lt;br /&gt;
&lt;br /&gt;
Extracts file extension from &#039;&#039;x&#039;&#039; which must be a file name or path.&lt;br /&gt;
&lt;br /&gt;
=== $filename(x) ===&lt;br /&gt;
&lt;br /&gt;
Extracts file name from full path.&lt;br /&gt;
&lt;br /&gt;
=== $fix_eol(x) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;x&#039;&#039; contains an end-of-line marker (CR-LF), the end-of-line marker and all text to the right of it is replaced by &amp;quot; (...)&amp;quot;. Otherwise &#039;&#039;x&#039;&#039; is returned unaltered.&lt;br /&gt;
&lt;br /&gt;
=== $fix_eol(x,indicator) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;x&#039;&#039; contains an end-of-line marker (CR-LF), the end-of-line marker and all text to the right of it is replaced by &#039;&#039;indicator&#039;&#039;. Otherwise &#039;&#039;x&#039;&#039; is returned unaltered.&lt;br /&gt;
&lt;br /&gt;
=== $hex(n) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in hexadecimal notation.&lt;br /&gt;
&lt;br /&gt;
=== $hex(n,len) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in hexadecimal notation with &#039;&#039;len&#039;&#039; digits. Pads with zeros from the left if necessary.&lt;br /&gt;
&lt;br /&gt;
=== $insert(a,b,n) ===&lt;br /&gt;
&lt;br /&gt;
Inserts &#039;&#039;b&#039;&#039; into &#039;&#039;a&#039;&#039; after &#039;&#039;n&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $left(a,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns the first &#039;&#039;len&#039;&#039; characters from the left of &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $len(a) ===&lt;br /&gt;
&lt;br /&gt;
Returns length of string &#039;&#039;a&#039;&#039; in characters.&lt;br /&gt;
&lt;br /&gt;
=== $len2(a) ===&lt;br /&gt;
&lt;br /&gt;
Returns length of string x in characters, respecting double-width character rules (double-width characters will be counted as two).&lt;br /&gt;
&lt;br /&gt;
=== $longer(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns &#039;&#039;true&#039;&#039;, if string &#039;&#039;a&#039;&#039; is longer than string &#039;&#039;b&#039;&#039;, false otherwise.&lt;br /&gt;
&lt;br /&gt;
=== $lower(a) ===&lt;br /&gt;
&lt;br /&gt;
Converts &#039;&#039;a&#039;&#039; to lowercase.&lt;br /&gt;
&lt;br /&gt;
=== $longest(a,...) ===&lt;br /&gt;
&lt;br /&gt;
Returns the longest of its arguments. Can be used with an arbitrary number of strings.&lt;br /&gt;
&lt;br /&gt;
=== $num(n,len) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in decimal notation with &#039;&#039;len&#039;&#039; digits. Pads with zeros from the left if necessary.&lt;br /&gt;
&lt;br /&gt;
=== $pad(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the left with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $pad_right(x,y) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the right with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $pad(x,len,char) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the left with &#039;&#039;char&#039;&#039; to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $pad_right(x,len,char) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the right with &#039;&#039;char&#039;&#039; to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $padcut(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns first &#039;&#039;len&#039;&#039; characters from the left of &#039;&#039;x&#039;&#039;, if &#039;&#039;x&#039;&#039; is longer than &#039;&#039;len&#039;&#039; characters. Otherwise pads &#039;&#039;x&#039;&#039; from the left with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $padcut_right(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns first &#039;&#039;len&#039;&#039; characters from the left of &#039;&#039;x&#039;&#039;, if &#039;&#039;x&#039;&#039; is longer than &#039;&#039;len&#039;&#039; characters. Otherwise pads &#039;&#039;x&#039;&#039; from the right with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $progress(pos,range,len,a,b) ===&lt;br /&gt;
&lt;br /&gt;
Creates a progress bar: &#039;&#039;pos&#039;&#039; contains position, &#039;&#039;range&#039;&#039; contains range, &#039;&#039;len&#039;&#039; progress bar length in characters, &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039; are characters to build progress bar with.&lt;br /&gt;
&lt;br /&gt;
Example:&#039;&#039;$progress(%_time_elapsed_seconds%, %_time_total_seconds%, 20,&#039;#&#039;,&#039;=&#039;)&#039;&#039; produces &amp;quot;====#===============&amp;quot;, the # character is moving with playback position.&lt;br /&gt;
&lt;br /&gt;
=== $progress2(pos,range,len,a,b) ===&lt;br /&gt;
&lt;br /&gt;
Creates a progress bar: &#039;&#039;pos&#039;&#039; contains position, &#039;&#039;range&#039;&#039; contains range, &#039;&#039;len&#039;&#039; progress bar length in characters, &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039; are characters to build progress bar with. Produces different appearance than &#039;&#039;$progress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $repeat(a,n) ===&lt;br /&gt;
&lt;br /&gt;
Returns &#039;&#039;n&#039;&#039; copies of &#039;&#039;a&#039;&#039;. Note that &#039;&#039;a&#039;&#039; is evaluated once before its value is used, so &#039;&#039;$repeat&#039;&#039; cannot be used for loops.&lt;br /&gt;
&lt;br /&gt;
=== $replace(a,b,c) ===&lt;br /&gt;
&lt;br /&gt;
Replaces all occurrences of string &#039;&#039;b&#039;&#039; in string &#039;&#039;a&#039;&#039; with string &#039;&#039;c&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can also be used with an arbitrary number of arguments. Note that &#039;&#039;$replace(a,b1,c1,b2,c2)&#039;&#039; is generally not the same as &#039;&#039;$replace($replace(a,b1,c1),b2,c2)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$replace(ab,a,b,b,c)&#039;&#039; -&amp;gt; &amp;quot;bc&amp;quot;, &#039;&#039;$replace($replace(ab,a,b),b,c)&#039;&#039; -&amp;gt; &amp;quot;cc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $right(a,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns the first &#039;&#039;len&#039;&#039; characters from the right of &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $roman(n) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in roman notation.&lt;br /&gt;
&lt;br /&gt;
=== $shortest ===&lt;br /&gt;
&lt;br /&gt;
Returns the shortest of its arguments. Can be used with an arbitrary number of strings.&lt;br /&gt;
&lt;br /&gt;
=== $strchr(s,c) ===&lt;br /&gt;
&lt;br /&gt;
Finds first occurence of character &#039;&#039;c&#039;&#039; in string &#039;&#039;s&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$strchr(abca,a)&#039;&#039; -&amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
=== $strrchr(s,c) ===&lt;br /&gt;
&lt;br /&gt;
Finds last occurence of character &#039;&#039;c&#039;&#039; in string &#039;&#039;s&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$strrchr(abca,a)&#039;&#039; -&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
=== $strstr(s1,s2) ===&lt;br /&gt;
&lt;br /&gt;
Finds first occurence of string &#039;&#039;s2&#039;&#039; in string &#039;&#039;s1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $strcmp(s1,s2) ===&lt;br /&gt;
&lt;br /&gt;
Performs a case-sensitive comparison of the strings &#039;&#039;s1&#039;&#039; and &#039;&#039;s2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $stricmp(s1,s2) ===&lt;br /&gt;
&lt;br /&gt;
Performs a case-insensitive comparison of the strings &#039;&#039;s1&#039;&#039; and &#039;&#039;s2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $substr(s,m,n) ===&lt;br /&gt;
&lt;br /&gt;
Returns substring of string &#039;&#039;s&#039;&#039;, starting from &#039;&#039;m&#039;&#039;-th character and ending at &#039;&#039;n&#039;&#039;-th character.&lt;br /&gt;
&lt;br /&gt;
=== $trim(s) ===&lt;br /&gt;
&lt;br /&gt;
Removes leading and trailing spaces from string &#039;&#039;s&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $tab() ===&lt;br /&gt;
&lt;br /&gt;
Inserts one tabulator character.&lt;br /&gt;
&lt;br /&gt;
=== $tab(n) ===&lt;br /&gt;
&lt;br /&gt;
Inserts &#039;&#039;n&#039;&#039; tabulator characters.&lt;br /&gt;
&lt;br /&gt;
=== $upper(s) ===&lt;br /&gt;
&lt;br /&gt;
Converts string &#039;&#039;s&#039;&#039; to uppercase.&lt;br /&gt;
&lt;br /&gt;
= Track info =&lt;br /&gt;
&lt;br /&gt;
The functions and fields in this section can be used to access information about tracks.&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== $meta(name) ===&lt;br /&gt;
Returns value of tag called &#039;&#039;name&#039;&#039;. If multiple values of that tag exist, they are concatenated with &amp;quot;, &amp;quot; as separator.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta(artist)&#039;&#039; -&amp;gt; &amp;quot;He, She, It&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta(name,n) ===&lt;br /&gt;
Returns value of &#039;&#039;n&#039;&#039;-th tag called &#039;&#039;name&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta(artist,2)&#039;&#039; -&amp;gt; &amp;quot;She&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta_sep(name,sep) ===&lt;br /&gt;
Returns value of tag called &#039;&#039;name&#039;&#039;. If multiple values of that tag exist, they are concatenated with &#039;&#039;sep&#039;&#039; as separator.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta_sep(artist,&#039; + &#039;)&#039;&#039; -&amp;gt; &amp;quot;He + She + It&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta_sep(name,sep,lastsep) ===&lt;br /&gt;
Returns value of tag called &#039;&#039;name&#039;&#039;. If multiple values of that tag exist, they are concatenated with &#039;&#039;sep&#039;&#039; as separator between all but the last two values which are concatenated with &#039;&#039;lastsep&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$metasep(artist,&#039;, &#039;,&#039;, and &#039;)&#039;&#039; -&amp;gt; &amp;quot;He, She, and It&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta_test(...) === &lt;br /&gt;
Returns &#039;&#039;true&#039;&#039;, if all given tags exist.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta_test(artist,title)&#039;&#039; -&amp;gt; true&lt;br /&gt;
&lt;br /&gt;
=== $meta_num(name) ===&lt;br /&gt;
Returns the number of values for the tag called &#039;&#039;name&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta_num(artist)&#039;&#039; -&amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
=== $tracknumber() ===&lt;br /&gt;
Returns the tracknumber padded to 2 digits with zeroes.&lt;br /&gt;
&lt;br /&gt;
=== $tracknumber(n) ===&lt;br /&gt;
Returns the tracknumber padded to &#039;&#039;n&#039;&#039; digits with zeros.&lt;br /&gt;
&lt;br /&gt;
== Technical information ==&lt;br /&gt;
&lt;br /&gt;
=== $info(name) ===&lt;br /&gt;
Returns value of technical information field called &#039;&#039;name&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$info(channels)&#039;&#039; -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
=== $codec() ===&lt;br /&gt;
Returns codec of track. If no codec field is present, it the uses file extension.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$codec()&#039;&#039; -&amp;gt; &amp;quot;WavPack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $channels() === &lt;br /&gt;
Returns number of channels in text format.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$channels()&#039;&#039; -&amp;gt; &amp;quot;stereo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_album_gain% ===&lt;br /&gt;
Returns ReplayGain album gain value. //Not available through// &#039;&#039;$info(replaygain_album_gain)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_album_peak% ===&lt;br /&gt;
Returns ReplayGain album peak value. //Not available through// &#039;&#039;$info(replaygain_album_peak)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_track_gain% ===&lt;br /&gt;
Returns ReplayGain track gain value. //Not available through// &#039;&#039;$info(replaygain_track_gain)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_track_peak% ===&lt;br /&gt;
Returns ReplayGain track peak value. //Not available through// &#039;&#039;$info(replaygain_track_peak)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== $extra(name) ===&lt;br /&gt;
Returns the value of the special field called &#039;&#039;name&#039;&#039;. These fields can also be accessed as &#039;&#039;%_name%&#039;&#039;; note the additional underscore. The following field names can be used:&lt;br /&gt;
==== filename ====&lt;br /&gt;
Returns the filename without directory and extension.&lt;br /&gt;
==== filename_ext ====&lt;br /&gt;
Returns the filename with extension, but without the directory.&lt;br /&gt;
==== directoryname ====&lt;br /&gt;
Returns the name of the parent directory only, not the complete path.&lt;br /&gt;
==== path ====&lt;br /&gt;
Returns the path.&lt;br /&gt;
==== path_raw ====&lt;br /&gt;
Returns the path as URL including the protocol scheme.&lt;br /&gt;
==== subsong ====&lt;br /&gt;
Returns the subsong index. The subsong index is used to distuingish multiple tracks in a single file, for example for cue sheets, tracker modules and various container formats.&lt;br /&gt;
==== foobar2000_version ====&lt;br /&gt;
Returns a string representing the version of foobar2000.&lt;br /&gt;
==== length ====&lt;br /&gt;
Returns the length of the track formatted as hours, minutes, and seconds.&lt;br /&gt;
==== length_ex ====&lt;br /&gt;
Returns the length of the track formatted as hours, minutes, seconds, and milliseconds.&lt;br /&gt;
==== length_seconds ====&lt;br /&gt;
Returns the length of the track in seconds.&lt;br /&gt;
==== length_seconds_fp ====&lt;br /&gt;
Returns the length of the track in seconds as floating point number.&lt;br /&gt;
==== length_samples ====&lt;br /&gt;
Returns the length of the track in samples.&lt;br /&gt;
&lt;br /&gt;
= Variable operations =&lt;br /&gt;
&lt;br /&gt;
Variables can be used to store strings and number. They cannot store truth values. They are best used to store intermediate results that you need multiple times. Variable names are not case-sensitive.&lt;br /&gt;
&lt;br /&gt;
=== $get(name) ===&lt;br /&gt;
&lt;br /&gt;
Returns the value that was last stored in the variable &#039;&#039;name&#039;&#039;, if the variable was not defined (yet), it returns nothing. The truth value returned by &#039;&#039;$get&#039;&#039; indicates if the variable &#039;&#039;name&#039;&#039; was defined.&lt;br /&gt;
&lt;br /&gt;
=== $put(name,value) ===&lt;br /&gt;
&lt;br /&gt;
Stores &#039;&#039;value&#039;&#039; in the variable &#039;&#039;name&#039;&#039; and returns &#039;&#039;value&#039;&#039; unaltered.&lt;br /&gt;
&lt;br /&gt;
=== $puts(name,value) ===&lt;br /&gt;
&lt;br /&gt;
Stores &#039;&#039;value&#039;&#039; in the variable &#039;&#039;name&#039;&#039; and returns only the truth value of &#039;&#039;value&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Musicmusic</name></author>
	</entry>
	<entry>
		<id>https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Title_Formatting_Reference&amp;diff=4935</id>
		<title>Foobar2000:Title Formatting Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Title_Formatting_Reference&amp;diff=4935"/>
		<updated>2005-05-24T14:16:04Z</updated>

		<summary type="html">&lt;p&gt;Musicmusic: formatting fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Field remappings =&lt;br /&gt;
&lt;br /&gt;
Some of the fields accessible through &#039;&#039;%name%&#039;&#039; are remapped to other values to make writing titleformat scripts more convenient.&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== %artist% ===&lt;br /&gt;
Defined as &#039;&#039;$if3($meta(artist),$meta(album artist),$meta(composer),$meta(performer))&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %album artist% ===&lt;br /&gt;
Defined as &#039;&#039;$if3($meta(album artist),$meta(artist),$meta(composer),$meta(performer))&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %disc% ===&lt;br /&gt;
Defined as &#039;&#039;$num($meta(disc),1)&#039;&#039;. Returns the discnumber without extra leading zeroes.&lt;br /&gt;
&lt;br /&gt;
=== %track artist% ===&lt;br /&gt;
Defined as &#039;&#039;$meta(artist)&#039;&#039;, if &#039;&#039;$meta(album artist)&#039;&#039; is different than &#039;&#039;$meta(artist)&#039;&#039;, otherwise this field is empty.&lt;br /&gt;
&lt;br /&gt;
=== %title% ===&lt;br /&gt;
Defined as &#039;&#039;$if2($meta(title),%_filename_ext%)&#039;&#039;. Returns the &#039;&#039;title&#039;&#039; tag if available, otherwise it returns the filename including the extension.&lt;br /&gt;
&lt;br /&gt;
=== %tracknumber% ===&lt;br /&gt;
Defined as &#039;&#039;$num($meta(tracknumber),2)&#039;&#039;. Returns the tracknumber padded to two digits from the left with zeroes.&lt;br /&gt;
&lt;br /&gt;
== Technical information ==&lt;br /&gt;
&lt;br /&gt;
=== %bitrate% ===&lt;br /&gt;
Defined as &#039;&#039;$if2(%_%%_%%bitrate_dynamic%,%bitrate%)&#039;&#039;. Returns the current bitrate, if available, otherwise it returns the average bitrate. If neither is available, nothing is returned.&lt;br /&gt;
&lt;br /&gt;
=== %channels% ===&lt;br /&gt;
Defined as &#039;&#039;$channels()&#039;&#039;. Returns the number of channels in text form; returns &amp;quot;mono&amp;quot; and &amp;quot;stereo&amp;quot; instead of &amp;quot;1&amp;quot; and &amp;quot;2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== %filesize% ===&lt;br /&gt;
Defined as &#039;&#039;%_filesize%&#039;&#039;. Returns the filesize in bytes.&lt;br /&gt;
&lt;br /&gt;
=== %samplerate% ===&lt;br /&gt;
Defined as &#039;&#039;%_%%_%%samplerate%&#039;&#039;. Returns the samplerate in Hz.&lt;br /&gt;
&lt;br /&gt;
=== %codec% ===&lt;br /&gt;
Defined as &#039;&#039;$codec()&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== %playlist_number% ===&lt;br /&gt;
Defined as &#039;&#039;$num(%_playlist_number%,$len(%_playlist_total%))&#039;&#039;. Returns the position of the track as index into the playlist. The first track has index 1. The index is padded from the left with zeroes to the same number of digits as the last track.&lt;br /&gt;
&lt;br /&gt;
= Control flow =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to conditionally execute statements.&lt;br /&gt;
&lt;br /&gt;
=== [...] (conditional section) ===&lt;br /&gt;
&lt;br /&gt;
Evaluates the expression between &#039;&#039;[&#039;&#039; and &#039;&#039;]&#039;&#039;. If it has the truth value &#039;&#039;true&#039;&#039;, its string value and the truth value &#039;&#039;true&#039;&#039; are returned. Otherwise an empty string and &#039;&#039;false&#039;&#039; are returned.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;[%artist%]&#039;&#039; returns the value of the artist tag, if it exists. Otherwise it returns nothing, when &#039;&#039;artist&#039;&#039; would return &amp;quot;?&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== $if(cond,then) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;cond&#039;&#039; evaluates to &#039;&#039;true&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise, &#039;&#039;false&#039;&#039; is returned.&lt;br /&gt;
&lt;br /&gt;
=== $if(cond,then,else) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;cond&#039;&#039; evaluates to &#039;&#039;true&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise, the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $if2(a,else) ===&lt;br /&gt;
&lt;br /&gt;
Like &#039;&#039;$if(a,a,else)&#039;&#039; except that &#039;&#039;a&#039;&#039; is only evaluated once.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== $if3(a1,a2,...,aN,else) ===&lt;br /&gt;
&lt;br /&gt;
Evaluates arguments &#039;&#039;a1&#039;&#039; ... &#039;&#039;aN&#039;&#039;, until one is found that evaluates to &#039;&#039;true&#039;&#039;. If that happens, its value is returned. Otherwise the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $ifgreater(n1,n2,then,else) ===&lt;br /&gt;
&lt;br /&gt;
Compares the integer numbers &#039;&#039;n1&#039;&#039; and &#039;&#039;n2&#039;&#039;, if &#039;&#039;n1&#039;&#039; is greater than &#039;&#039;n2&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $iflonger(s1,s2,then,else) ===&lt;br /&gt;
&lt;br /&gt;
Compares the length of the strings &#039;&#039;s1&#039;&#039; and &#039;&#039;s2&#039;&#039;, if &#039;&#039;s1&#039;&#039; is longer than &#039;&#039;s2&#039;&#039;, the &#039;&#039;then&#039;&#039; part is evaluated and its value returned. Otherwise the &#039;&#039;else&#039;&#039; part is evaluated and its value returned.&lt;br /&gt;
&lt;br /&gt;
=== $select(n,a1,...,aN) ===&lt;br /&gt;
&lt;br /&gt;
If the value of &#039;&#039;n&#039;&#039; is between 1 and N, &#039;&#039;an&#039;&#039; is evaluated and its value returned. Otherwise //false// is returned.&lt;br /&gt;
&lt;br /&gt;
= Arithmetic functions =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to perform arithmetic on integer numbers. A string will be automatically converted to a number and vice versa. The conversion to a number uses the longest prefix of the string, that can be interpreted as number. Leading whitespace is ignored.&lt;br /&gt;
&lt;br /&gt;
Example: &amp;quot;c3po&amp;quot; -&amp;gt; 0, &amp;quot; -12&amp;quot; -&amp;gt; -12, but &amp;quot;- 12&amp;quot; -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
=== $add(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Adds &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$add(a,b,...)&#039;&#039; is the same as &#039;&#039;$add($add(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $div(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Divides &#039;&#039;a&#039;&#039; through &#039;&#039;b&#039;&#039;. If &#039;&#039;b&#039;&#039; evaluates to zero, it returns &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$div(a,b,...)&#039;&#039; is the same as &#039;&#039;$div($div(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $greater(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns true, if &#039;&#039;a&#039;&#039; is greater than &#039;&#039;b&#039;&#039;, otherwise false.&lt;br /&gt;
&lt;br /&gt;
=== $max(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns the maximum of &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$max(a,b,...)&#039;&#039; is the same as &#039;&#039;$max($max(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $min(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns the minimum of &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$min(a,b,...)&#039;&#039; is the same as &#039;&#039;$min($min(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $mod(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Computes the remainder of dividing &#039;&#039;a&#039;&#039; through &#039;&#039;b&#039;&#039;. The result has the same sign as &#039;&#039;a&#039;&#039;. If &#039;&#039;b&#039;&#039; evaluates to zero, the result is &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$mod(a,b,...)&#039;&#039; is the same as &#039;&#039;$mod($mod(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $mul(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Multiplies &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$mul(a,b,...)&#039;&#039; is the same as &#039;&#039;$mul($mul(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $muldiv(a,b,c) ===&lt;br /&gt;
&lt;br /&gt;
Multiplies &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039;, then divides by &#039;&#039;c&#039;&#039;. The result is rounded to the nearest integer.&lt;br /&gt;
&lt;br /&gt;
=== $rand() ===&lt;br /&gt;
&lt;br /&gt;
Generates a random number in the range from 0 to 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;-1.&lt;br /&gt;
&lt;br /&gt;
=== $sub(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Subtracts &#039;&#039;b&#039;&#039; from &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can be used with an arbitrary number of arguments. &#039;&#039;$sub(a,b,...)&#039;&#039; is the same as &#039;&#039;$sub($sub(a,b),...)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Boolean functions =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to work with truth values (//true// and //false//), which have no explicit representation in titleformat scripts. They do not return a string or number value. You can use them for more complex conditions with &#039;&#039;$if&#039;&#039; and related functions.&lt;br /&gt;
&lt;br /&gt;
=== $and(...) ===&lt;br /&gt;
&lt;br /&gt;
Logical And of an arbitrary number of arguments. Returns //true//, if and only if all arguments evaluate to //true//.&lt;br /&gt;
&lt;br /&gt;
Special case: &#039;&#039;$and(x,y)&#039;&#039; is //true//, if both &#039;&#039;x&#039;&#039; and &#039;&#039;y&#039;&#039; are //true//. Otherwise it is //false//.&lt;br /&gt;
&lt;br /&gt;
=== $or(...) ===&lt;br /&gt;
&lt;br /&gt;
Logical Or of an arbitrary number of arguments. Returns //true//, if at least one argument evaluates to //true//.&lt;br /&gt;
&lt;br /&gt;
Special case: &#039;&#039;$or(x,y)&#039;&#039; is //true//, if &#039;&#039;x&#039;&#039; or &#039;&#039;y&#039;&#039; is //true//, or if both are //true//. Otherwise it is //false//.&lt;br /&gt;
&lt;br /&gt;
=== $not(x) ===&lt;br /&gt;
&lt;br /&gt;
Logical Not. Returns //false//, if &#039;&#039;x&#039;&#039; is //true//, otherwise it returns //true//.&lt;br /&gt;
&lt;br /&gt;
=== $xor(...) ===&lt;br /&gt;
&lt;br /&gt;
Logical Exclusive-or of an arbitrary number of arguments. Returns //true//, if an odd number of arguments evaluate to //true//.&lt;br /&gt;
&lt;br /&gt;
Special case: &#039;&#039;$xor(x,y)&#039;&#039; is //true//, if one of &#039;&#039;x&#039;&#039; and &#039;&#039;y&#039;&#039; is //true//, but not both. Otherwise it is //false//.&lt;br /&gt;
&lt;br /&gt;
= Color functions =&lt;br /&gt;
&lt;br /&gt;
=== $blend(color1,color2,part,total) ===&lt;br /&gt;
&lt;br /&gt;
Returns a color that is a blend between &#039;&#039;color1&#039;&#039; and &#039;&#039;color2&#039;&#039;. If &#039;&#039;part&#039;&#039; is smaller than or equal to zero, &#039;&#039;color1&#039;&#039; is returned. If &#039;&#039;part&#039;&#039; is greater than or equal to &#039;&#039;total&#039;&#039;, &#039;&#039;color2&#039;&#039; is returned. Otherwise a blended color is returned that is &#039;&#039;part&#039;&#039; parts &#039;&#039;color1&#039;&#039; and &#039;&#039;total&#039;&#039;-&#039;&#039;part&#039;&#039; parts &#039;&#039;color2&#039;&#039;. The blending is performed in the RGB color space.&lt;br /&gt;
&lt;br /&gt;
=== $rgb() ===&lt;br /&gt;
&lt;br /&gt;
Resets the text color to the default color.&lt;br /&gt;
&lt;br /&gt;
=== $rgb(r,g,b) ===&lt;br /&gt;
&lt;br /&gt;
Sets the color for text. &#039;&#039;r&#039;&#039;, &#039;&#039;g&#039;&#039; and &#039;&#039;b&#039;&#039; are the red, green and blue component of the color for unselected text. The color for selected text is set to the inverse color.&lt;br /&gt;
&lt;br /&gt;
=== $rgb(r1,g1,b1,r2,g2,b2) ===&lt;br /&gt;
&lt;br /&gt;
Sets the color for text. &#039;&#039;r1&#039;&#039;, &#039;&#039;g1&#039;&#039; and &#039;&#039;b1&#039;&#039; are the red, green and blue component of the color for unselected text. &#039;&#039;r2&#039;&#039;, &#039;&#039;g2&#039;&#039; and &#039;&#039;b2&#039;&#039; are the red, green and blue component for the color of selected text.&lt;br /&gt;
&lt;br /&gt;
=== $transition(string,color1,color2) ===&lt;br /&gt;
&lt;br /&gt;
Inserts color codes into &#039;&#039;string&#039;&#039;, so that the first character has &#039;&#039;color1&#039;&#039;, the last character has &#039;&#039;color2&#039;&#039;, and intermediate characters have blended colors. The blending is performed in the RGB color space. Not that color codes are additional characters that will also be counted by string manipulation functions. For example, if you need to truncate a string, you should do this before applying &#039;&#039;$transition&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Now playing info =&lt;br /&gt;
The following functions and fields are usable for scripts used with the currently playing item, for example the status bar, the main window title and the copy command script.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== %_time_elapsed% ===&lt;br /&gt;
Returns elapsed time.&lt;br /&gt;
&lt;br /&gt;
=== %_time_remaining% ===&lt;br /&gt;
Returns remaining time until track ends.&lt;br /&gt;
&lt;br /&gt;
=== %_time_total% ===&lt;br /&gt;
Returns total length of track.&lt;br /&gt;
&lt;br /&gt;
=== %_time_elapsed_seconds% ===&lt;br /&gt;
Returns elapsed time in seconds.&lt;br /&gt;
&lt;br /&gt;
=== %_time_remaining_seconds% ===&lt;br /&gt;
Returns remaining time in seconds.&lt;br /&gt;
&lt;br /&gt;
=== %_time_total_seconds% ===&lt;br /&gt;
Returns total track length in seconds.&lt;br /&gt;
&lt;br /&gt;
=== %_ispaused% ===&lt;br /&gt;
Returns &amp;quot;1&amp;quot; if playback is paused and empty string otherwise.&lt;br /&gt;
&lt;br /&gt;
= Playlist info =&lt;br /&gt;
The following functions and fields are usable for playlist scripts.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== %_isplaying% ===&lt;br /&gt;
&lt;br /&gt;
Returns &amp;quot;1&amp;quot; if file is currently playing and empty string otherwise.&lt;br /&gt;
&lt;br /&gt;
=== %_ispaused% ===&lt;br /&gt;
&lt;br /&gt;
Returns &amp;quot;1&amp;quot; if playback is paused, empty string otherwise.&lt;br /&gt;
&lt;br /&gt;
=== %_playlist_number% ===&lt;br /&gt;
&lt;br /&gt;
Returns playlist index of specified item. The first item is at index 1.&lt;br /&gt;
&lt;br /&gt;
=== %_playlist_total% ===&lt;br /&gt;
&lt;br /&gt;
Returns number of items in the playlist.&lt;br /&gt;
&lt;br /&gt;
=== %_playlist_name% ===&lt;br /&gt;
&lt;br /&gt;
Returns the name of the playlist containing the specified item.&lt;br /&gt;
&lt;br /&gt;
= String functions =&lt;br /&gt;
&lt;br /&gt;
The functions in this section can be used to manipulate character strings.&lt;br /&gt;
&lt;br /&gt;
=== $abbr(x) ===&lt;br /&gt;
&lt;br /&gt;
Returns abbreviation of &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $abbr(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns abbreviation of &#039;&#039;x&#039;&#039;, if &#039;&#039;x&#039;&#039; is longer than &#039;&#039;len&#039;&#039; characters, otherwise returns &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $ansi(x) ===&lt;br /&gt;
&lt;br /&gt;
Converts &#039;&#039;x&#039;&#039; to system codepage and back. Any characters that are not present in the system codepage will be removed / replaced. Useful for mass-renaming files to ensure compatibility with non-unicode-capable software.&lt;br /&gt;
&lt;br /&gt;
=== $caps(x) ===&lt;br /&gt;
&lt;br /&gt;
Converts first letter in every word of x to uppercase, and all other letters to lowercase.&lt;br /&gt;
&lt;br /&gt;
=== $caps2(x) ===&lt;br /&gt;
&lt;br /&gt;
Converts first letter in every word of x to uppercase, and leaves all other letters as they are.&lt;br /&gt;
&lt;br /&gt;
=== $char(x) ===&lt;br /&gt;
&lt;br /&gt;
Inserts Unicode character with code &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $crlf() ===&lt;br /&gt;
&lt;br /&gt;
Inserts end-of-line marker (carriage return, line feed). Can be used to generate multiple lines in the output, for example for the tooltip of the system  notification area (&amp;quot;systray&amp;quot;) icon.&lt;br /&gt;
&lt;br /&gt;
=== $cut(a,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns first &#039;&#039;len&#039;&#039; characters on the left of &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $directory(x) ===&lt;br /&gt;
&lt;br /&gt;
Extracts directory name from the file path &#039;&#039;x&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $directory(x,n) ===&lt;br /&gt;
&lt;br /&gt;
Extracts directory name from the file path &#039;&#039;x&#039;&#039;; goes up by &#039;&#039;n&#039;&#039; levels.&lt;br /&gt;
&lt;br /&gt;
=== $ext(x) ===&lt;br /&gt;
&lt;br /&gt;
Extracts file extension from &#039;&#039;x&#039;&#039; which must be a file name or path.&lt;br /&gt;
&lt;br /&gt;
=== $filename(x) ===&lt;br /&gt;
&lt;br /&gt;
Extracts file name from full path.&lt;br /&gt;
&lt;br /&gt;
=== $fix_eol(x) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;x&#039;&#039; contains an end-of-line marker (CR-LF), the end-of-line marker and all text to the right of it is replaced by &amp;quot; (...)&amp;quot;. Otherwise &#039;&#039;x&#039;&#039; is returned unaltered.&lt;br /&gt;
&lt;br /&gt;
=== $fix_eol(x,indicator) ===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;x&#039;&#039; contains an end-of-line marker (CR-LF), the end-of-line marker and all text to the right of it is replaced by &#039;&#039;indicator&#039;&#039;. Otherwise &#039;&#039;x&#039;&#039; is returned unaltered.&lt;br /&gt;
&lt;br /&gt;
=== $hex(n) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in hexadecimal notation.&lt;br /&gt;
&lt;br /&gt;
=== $hex(n,len) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in hexadecimal notation with &#039;&#039;len&#039;&#039; digits. Pads with zeros from the left if necessary.&lt;br /&gt;
&lt;br /&gt;
=== $insert(a,b,n) ===&lt;br /&gt;
&lt;br /&gt;
Inserts &#039;&#039;b&#039;&#039; into &#039;&#039;a&#039;&#039; after &#039;&#039;n&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $left(a,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns the first &#039;&#039;len&#039;&#039; characters from the left of &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $len(a) ===&lt;br /&gt;
&lt;br /&gt;
Returns length of string &#039;&#039;a&#039;&#039; in characters.&lt;br /&gt;
&lt;br /&gt;
=== $len2(a) ===&lt;br /&gt;
&lt;br /&gt;
Returns length of string x in characters, respecting double-width character rules (double-width characters will be counted as two).&lt;br /&gt;
&lt;br /&gt;
=== $longer(a,b) ===&lt;br /&gt;
&lt;br /&gt;
Returns //true//, if string &#039;&#039;a&#039;&#039; is longer than string &#039;&#039;b&#039;&#039;, false otherwise.&lt;br /&gt;
&lt;br /&gt;
=== $lower(a) ===&lt;br /&gt;
&lt;br /&gt;
Converts &#039;&#039;a&#039;&#039; to lowercase.&lt;br /&gt;
&lt;br /&gt;
=== $longest(a,...) ===&lt;br /&gt;
&lt;br /&gt;
Returns the longest of its arguments. Can be used with an arbitrary number of strings.&lt;br /&gt;
&lt;br /&gt;
=== $num(n,len) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in decimal notation with &#039;&#039;len&#039;&#039; digits. Pads with zeros from the left if necessary.&lt;br /&gt;
&lt;br /&gt;
=== $pad(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the left with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $pad_right(x,y) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the right with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $pad(x,len,char) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the left with &#039;&#039;char&#039;&#039; to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $pad_right(x,len,char) ===&lt;br /&gt;
&lt;br /&gt;
Pads &#039;&#039;x&#039;&#039; from the right with &#039;&#039;char&#039;&#039; to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $padcut(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns first &#039;&#039;len&#039;&#039; characters from the left of &#039;&#039;x&#039;&#039;, if &#039;&#039;x&#039;&#039; is longer than &#039;&#039;len&#039;&#039; characters. Otherwise pads &#039;&#039;x&#039;&#039; from the left with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $padcut_right(x,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns first &#039;&#039;len&#039;&#039; characters from the left of &#039;&#039;x&#039;&#039;, if &#039;&#039;x&#039;&#039; is longer than &#039;&#039;len&#039;&#039; characters. Otherwise pads &#039;&#039;x&#039;&#039; from the right with spaces to &#039;&#039;len&#039;&#039; characters.&lt;br /&gt;
&lt;br /&gt;
=== $progress(pos,range,len,a,b) ===&lt;br /&gt;
&lt;br /&gt;
Creates a progress bar: &#039;&#039;pos&#039;&#039; contains position, &#039;&#039;range&#039;&#039; contains range, &#039;&#039;len&#039;&#039; progress bar length in characters, &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039; are characters to build progress bar with.&lt;br /&gt;
&lt;br /&gt;
Example:&#039;&#039;$progress(%_time_elapsed_seconds%, %_time_total_seconds%, 20,&#039;#&#039;,&#039;=&#039;)&#039;&#039; produces &amp;quot;====#===============&amp;quot;, the # character is moving with playback position.&lt;br /&gt;
&lt;br /&gt;
=== $progress2(pos,range,len,a,b) ===&lt;br /&gt;
&lt;br /&gt;
Creates a progress bar: &#039;&#039;pos&#039;&#039; contains position, &#039;&#039;range&#039;&#039; contains range, &#039;&#039;len&#039;&#039; progress bar length in characters, &#039;&#039;a&#039;&#039; and &#039;&#039;b&#039;&#039; are characters to build progress bar with. Produces different appearance than &#039;&#039;$progress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $repeat(a,n) ===&lt;br /&gt;
&lt;br /&gt;
Returns &#039;&#039;n&#039;&#039; copies of &#039;&#039;a&#039;&#039;. Note that &#039;&#039;a&#039;&#039; is evaluated once before its value is used, so &#039;&#039;$repeat&#039;&#039; cannot be used for loops.&lt;br /&gt;
&lt;br /&gt;
=== $replace(a,b,c) ===&lt;br /&gt;
&lt;br /&gt;
Replaces all occurrences of string &#039;&#039;b&#039;&#039; in string &#039;&#039;a&#039;&#039; with string &#039;&#039;c&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Can also be used with an arbitrary number of arguments. Note that &#039;&#039;$replace(a,b1,c1,b2,c2)&#039;&#039; is generally not the same as &#039;&#039;$replace($replace(a,b1,c1),b2,c2)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$replace(ab,a,b,b,c)&#039;&#039; -&amp;gt; &amp;quot;bc&amp;quot;, &#039;&#039;$replace($replace(ab,a,b),b,c)&#039;&#039; -&amp;gt; &amp;quot;cc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $right(a,len) ===&lt;br /&gt;
&lt;br /&gt;
Returns the first &#039;&#039;len&#039;&#039; characters from the right of &#039;&#039;a&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $roman(n) ===&lt;br /&gt;
&lt;br /&gt;
Formats the integer number &#039;&#039;n&#039;&#039; in roman notation.&lt;br /&gt;
&lt;br /&gt;
=== $shortest ===&lt;br /&gt;
&lt;br /&gt;
Returns the shortest of its arguments. Can be used with an arbitrary number of strings.&lt;br /&gt;
&lt;br /&gt;
=== $strchr(s,c) ===&lt;br /&gt;
&lt;br /&gt;
Finds first occurence of character &#039;&#039;c&#039;&#039; in string &#039;&#039;s&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$strchr(abca,a)&#039;&#039; -&amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
=== $strrchr(s,c) ===&lt;br /&gt;
&lt;br /&gt;
Finds last occurence of character &#039;&#039;c&#039;&#039; in string &#039;&#039;s&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$strrchr(abca,a)&#039;&#039; -&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
=== $strstr(s1,s2) ===&lt;br /&gt;
&lt;br /&gt;
Finds first occurence of string &#039;&#039;s2&#039;&#039; in string &#039;&#039;s1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $strcmp(s1,s2) ===&lt;br /&gt;
&lt;br /&gt;
Performs a case-sensitive comparison of the strings &#039;&#039;s1&#039;&#039; and &#039;&#039;s2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $stricmp(s1,s2) ===&lt;br /&gt;
&lt;br /&gt;
Performs a case-insensitive comparison of the strings &#039;&#039;s1&#039;&#039; and &#039;&#039;s2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $substr(s,m,n) ===&lt;br /&gt;
&lt;br /&gt;
Returns substring of string &#039;&#039;s&#039;&#039;, starting from &#039;&#039;m&#039;&#039;-th character and ending at &#039;&#039;n&#039;&#039;-th character.&lt;br /&gt;
&lt;br /&gt;
=== $trim(s) ===&lt;br /&gt;
&lt;br /&gt;
Removes leading and trailing spaces from string &#039;&#039;s&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== $tab() ===&lt;br /&gt;
&lt;br /&gt;
Inserts one tabulator character.&lt;br /&gt;
&lt;br /&gt;
=== $tab(n) ===&lt;br /&gt;
&lt;br /&gt;
Inserts &#039;&#039;n&#039;&#039; tabulator characters.&lt;br /&gt;
&lt;br /&gt;
=== $upper(s) ===&lt;br /&gt;
&lt;br /&gt;
Converts string &#039;&#039;s&#039;&#039; to uppercase.&lt;br /&gt;
&lt;br /&gt;
= Track info =&lt;br /&gt;
&lt;br /&gt;
The functions and fields in this section can be used to access information about tracks.&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== $meta(name) ===&lt;br /&gt;
Returns value of tag called &#039;&#039;name&#039;&#039;. If multiple values of that tag exist, they are concatenated with &amp;quot;, &amp;quot; as separator.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta(artist)&#039;&#039; -&amp;gt; &amp;quot;He, She, It&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta(name,n) ===&lt;br /&gt;
Returns value of &#039;&#039;n&#039;&#039;-th tag called &#039;&#039;name&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta(artist,2)&#039;&#039; -&amp;gt; &amp;quot;She&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta_sep(name,sep) ===&lt;br /&gt;
Returns value of tag called &#039;&#039;name&#039;&#039;. If multiple values of that tag exist, they are concatenated with &#039;&#039;sep&#039;&#039; as separator.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta_sep(artist,&#039; + &#039;)&#039;&#039; -&amp;gt; &amp;quot;He + She + It&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta_sep(name,sep,lastsep) ===&lt;br /&gt;
Returns value of tag called &#039;&#039;name&#039;&#039;. If multiple values of that tag exist, they are concatenated with &#039;&#039;sep&#039;&#039; as separator between all but the last two values which are concatenated with &#039;&#039;lastsep&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$metasep(artist,&#039;, &#039;,&#039;, and &#039;)&#039;&#039; -&amp;gt; &amp;quot;He, She, and It&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $meta_test(...) === &lt;br /&gt;
Returns true, if all given tags exist.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta_test(artist,title)&#039;&#039; -&amp;gt; true&lt;br /&gt;
&lt;br /&gt;
=== $meta_num(name) ===&lt;br /&gt;
Returns the number of values for the tag called &#039;&#039;name&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$meta_num(artist)&#039;&#039; -&amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
=== $tracknumber() ===&lt;br /&gt;
Returns the tracknumber padded to 2 digits with zeroes.&lt;br /&gt;
&lt;br /&gt;
=== $tracknumber(n) ===&lt;br /&gt;
Returns the tracknumber padded to &#039;&#039;n&#039;&#039; digits with zeros.&lt;br /&gt;
&lt;br /&gt;
== Technical information ==&lt;br /&gt;
&lt;br /&gt;
=== $info(name) ===&lt;br /&gt;
Returns value of technical information field called &#039;&#039;name&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$info(channels)&#039;&#039; -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
=== $codec() ===&lt;br /&gt;
Returns codec of track. If no codec field is present, it the uses file extension.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$codec()&#039;&#039; -&amp;gt; &amp;quot;WavPack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== $channels() === &lt;br /&gt;
Returns number of channels in text format.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;$channels()&#039;&#039; -&amp;gt; &amp;quot;stereo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_album_gain% ===&lt;br /&gt;
Returns ReplayGain album gain value. //Not available through// &#039;&#039;$info(replaygain_album_gain)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_album_peak% ===&lt;br /&gt;
Returns ReplayGain album peak value. //Not available through// &#039;&#039;$info(replaygain_album_peak)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_track_gain% ===&lt;br /&gt;
Returns ReplayGain track gain value. //Not available through// &#039;&#039;$info(replaygain_track_gain)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== %__replaygain_track_peak% ===&lt;br /&gt;
Returns ReplayGain track peak value. //Not available through// &#039;&#039;$info(replaygain_track_peak)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Special fields ==&lt;br /&gt;
&lt;br /&gt;
=== $extra(name) ===&lt;br /&gt;
Returns the value of the special field called &#039;&#039;name&#039;&#039;. These fields can also be accessed as &#039;&#039;%_name%&#039;&#039;; note the additional underscore. The following field names can be used:&lt;br /&gt;
==== filename ====&lt;br /&gt;
Returns the filename without directory and extension.&lt;br /&gt;
==== filename_ext ====&lt;br /&gt;
Returns the filename with extension, but without the directory.&lt;br /&gt;
==== directoryname ====&lt;br /&gt;
Returns the name of the parent directory only, not the complete path.&lt;br /&gt;
==== path ====&lt;br /&gt;
Returns the path.&lt;br /&gt;
==== path_raw ====&lt;br /&gt;
Returns the path as URL including the protocol scheme.&lt;br /&gt;
==== subsong ====&lt;br /&gt;
Returns the subsong index. The subsong index is used to distuingish multiple tracks in a single file, for example for cue sheets, tracker modules and various container formats.&lt;br /&gt;
==== foobar2000_version ====&lt;br /&gt;
Returns a string representing the version of foobar2000.&lt;br /&gt;
==== length ====&lt;br /&gt;
Returns the length of the track formatted as hours, minutes, and seconds.&lt;br /&gt;
==== length_ex ====&lt;br /&gt;
Returns the length of the track formatted as hours, minutes, seconds, and milliseconds.&lt;br /&gt;
==== length_seconds ====&lt;br /&gt;
Returns the length of the track in seconds.&lt;br /&gt;
==== length_seconds_fp ====&lt;br /&gt;
Returns the length of the track in seconds as floating point number.&lt;br /&gt;
==== length_samples ====&lt;br /&gt;
Returns the length of the track in samples.&lt;br /&gt;
&lt;br /&gt;
= Variable operations =&lt;br /&gt;
&lt;br /&gt;
Variables can be used to store strings and number. They cannot store truth values. They are best used to store intermediate results that you need multiple times. Variable names are not case-sensitive.&lt;br /&gt;
&lt;br /&gt;
=== $get(name) ===&lt;br /&gt;
&lt;br /&gt;
Returns the value that was last stored in the variable &#039;&#039;name&#039;&#039;, if the variable was not defined (yet), it returns nothing. The truth value returned by &#039;&#039;$get&#039;&#039; indicates if the variable &#039;&#039;name&#039;&#039; was defined.&lt;br /&gt;
&lt;br /&gt;
=== $put(name,value) ===&lt;br /&gt;
&lt;br /&gt;
Stores &#039;&#039;value&#039;&#039; in the variable &#039;&#039;name&#039;&#039; and returns &#039;&#039;value&#039;&#039; unaltered.&lt;br /&gt;
&lt;br /&gt;
=== $puts(name,value) ===&lt;br /&gt;
&lt;br /&gt;
Stores &#039;&#039;value&#039;&#039; in the variable &#039;&#039;name&#039;&#039; and returns only the truth value of &#039;&#039;value&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Musicmusic</name></author>
	</entry>
	<entry>
		<id>https://wiki.hydrogenaudio.org/index.php?title=Foobar2000_Talk:Foobar2000&amp;diff=3244</id>
		<title>Foobar2000 Talk:Foobar2000</title>
		<link rel="alternate" type="text/html" href="https://wiki.hydrogenaudio.org/index.php?title=Foobar2000_Talk:Foobar2000&amp;diff=3244"/>
		<updated>2005-04-04T22:10:01Z</updated>

		<summary type="html">&lt;p&gt;Musicmusic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I&#039;m using Mozilla and it displays correctly unless I try to select it.  I think it&#039;s best to have the correct code in there though, even at the expense of this bizarre behavior.  I avoided writing it like that because of that problem.  Thanks.  :)  --[[User:Topdownjimmy|Topdownjimmy]] 23:07, 14 Feb 2005 (CST)&lt;br /&gt;
----&lt;br /&gt;
I just put the code in the &#039;Basic Color Codes&#039; section into code blocks for ease of reading, but found I had to use IE to do the editing since firefox couldn&#039;t handle the block chars in the edit panel. Firefox seems to display them fine though. Is this going to be a problem? Thought I should ask before I tried to do the same for the rest of the page. - krazy&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Thanks, krazy, for the link to picmixer&#039;s masstagger guide. :) I moved it to the end of the masstagger section because I think it makes more sense there.--[[User:Topdownjimmy|Topdownjimmy]] 22:45, 13 Feb 2005 (CST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Reversed order of discussion posts (newer at top).  Thanks, krazy, for pointing out foo_looks was problematic.&lt;br /&gt;
&lt;br /&gt;
--[[User:Topdownjimmy|Topdownjimmy]] 15:07, 13 Feb 2005 (CST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Removed references to foo_looks and replaced with foo_ui_gfx. It&#039;s just that I don&#039;t think a [http://www.hydrogenaudio.org/forums/index.php?showtopic=17872 potential troublemaker] should be on the wiki page. Other than that, looking good!&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Krazy, I moved your &amp;quot;Commonly Used Panel Extensions&amp;quot; down into the Columns UI section of the Beginner&#039;s Guide, I hope you don&#039;t mind.&lt;br /&gt;
-topdownjimmy&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Why use the underscore in the LAST_PLAYED tag? A space works just as well, is completely compliant, and is much easier to type.&lt;br /&gt;
-Canar&lt;br /&gt;
&lt;br /&gt;
apparently firefox doesnt like the colour code markers in the slightest, they seem to have got a bit messed up in my edit, sorry. also maybe someone wants to take notice/work on this:&lt;br /&gt;
WARNING: This page is 35 kilobytes long; some browsers may have problems editing pages approaching or longer than 32kb. Please consider breaking the page into smaller sections. --[[User:Musicmusic|musicmusic]] 17:10, 4 Apr 2005 (CDT)&lt;/div&gt;</summary>
		<author><name>Musicmusic</name></author>
	</entry>
	<entry>
		<id>https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Foobar2000&amp;diff=3236</id>
		<title>Foobar2000:Foobar2000</title>
		<link rel="alternate" type="text/html" href="https://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Foobar2000&amp;diff=3236"/>
		<updated>2005-04-04T22:07:20Z</updated>

		<summary type="html">&lt;p&gt;Musicmusic: fixed some links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.foobar2000.org/ &#039;&#039;&#039;foobar2000&#039;&#039;&#039;] is a free music player for Windows. It features multiple playlists, a music database, streaming, [[ReplayGain]] support, extensive plug-ins support and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== A note to potential editors ===&lt;br /&gt;
&lt;br /&gt;
The Newbie Guide is intended to provide no more than a very basic competence in fb2k.  Therefore, it should be relatively broad, readable in one sitting, and contain only the most essential information for getting started.  Any documentation beyond this purpose belongs in the Intermediate or Advanced Use sections.  Similarly, small issues that demand a significant amount of detail are better suited for the FAQ section.&lt;br /&gt;
&lt;br /&gt;
Remember that if any reader feels that the Newbie Guide is beneath them, they may always move beyond it, but a Newbie Guide that is bogged down by too much information will be no less intimidating than the looming behemoth we call our forum.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Supported... ===&lt;br /&gt;
&lt;br /&gt;
==== Playback Formats ====&lt;br /&gt;
&lt;br /&gt;
* [[MP3]], [[Ogg Vorbis]], [[MP2]], [[AAC]], [[WAV]], [[AIFF]], [[Musepack]], [[VOC]], [[SND]]&lt;br /&gt;
&lt;br /&gt;
Supported through plug-ins:&lt;br /&gt;
&lt;br /&gt;
* [[TTA]], [[FLAC]], [[Monkey&#039;s Audio]], [[WavPack]], [[Speex]], [[Mod]], [[SPC]], [[TFMX]], [[Shorten]], [[OptimFROG]], [[LPAC]], [[WMA]], [[AC3]], [[PSF]], [[NSF]], [[XID]], [[XA]], [[Matroska]]&lt;br /&gt;
&lt;br /&gt;
In addition, foobar2000 can also play music directly from compressed RAR, ZIP and 7-ZIP archives without requiring the user to extract the files prior to playing.&lt;br /&gt;
&lt;br /&gt;
==== Languages ====&lt;br /&gt;
&lt;br /&gt;
* English&lt;br /&gt;
&lt;br /&gt;
==== Platforms ====&lt;br /&gt;
&lt;br /&gt;
* Windows&lt;br /&gt;
&lt;br /&gt;
No known plans exists to port it to other platforms, but attempts have been made, with varying degrees of success, to run foobar2000 on x86 Linux systems by using Wine.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== User Interface ===&lt;br /&gt;
&lt;br /&gt;
====Standard====&lt;br /&gt;
&lt;br /&gt;
By default foobar2000 uses the standard interface, foo_ui_standard.  This interface is based around a tabbed list of playlists.  Playlists are then formatted according to the title formatting strings entered by the user.  These allow access to tag data, as well as information about the state of the program in the playlist display.&lt;br /&gt;
&lt;br /&gt;
====Columns UI====&lt;br /&gt;
&lt;br /&gt;
[http://www.hydrogenaudio.org/forums/index.php?showtopic=28647 foo_ui_columns] is an extension of the ideas used in the standard interface.  It takes the open area of the playlist and divides it into one or more columns that have individual formatting strings.  Recent versions of Columns UI have also added support for UI Extension panels which appear in Columns UI&#039;s sidebar or in the toolbar.&lt;br /&gt;
&lt;br /&gt;
Because of the useful extensions to the Standard UI, Columns UI is rapidly becoming popular and continues to be under rapid development.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Newbie Guide ===&lt;br /&gt;
&lt;br /&gt;
==== Introduction ====&lt;br /&gt;
&lt;br /&gt;
Always remember that the best way to become comfortable with foobar is to read [http://www.hydrogenaudio.org/forums/index.php?showforum=28 the forums] regularly and to play around with foobar itself.  90% of what you learn will come from the forums and experimentation.&lt;br /&gt;
&lt;br /&gt;
The heart of foobar lies in its components, which supplement foobar&#039;s functionality.  If you are having trouble with a component, the first step is to consult that component&#039;s documentation, preferences, and forum thread.  Any question you have as a beginner has probably already been asked and answered in the forums a half dozen times.  Please search the forums thoroughly for an answer before posting your question.  If you must post a question, try to avoid creating a new topic.  An appropriate topic most likely already exists, so post your question as a reply in that topic.&lt;br /&gt;
&lt;br /&gt;
==== Using Columns UI ====&lt;br /&gt;
&lt;br /&gt;
It is best for reasonably computer-literate users to start with [http://www.hydrogenaudio.org/forums/index.php?showtopic=28647 Columns UI] as their user interface; the TAGZ formatting needed is very basic and the panel extensions will make foobar much more user-friendly, resembling mp3 players you&#039;re more accustomed to.&lt;br /&gt;
&lt;br /&gt;
Bookmark these sites before using Columns UI:&lt;br /&gt;
&lt;br /&gt;
*[http://www.hydrogenaudio.org/forums/index.php?showtopic=28647 Columns UI thread]: &#039;&#039;very&#039;&#039; large, but the first post contains links to important related sites and panel extensions&lt;br /&gt;
&lt;br /&gt;
*[http://music.morbo.org/wiki/columns_ui:faqs Columns UI FAQ]: a short FAQ, including installation instructions&lt;br /&gt;
&lt;br /&gt;
[[Image:Columnsui.png|thumb|The Columns UI interface]]&lt;br /&gt;
&lt;br /&gt;
*[http://music.morbo.org/wiki/columns_ui:columns_ui Columns UI documentation]: it is &#039;&#039;crucial&#039;&#039; that you familiarize yourself with this over time&lt;br /&gt;
&lt;br /&gt;
The Columns UI interface consists of:&lt;br /&gt;
* &#039;&#039;Playlist View&#039;&#039;: The Playlist View is the large area that displays the songs in your current playlist.  Other playlists appear as tabs at the top of the Playlist View.  Each row in the Playlist View is divided into one or more columns that may be individually formatted using TAGZ strings.&lt;br /&gt;
* &#039;&#039;Toolbar&#039;&#039;: The Toolbar is the area above the Playlist View and can display playback buttons, the menu, playlist search, and other toolbar components.&lt;br /&gt;
* &#039;&#039;Sidebar&#039;&#039;: The Sidebar resides to the left of the Playlist View and can display panel extensions as well as toolbar components.  The Sidebar is enabled by checking both &amp;quot;Enable Sidebar&amp;quot; and &amp;quot;Show Sidebar&amp;quot; in the &amp;quot;Columns UI&amp;quot; subgroup of the &amp;quot;Components&amp;quot; menu.&lt;br /&gt;
&lt;br /&gt;
===== Panel Extensions =====&lt;br /&gt;
&lt;br /&gt;
Panel extensions add album art, track info, and other useful components to the Columns UI Sidebar.  Installing panels to Columns UI is simple; just copy the .dll into your foobar2000\components folder and restart foobar.  To display an installed panel or toolbar in the Sidebar, right-click on any gray area of the Sidebar for a list of items you can add.&lt;br /&gt;
&lt;br /&gt;
[[Image:Sidebaradd.png|thumb|Adding panels to the sidebar]]&lt;br /&gt;
&lt;br /&gt;
Links to supported panels are given in the [http://www.hydrogenaudio.org/forums/index.php?showtopic=28647 Columns UI thread] of the [http://www.hydrogenaudio.org/forums/index.php?showforum=28 foobar2000 forums].&lt;br /&gt;
&lt;br /&gt;
Some popular panels include (in no particular order):&lt;br /&gt;
&lt;br /&gt;
*[http://music.everywebhost.com/download/foo_uie_albumlist.7z foo_uie_albumlist] &#039;&#039;Albumlist Panel&#039;&#039;&amp;lt;br /&amp;gt;Sorts music into a hierarchical tree, allowing you to easily browse and select different branches of your collection.&lt;br /&gt;
&lt;br /&gt;
*[http://www.hydrogenaudio.org/forums/index.php?showtopic=28869 foo_uie_tabs] &#039;&#039;Tabbed Panel Stack&#039;&#039;&amp;lt;br /&amp;gt;Allows multiple panels to be stacked in a tabbed interface.&lt;br /&gt;
&lt;br /&gt;
*[http://www.hydrogenaudio.org/forums/index.php?showtopic=29383 foo_uie_albumart] &#039;&#039;Album Art Panel&#039;&#039;&amp;lt;br /&amp;gt;Displays album art from images in a specified folder.&lt;br /&gt;
&lt;br /&gt;
*[http://www.hydrogenaudio.org/forums/index.php?showtopic=29363 foo_uie_trackinfo] &#039;&#039;Track Info Panel&#039;&#039;&amp;lt;br /&amp;gt;Displays information about the currently playing or selected track. Can be customised using TAGZ strings.&lt;br /&gt;
&lt;br /&gt;
*[http://www.hydrogenaudio.org/forums/index.php?showtopic=28665 foo_uie_volume] &#039;&#039;Volume Control Toolbar&#039;&#039;&amp;lt;br /&amp;gt;Volume control extension for Columns UI. Provides a slider to control volume.&lt;br /&gt;
&lt;br /&gt;
*[http://www.hydrogenaudio.org/forums/index.php?showtopic=26475 foo_playlistfind] &#039;&#039;Playlist Find Panel&#039;&#039;&amp;lt;br /&amp;gt;Finds tracks in current playlist matching input text.&lt;br /&gt;
&lt;br /&gt;
*[http://www.hydrogenaudio.org/forums/index.php?showtopic=8609 foo_history] &#039;&#039;History Plugin/Panel&#039;&#039;&amp;lt;br /&amp;gt;Displays and provides browser-style navigation through recently played songs.&lt;br /&gt;
&lt;br /&gt;
To see what some people have done with Columns UI and panel extensions, check out the [http://www.hydrogenaudio.org/forums/index.php?showtopic=30988 Foobar Gallery].  If you see something you like, try to do it yourself.  If you get stumped, you might find an answer in the [http://wiki.hydrogenaudio.org/index.php?title=Foobar2000&amp;amp;action=submit#Tips_.26_Tricks Tips &amp;amp; Tricks] section below.&lt;br /&gt;
&lt;br /&gt;
==== Basic TAGZ ====&lt;br /&gt;
&lt;br /&gt;
TAGZ is the language used to define how information about a track is displayed.  Although you can do some very complex things using TAGZ, you should have a basic understanding of it now because you&#039;ll be encountering it a lot whether you want to or not.  The text displayed in each column of the playlist in Columns UI is defined by a string of TAGZ code, located in &amp;quot;Foobar 2000 &amp;gt; Preferences &amp;gt; Display &amp;gt; Columns UI &amp;gt; (Columns tab).&amp;quot;  TAGZ strings and functions are thoroughly documented in the titleformat_help.html file located in your foobar2000 directory.  Bookmark this file and familiarize yourself with it as much as possible. It might look very strange at first, but once you see some TAGZ strings &amp;quot;in action&amp;quot; it will begin to make sense, and you will refer to it constantly.&lt;br /&gt;
&lt;br /&gt;
[[Image:Columnstagz.png|thumb|Columns UI preferences]]&lt;br /&gt;
&lt;br /&gt;
Looking in the Columns UI preferences, you will see that the TAGZ code used for the &amp;quot;Artist&amp;quot; column is:&lt;br /&gt;
&lt;br /&gt;
 [%artist%]&lt;br /&gt;
&lt;br /&gt;
%artist% retrieves the contents of the ARTIST field stored in the file&#039;s tag.  The brackets [ ] around %artist% mean that the ARTIST field should only be shown if it exists. If there is no ARTIST field, nothing will be displayed; without the brackets, a question mark would be displayed.&lt;br /&gt;
&lt;br /&gt;
Not to be confused with TAGZ, a file&#039;s &amp;quot;tag&amp;quot; contains what is known as &amp;quot;metadata.&amp;quot;  Information about the file, such as artist, album, tracknumber, etc., are stored within the file in the form of tag fields.  Much of the foobar environment is &#039;&#039;vitally&#039;&#039; dependent on accurate tags, so keep yours in order.&lt;br /&gt;
&lt;br /&gt;
Some common tag fields are:&lt;br /&gt;
&lt;br /&gt;
[[Image:fileinfo.png|thumb|The File Info window]]&lt;br /&gt;
&lt;br /&gt;
*ARTIST&lt;br /&gt;
*ALBUM ARTIST (for &amp;quot;Various Artists,&amp;quot; etc.)&lt;br /&gt;
*ALBUM&lt;br /&gt;
*TRACKNUMBER&lt;br /&gt;
*TITLE (track title)&lt;br /&gt;
*DATE&lt;br /&gt;
*GENRE&lt;br /&gt;
*COMMENT&lt;br /&gt;
&lt;br /&gt;
To view and edit the tag fields contained within a particular file, right-click on that file in the playlist and click &amp;quot;Properties.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Data in the &amp;quot;Technical info&amp;quot; pane on the right can be retrieved using a double underscore: %__bitrate%.&lt;br /&gt;
&lt;br /&gt;
Looking again in Columns UI preferences, the TAGZ string used for the &amp;quot;Title&amp;quot; column is:&lt;br /&gt;
&lt;br /&gt;
 $if2(%title%,%_filename%)&lt;br /&gt;
&lt;br /&gt;
$if2(x,y) is a TAGZ &#039;&#039;function&#039;&#039; that takes two parameters and produces one result.  Using titleformat_help.html, try to figure out what this TAGZ string will produce, and why it was written this way. You might also want to try creating columns that contain your own TAGZ strings.  As always, titleformat_help.html is your best friend.&lt;br /&gt;
&lt;br /&gt;
[[Image:Trackinfo.png|thumb|Track Info&#039;s real-time display]]&lt;br /&gt;
&lt;br /&gt;
The [http://www.hydrogenaudio.org/forums/index.php?showtopic=29363 trackinfo] panel can be VERY helpful in teaching you how TAGZ strings behave. This panel updates in real-time as you edit its TAGZ-based configuration. It is recommended that you install and display this panel, using it as a &amp;quot;scratch pad&amp;quot; to help you become familiar with TAGZ.&lt;br /&gt;
&lt;br /&gt;
As you become more proficient, you might want to download some [http://foobar.nub4life.net/columns/ ready-made Columns UI configs] to see some more complex TAGZ strings in action.  Import the .fcs file from the &amp;quot;Other&amp;quot; tab in the Columns UI preferences (be sure to export your current config first to back it up in case you&#039;re not happy with the one you import).  Study how these strings do what they do and change them around to see how the display is affected.&lt;br /&gt;
&lt;br /&gt;
==== Masstagger ====&lt;br /&gt;
&lt;br /&gt;
The Masstagger component is very handy when you need to perform relatively complex tag operations on a group of files.&lt;br /&gt;
&lt;br /&gt;
To perform tag operations on a group of files using Masstagger, highlight those files in the playlist, right-click on them, and choose &amp;quot;Masstagger &amp;gt; Edit tags.&amp;quot;  The &amp;quot;Actions to perform&amp;quot; pane in the Masstagger window displays the actions that will be performed on the list of &amp;quot;Files to process&amp;quot; when the &amp;quot;Run&amp;quot; button is clicked.  To add an action to perform, click the &amp;quot;Add&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
[[Image:Masstagger.png|thumb|The Masstagger window]]&lt;br /&gt;
&lt;br /&gt;
A simple action to perform is to set some field to a given value.  For example, to set the GENRE field for all selected files to &amp;quot;Rock,&amp;quot; choose &amp;quot;Set value...&amp;quot; from the &amp;quot;Select action type&amp;quot; window.  In the &amp;quot;Field name&amp;quot; drop down list, choose &amp;quot;GENRE,&amp;quot; and in the &amp;quot;Field value&amp;quot; box, type &amp;quot;Rock&amp;quot; (without quotes).  When you click &amp;quot;OK,&amp;quot; the action will be listed in the &amp;quot;Actions to perform&amp;quot; pane.  Click &amp;quot;Run&amp;quot; to perform these actions on the selected files.&lt;br /&gt;
&lt;br /&gt;
Before clicking &amp;quot;OK,&amp;quot; you may choose to save this group of actions (this &amp;quot;script&amp;quot;) for easy retrieval later.  Just type in a name for the script in the &amp;quot;Scripts&amp;quot; section below (in this case, something like &amp;quot;Set GENRE to &#039;Rock&#039;&amp;quot;), and click &amp;quot;Save.&amp;quot;  Later, to retrieve the saved script, select it from the drop-down menu and click &amp;quot;Load.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Realistically, this would be more easily achieved by selecting the files to be processed in the playlist, right-clicking them and choosing &amp;quot;Properties,&amp;quot; then editing the GENRE field in the &amp;quot;File Info&amp;quot; window.  There are many more tag actions you can perform with Masstager, including guessing tags from filenames, and formatting tag fields based on other tag fields.  These operations depend on an understanding of the TAGZ language. For a more in-depth explanation of some of the possibilities of the Masstagger, see picmixer&#039;s &#039;[http://www.hydrogenaudio.org/forums/index.php?showtopic=12302 FB2K&#039;s Masstagger, an unofficial Beginners Guide]&#039;.&lt;br /&gt;
&lt;br /&gt;
==== The Database ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Albumlist.png|thumb|The Album list window]]&lt;br /&gt;
&lt;br /&gt;
The Database keeps track of all the info for all the files you play in foobar.  The Database is crucial for such things as the albumlist panel (included with Columns UI), the [http://wiki.hydrogenaudio.org/index.php?title=Foobar2000&amp;amp;action=submit#Extended_Playlist_Generator Extended Playlist Generator] (included in the special installer), and other components.  The Database uses information from your files&#039; tags, so &#039;&#039;make sure your tags are in order&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To enable the Database, check the &amp;quot;Database enabled&amp;quot; box in the &amp;quot;Database&amp;quot; section of Preferences.  If you would like to add an entire directory of music to the Database, enter the directory in the &amp;quot;Restrict directories to:&amp;quot; box.  ****QUIT OUT OF FB2K***, start it back up, go back to the &amp;quot;Database&amp;quot; section, THEN click the &amp;quot;scan&amp;quot; button.  Keeping this directory in the box will prevent files in other directories from being added in the future, however, so uncheck it if you will be adding files from other locations as well.  Files are added to the Database whenever they are added to a playlist.&lt;br /&gt;
&lt;br /&gt;
You can view the contents of the Database using the Album list component.  Click &amp;quot;Components &amp;gt; Album list.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Extended Playlist Generator ====&lt;br /&gt;
&lt;br /&gt;
The Extended Playlist Generator can automatically create playlists from the contents of a playlist or [http://wiki.hydrogenaudio.org/index.php?title=Foobar2000&amp;amp;action=submit#The_Database the Database] based on criteria that you specify.  To access the EPG, click &amp;quot;Components &amp;gt; Extended Playlist Generator &amp;gt; Configure Playlist Query...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Image:Epg.png|thumb|The Extended Playlist Generator]]&lt;br /&gt;
&lt;br /&gt;
For starters, try entering the name of an artist you know is in your database in the &amp;quot;Query:&amp;quot; box.  Click &amp;quot;Run.&amp;quot;  The results will appear below.  To create a playlist with these results, enter a name for the playlist in the &amp;quot;Playlist Name:&amp;quot; box and click the &amp;quot;Create Playlist&amp;quot; button.  To save a query, click the &amp;quot;Save&amp;quot; button.  It will be saved in the presets under the &amp;quot;Playlist Name&amp;quot; you specified.  Once saved, a query can be recalled and its playlist regenerated by clicking &amp;quot;Components &amp;gt; Extended Playlist Generator &amp;gt; Generate Playlist...&amp;quot; in the menu toolbar.&lt;br /&gt;
&lt;br /&gt;
Click the &amp;quot;Help&amp;quot; button in the EPG for help formatting queries.  EPG uses both the TAGZ language and its own query language of conditionals such as GREATER and HAS.  Try this simple query:&lt;br /&gt;
&lt;br /&gt;
 %date% GREATER 1979&lt;br /&gt;
&lt;br /&gt;
This query will return all songs whose DATE tag is greater than 1979.  Save this query as &amp;quot;The &#039;80s, &#039;90s, and today!&amp;quot;  Queries that use tag fields like this require that the tag fields exist in the first place.  Another reason to keep your tags ship-shape!&lt;br /&gt;
&lt;br /&gt;
==== Third-Party Components ====&lt;br /&gt;
&lt;br /&gt;
There is a slew of third-party components that can fill many of your foobar needs.  Installing these and using them is as simple as installing and using Columns UI&#039;s panel extensions: just download the .dll, copy it into your foobar2000\components folder, and restart foobar.&lt;br /&gt;
&lt;br /&gt;
Check out the [http://www.hydrogenaudio.org/forums/index.php?showtopic=21105 Most Sought-After Plugins] forum thread and [http://pelit.koillismaa.fi/plugins/ the official third-party components site] for a list of available components.&lt;br /&gt;
&lt;br /&gt;
==== Things to remember... ====&lt;br /&gt;
&lt;br /&gt;
Look around.  Play with stuff.  Experiment.  Right-click on something you&#039;ve never right-clicked on before.  Browse the preferences window.  Read the forums.  Study titleformat_help.html.  Have fun.  Don&#039;t forget to listen to music.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Intermediate Use ===&lt;br /&gt;
&lt;br /&gt;
==== Basic Color Codes ====&lt;br /&gt;
&lt;br /&gt;
Click on the &amp;quot;Colour&amp;quot; tab within the &amp;quot;Columns&amp;quot; tab of the Columns UI preferences. It is empty. If you want to customize the colors used in a column, you would put the color codes here and check the &amp;quot;Use custom colour spec&amp;quot; box above.&lt;br /&gt;
&lt;br /&gt;
Beneath the text box you will see a six-character hex code with a block character on either side of it:&lt;br /&gt;
&lt;br /&gt;
 �0080FF�&lt;br /&gt;
&lt;br /&gt;
This is what a color code looks like. To get a color code for a specific color, click on the &amp;quot;...&amp;quot; button, which will pop-up a palette and return the color you choose in the same gray box, ready to be copied and pasted.&lt;br /&gt;
&lt;br /&gt;
The way you format colors is given by clicking the &amp;quot;Tools&amp;quot; button, then by clicking &amp;quot;String help.&amp;quot; Concentrate on the first four items, which are required in every color code string:&lt;br /&gt;
&lt;br /&gt;
text|selected text|background|selected background&lt;br /&gt;
&lt;br /&gt;
For example, if I wanted my &amp;quot;Artist&amp;quot; column to display red text on white background when not selected, and yellow text on blue background when selected, I would use this format:&lt;br /&gt;
&lt;br /&gt;
(red color code)|(yellow color code)|(white color code)|(blue color code)&lt;br /&gt;
&lt;br /&gt;
The proper color code would then be:&lt;br /&gt;
&lt;br /&gt;
 �0000FF�|�00FFFF�|�FFFFFF�|�FF0000�&lt;br /&gt;
&lt;br /&gt;
[[Image:Color.png|Custom color sample]]&lt;br /&gt;
&lt;br /&gt;
Note that unlike most other applications, Foobar uses a hexadecimal &#039;&#039;&#039;BGR&#039;&#039;&#039; color scheme, which means that if you use any alternate color pickers you will need to switch the first and last two characters. (Example: FF0080 (magenta) in Photoshop should be changed to 8000FF in Foobar)&lt;br /&gt;
&lt;br /&gt;
The block character may instead be represented by $char(3), as in:&lt;br /&gt;
&lt;br /&gt;
 $char(3)0000FF$char(3)&lt;br /&gt;
&lt;br /&gt;
You may also represent color codes as RGB values using this format:&lt;br /&gt;
&lt;br /&gt;
 $rgb(255,128,0)&lt;br /&gt;
&lt;br /&gt;
These alternate codes are useful when the block character is unavailable or becomes problematic (as it does in Firefox).&lt;br /&gt;
&lt;br /&gt;
==== Advanced TAGZ ====&lt;br /&gt;
&lt;br /&gt;
==== Album List &amp;amp; Album List Panel ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Album List&#039;&#039;&#039; extension (foo_albumlist) comes as a part of the default Foobar package. This extension allows you to sort your music a variety of ways, each displaying it in a hierarchical tree format. While Album List comes by default and can be used without the &#039;&#039;&#039;Columns UI&#039;&#039;&#039;, the &#039;&#039;&#039;Album List Panel&#039;&#039;&#039; extension (foo_uie_albumlist) improves on it in many ways.&lt;br /&gt;
&lt;br /&gt;
===== Usage of Album List =====&lt;br /&gt;
&lt;br /&gt;
The Album list sorts music through a variety of sort strings. To get the music to display, you must enable the database by going to &#039;&#039;&#039;preferences/database.&#039;&#039;&#039; By default, Albumlist comes with a handful of &amp;quot;views,&amp;quot; which when selected show different layouts of your collection. All of these views are fully customizable with TAGZ, and additional views can be added or removed in the preferences. When making a new view using TAGZ, keep in mind that each branch is represented by a single pipe (&amp;quot;|&amp;quot;) character. It is important to note that the TAGZ string will be split up by these pipes, meaning that &#039;&#039;&#039;each section must be valid TAGZ code by itself.&#039;&#039;&#039; For example:&lt;br /&gt;
&lt;br /&gt;
 $if(%album artist%,%album%|$num(%tracknumber%,2) - %title%,%artist%|%album%|$num(%tracknumber%,2) - &lt;br /&gt;
 %title%)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not valid code.&#039;&#039;&#039; As far as Albumlist is concerned, this string would be interpreted as such:&lt;br /&gt;
&lt;br /&gt;
 $if(%album artist%,%album%&lt;br /&gt;
 $num(%tracknumber%,2) - %title%,%artist%&lt;br /&gt;
 %album%&lt;br /&gt;
 $num(%tracknumber%,2) - %title%)&lt;br /&gt;
&lt;br /&gt;
Assuming that the intended behavior was for %album artist% to have a different string than the regular artist, you will have to put an $if() statement in every section:&lt;br /&gt;
&lt;br /&gt;
  $if(%album artist%,%album%,%artist%)|$if(%album artist%,$num(%tracknumber%,2) - &lt;br /&gt;
  %title%,%album%)|$if($not(%album artist%),$num(%tracknumber%,2) - %title%)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is valid code.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== ReplayGain ====&lt;br /&gt;
&lt;br /&gt;
Replaygain calculates the average volume of either a track (track gain) or an album (album gain) and uses this information to properly adjust the volume of tracks, that are mastered at different volume levels, during playback. This will make sure that you will have a similar volume levels on all of your tracks or albums without loosing any dynamic range of your music. In the case of Album Gain, it will even make sure that more quiet tracks of an album will sound more quiet and tracks that where meant to be louder, louder. As you can probably already tell, Album Gain would probably be the best way to make use of Replaygain. For more details, check the [[Replaygain]] wiki page.&lt;br /&gt;
&lt;br /&gt;
Setting it up is realtively easy. Simply select all the tracks you want to Replaygain in your playlist and you will be presented with several options:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Scan per file track gain&#039;&#039;&amp;lt;br&amp;gt;This will scan the selection and will add Replaygain values file by file, meaning that the difference in loudness of files coming from the same album is not preserved. This would be the recommended way of scanning tracks of wich you don&#039;t own the entire Album. (If you only have a few files of an Album, but they come from the same source (rip), I would also recommend using Album gain.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Scan selection as album&#039;&#039;&amp;lt;br&amp;gt;Not that hard to guess, using this option, you will have to select all the tracks that belong to one album and scan them. The difference in loudness between quiet and loud tracks will be left intact.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Scan selection as multiple albums using album field&#039;&#039;&amp;lt;br&amp;gt;In case all your files are properly tagged this would probably be the easiest way to initially set up Replaygain. It will scan all selected files and properly gain them album by album using the album info found in the file tag.&lt;br /&gt;
&lt;br /&gt;
Replaygaining your files will not alter them in any way. It stores all the information it needs into the file tags or Foobars database and the actual file is not changed what so ever. The whole process is obviously fully reversible by simply removing the Replaygain info from the file. (Or simply disabling Replaygain during playback). Check your playback preferences, for all playback options considering Replaygain&lt;br /&gt;
&lt;br /&gt;
Replaygain can also be used when creating mix cd&#039;s with Foobars diskwriter. Simply enable it in the diskwriter preferences to make sure you get nicely balanced compilations without annoyingly large differences in volume levels.&lt;br /&gt;
&lt;br /&gt;
Note that Replaygain will in a lot of cases also prevent your files from clipping, since it usually lowers the playback volume of very loudly mastered tracks. Whereas this is not the main intention of Replaygain ( volume levelling is), this comes as a nice side effect to some people. You even have the option to scale down tracks that still clip after applying Replaygain using the peak info (again, check your preferences for this option).&lt;br /&gt;
&lt;br /&gt;
Last but not least, I will mention the two preamps in the Playback preferences. Except if you know exactly what you are doing, it is not recommended to raise the output of the preamps above the default 0.0dB in any way. However you can use these to slightly compensate for the difference between replaygained and unreplaigained Tracks. Simply estimate your average Replaygain level and lower the preamp for files without Replaygain info by that value. I found -8dB to work quite well for me. This obviously should not be used to compensate for not properly Replaygaining your tracks, but definetaly will protect your ears and your equipment when coming across tracks that miss Replaygain info.&lt;br /&gt;
&lt;br /&gt;
[http://www.hydrogenaudio.org/forums/index.php?showtopic=31140 An interesting discussion] of Replaygain, mastering, clipping etc.&lt;br /&gt;
&lt;br /&gt;
==== Diskwriter ====&lt;br /&gt;
&lt;br /&gt;
==== The Database &amp;amp; Tag Writing ====&lt;br /&gt;
&lt;br /&gt;
The database identifies files by path, filename, modification date and filesize.  If any of these properties are changed by a program other than foobar itself, foobar will reload the metadata from the file the next time it is played.&lt;br /&gt;
&lt;br /&gt;
==== Default UI Strings ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Advanced Use ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Tips &amp;amp; Tricks ===&lt;br /&gt;
&lt;br /&gt;
==== Volume Slider in Sidebar/Toolbar ====&lt;br /&gt;
&lt;br /&gt;
[http://www.hydrogenaudio.org/forums/index.php?showtopic=28665 foo_uie_volume]&lt;br /&gt;
&lt;br /&gt;
==== Placing Panels Above the Playlist ====&lt;br /&gt;
&lt;br /&gt;
To place panels above the playlist, check &amp;quot;List all toolbars&amp;quot; in the &amp;quot;Other&amp;quot; tab of the Columns UI preferences.  When checked, right-clicking on the toolbar will give you the option of placing panels on the toolbar.  If a panel appears &amp;quot;squashed,&amp;quot; it is because it needs to have a minimum height set in its preferences.  If the panel extension has no minimum height setting, you may place it in a [http://www.hydrogenaudio.org/forums/index.php?showtopic=28869 panel stack], and set a minimum height via the panel stack options.&lt;br /&gt;
&lt;br /&gt;
==== Two Tabbed Panel Stacks in One Sidebar/Toolbar ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;While holding shift&#039;&#039;: Right-click on sidebar/toolbar, click &amp;quot;Layout &amp;gt; Tabbed Panel Stack&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Handy Strings ====&lt;br /&gt;
&lt;br /&gt;
===== Standardize my PLAY_DATE and PLAY_TIME fields =====&lt;br /&gt;
&lt;br /&gt;
LAST_PLAYED has been developed as a standard to replace the widely variable PLAY_DATE and PLAY_TIME usages.  Use these Masstagger scripts to convert your specific format to this new standard.  More info about LAST_PLAYED available [http://wiki.hydrogenaudio.org/index.php?title=Foobar2000_Encouraged_Tag_Standards#LAST_PLAYED here].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;!!!NOTE!!!&#039;&#039;&#039;&#039;&#039;: Be &#039;&#039;&#039;&#039;&#039;VERY CAREFUL&#039;&#039;&#039;&#039;&#039; when applying any of the scripts below.  Be sure to test the script on one file before running it on your whole library.&lt;br /&gt;
&lt;br /&gt;
If your current time/datestamp is in the format...&lt;br /&gt;
&lt;br /&gt;
* PLAY_DATE = DDMMYY, PLAY_TIME = HHMMSS (24hr) (this is foo_playcount&#039;s default format)&amp;lt;br&amp;gt;...download scripts from [http://www.hydrogenaudio.org/forums/index.php?showtopic=31592&amp;amp;view=findpost&amp;amp;p=274326 this thread post].&lt;br /&gt;
&lt;br /&gt;
* PLAY_DATE = YYYYMMDD, PLAY_TIME = HHMMSS (24hr)&amp;lt;br&amp;gt;...download script from [http://www.hydrogenaudio.org/forums/index.php?showtopic=31592&amp;amp;view=findpost&amp;amp;p=274343 this thread post].&lt;br /&gt;
&lt;br /&gt;
* PLAY_DATE = DD~MM~YY, PLAY_TIME = HH~MM~SS (where ~ is any one single-character separator)&amp;lt;br&amp;gt;...download script from [http://www.hydrogenaudio.org/forums/index.php?showtopic=31592&amp;amp;view=findpost&amp;amp;p=275872 this thread post].&lt;br /&gt;
&lt;br /&gt;
===== &amp;quot;The Band&amp;quot; becomes &amp;quot;Band, The&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
 $if($strcmp($left(%artist%,4),The ),$right(%artist%,$sub($len(%artist%),4))&#039;, &#039;The,%artist%)&lt;br /&gt;
&lt;br /&gt;
===== Pad tracknumber with leading zeros (&amp;quot;1&amp;quot; becomes &amp;quot;01&amp;quot;) =====&lt;br /&gt;
&lt;br /&gt;
 $num(%tracknumber%,2)&lt;br /&gt;
&lt;br /&gt;
===== Alternating Stripes in the playlist (Like iTunes) =====&lt;br /&gt;
&lt;br /&gt;
Go to Preferences/Display/Columns UI/Globals/Colour Tab, enter this under the background section of your color string (text|selected text|&#039;&#039;&#039;background&#039;&#039;&#039;|selected background|...)&lt;br /&gt;
&lt;br /&gt;
 $ifgreater($mod(%_playlist_number%,2),0,�F2E8DF�,�FFFFFF�)&lt;br /&gt;
&lt;br /&gt;
Replace the last two colors with your own.&lt;br /&gt;
&lt;br /&gt;
===== Indicate Replaygain tags =====&lt;br /&gt;
&lt;br /&gt;
This is if you want to show which kind of Replaygain you have. This string will show an &amp;quot;A&amp;quot; if album gain has been applied, a &amp;quot;T&amp;quot; if Track gain is applied, and a red &amp;quot;X&amp;quot; if there is no replaygain data in the file.&lt;br /&gt;
&lt;br /&gt;
 $if(%__replaygain_album_gain%,A,$if(%__replaygain_track_gain%,T,�0000FF|000�X))&lt;br /&gt;
&lt;br /&gt;
===== Indicate Audioscrobbler submission =====&lt;br /&gt;
&lt;br /&gt;
[http://www.audioscrobbler.com/ Audioscrobbler] is a service that, using the [http://pelit.koillismaa.fi/plugins/general.php#39 foo_scrobbler] component, keeps a record of the songs you listen to and provides various statistical reports.  A track is submitted when either 50% or 4 minutes have elapsed, and this is what the string tests for.  Actual submission to Audioscrobbler can only be verified by foobar&#039;s console.&lt;br /&gt;
&lt;br /&gt;
 $if(%_isplaying%,&lt;br /&gt;
 $ifgreater(%_time_elapsed_seconds%,240,&#039;*&#039;,&lt;br /&gt;
 $ifgreater(%_time_elapsed_seconds%,$div(%_time_total_seconds%,2),&#039;*&#039;,)))&lt;br /&gt;
&lt;br /&gt;
=== Components ===&lt;br /&gt;
&lt;br /&gt;
==== Track Info Panel (foo_uie_trackinfo) ====&lt;br /&gt;
&lt;br /&gt;
Post your custom [http://www.hydrogenaudio.org/forums/index.php?showtopic=29363 Track Info] strings here.  Please include a screenshot.&lt;br /&gt;
&lt;br /&gt;
===== beto&#039;s trackinfo string =====&lt;br /&gt;
&lt;br /&gt;
supports tech info from:&lt;br /&gt;
*mp3 (lame profiles and versions). you need cz&#039;s modified input std component&lt;br /&gt;
*vorbis (aotuv and xiph.org releases)&lt;br /&gt;
*FLAC&lt;br /&gt;
*Monkey&#039;s&lt;br /&gt;
*Wavpack&lt;br /&gt;
*Last Played tag (external database only)&lt;br /&gt;
&lt;br /&gt;
you may modify it at will...&lt;br /&gt;
&lt;br /&gt;
screenshot here -&amp;gt; http://www.hydrogenaudio.org/forums/index.php?showtopic=30988&amp;amp;view=findpost&amp;amp;p=283458&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Tagname color&lt;br /&gt;
 $puts(color1,�9C6B4C�)&lt;br /&gt;
 &lt;br /&gt;
 // Section name color&lt;br /&gt;
 $puts(color2,�000000�)&lt;br /&gt;
 // Tag color&lt;br /&gt;
 $puts(color3,�000080�)&lt;br /&gt;
 &lt;br /&gt;
 // Last played&lt;br /&gt;
 $puts(last_played_year,$substr(%__last_played%,1,4))&lt;br /&gt;
 $puts(last_played_month,$substr(%__last_played%,6,7))&lt;br /&gt;
 $puts(last_played_day,$substr(%__last_played%,9,10))&lt;br /&gt;
 $puts(last_played_hour,$substr(%__last_played%,12,13))&lt;br /&gt;
 $puts(last_played_min,$substr(%__last_played%,15,16))&lt;br /&gt;
 $puts(last_played_sec,$substr(%__last_played%,18,19))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 // Core code&lt;br /&gt;
 //$get(color1)Mode: $get(color3)%_trackinfo_mode%$char(10)$char(10)&lt;br /&gt;
 // Song info&lt;br /&gt;
 $get(color2)Song Info$char(10)&lt;br /&gt;
 $if(%artist%,$get(color1)Artist: $iflonger(%artist%,22,$get(color3)$cut(%artist%,22)&#039;...&#039;$char(10),$get(color3)%artist%$char(10)))&lt;br /&gt;
 $if(%album%,$get(color1)Album: $iflonger(%album%,21,$get(color3)$cut(%album%,21)&#039;...&#039;$char(10),$get(color3)%album%$char(10)))&lt;br /&gt;
 $if(%album_subtitle%,$get(color1)Album subtitle: $iflonger(%album_subtitle%,14,$get(color3)$cut(%album_subtitle%,14)&#039;...&#039;$char(10),$get(color3)%album_subtitle%$char(10)))&lt;br /&gt;
 $if(%subalbum%,$get(color1)Subalbum: $iflonger(%subalbum%,20,$get(color3)$cut(%subalbum%,20)&#039;...&#039;$char(10),$get(color3)%subalbum%$char(10)))&lt;br /&gt;
 $if(%title%,$get(color1)Title: $iflonger(%title%,23,$get(color3)$cut(%title%,23)&#039;...&#039;$char(10),$get(color3)%title%$char(10)))&lt;br /&gt;
 $if(%subtitle%,$get(color1)Subtitle: $iflonger(%subtitle%,20,$get(color3)$cut(%subtitle%,22)&#039;...&#039;$char(10),$get(color3)%subtitle%$char(10)))&lt;br /&gt;
 $char(10)&lt;br /&gt;
 //Last played&lt;br /&gt;
 $get(color2)Last Played$char(10)&lt;br /&gt;
 $get(color1)$if(%__last_played%,Date: $get(color3)$get(last_played_day)/$get(last_played_month)/$get(last_played_year)&lt;br /&gt;
 $char(10)$get(color1)Time: $get(color3)$get(last_played_hour):$get(last_played_min)$char(10)&lt;br /&gt;
 $get(color3)$ifgreater(%__play_counter%,1,$get(color1)Played: $get(color3)%__play_counter% times$char(10),$get(color1)Played: $get(color3)%__play_counter% time$char(10)),&lt;br /&gt;
 $get(color3)This song was never played$char(10))&lt;br /&gt;
 $char(10)&lt;br /&gt;
 //Tech information&lt;br /&gt;
 $get(color2)Tech Info$char(10)&lt;br /&gt;
 $get(color1)Codec: $get(color3)%__codec%$char(10)&lt;br /&gt;
 $if($stricmp($codec(),FLAC),$get(color1)Vendor: $get(color3)$cut(%__FLAC_vendor%,23)$char(10))&lt;br /&gt;
 $if($stricmp($codec(),Monkey&#039;&#039;s Audio),$get(color1)v/c: $get(color3)%__version%/%__compression%$char(10))&lt;br /&gt;
 $if($stricmp($codec(),WavPack),$get(color1)v/c: $get(color3)%__version%/%__compression%$char(10))&lt;br /&gt;
 $if($and($stricmp($codec(),MP3),%__lame_version%),$get(color1)Version: $get(color3)%__lame_version%$char(10))&lt;br /&gt;
 $if($and($stricmp($codec(),MP3),%__lame_profile%),$get(color1)Profile: $get(color3)$upper(%__lame_profile%)$char(10))&lt;br /&gt;
 $if($stricmp($codec(),Vorbis),$if($stricmp($left(%__vorbis_vendor%,2),AO),$get(color1)Vendor: $get(color3)$cut(%__vorbis_vendor%,12)$char(10),&lt;br /&gt;
 $if($stricmp($left(%__vorbis_vendor%,4),Xiph),$get(color1)Vendor: $get(color3)$cut(%__vorbis_vendor%,20)$char(10),$get(color1)Vendor: $get(color3)%__vorbis_vendor%$char(10))))&lt;br /&gt;
 $get(color1)Bitrate: $get(color3)%__bitrate%Kbps$char(10)&lt;br /&gt;
 $get(color1)Compression level: $get(color3)$muldiv(%__bitrate%,100,1411)&#039;%&#039;$char(10)&lt;br /&gt;
 $get(color1)Samplerate: $get(color3)%__samplerate% Hz$char(10)&lt;br /&gt;
 $if($strcmp(%__channels%,2),$if(%__mp3_stereo_mode%,$get(color1)Stereo mode: $get(color3)%__mp3_stereo_mode%$char(10),$get(color1)Stereo mode: $get(color3)stereo$char(10)),$get(color1)Stereo mode: $get(color3)mono$char(10))&lt;br /&gt;
 $if(%__replaygain_track_gain%,$get(color1)Track Gain: $get(color3)%__replaygain_track_gain%$char(10),$get(color1)Track Gain: $get(color3)No track gain$char(10))&lt;br /&gt;
 $if(%__replaygain_album_gain%,$get(color1)Album Gain: $get(color3)%__replaygain_album_gain%$char(10),$get(color1)Album Gain: $get(color3)No album gain$char(10))&lt;br /&gt;
 //$get(color1)Path: $get(color3)%_path%$char(10)&lt;br /&gt;
 //$if(%rippedby%,$get(color1)Ripper: $iflonger(%rippedby%,20,$get(color3)$cut(%rippedby%,20)&#039;...&#039;$char(10),$get(color3)%rippedby%$char(10)))&lt;br /&gt;
 //$if(%encodedby%,$get(color1)Encoder: $iflonger(%encodedby%,20,$get(color3)$cut(%encodedby%,20)&#039;...&#039;$char(10),$get(color3)%encodedby%$char(10)))&lt;br /&gt;
 $if(%comment%,$get(color1)Comment: $iflonger(%comment%,21,$get(color3)$cut(%comment%,21)&#039;...&#039;$char(10),$get(color3)%comment%$char(10)))&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== FAQ ===&lt;br /&gt;
&lt;br /&gt;
A rather extensive FAQ is available at the [http://shsc.info/foobar2000 SH/SC Wiki].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q: Album list shows dead entries after a restart, even though I used &amp;quot;Remove dead entries&amp;quot; before. Why is that?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A: The files are probably still contained in one of your playlists or in the history (only if you are using an older version of foo_history). Use &amp;quot;Playlist/Remove dead entries&amp;quot; from the main menu on all your playlists, or remove the dead entries manually. As long as the files are on a playlist, they will be in the database and thus will show up in album list.&lt;br /&gt;
&lt;br /&gt;
=== Encouraged Tag Standards ===&lt;br /&gt;
&lt;br /&gt;
FIELD_NAME [format] (component)&lt;br /&gt;
&lt;br /&gt;
* ALBUM ARTIST [e.g., Various Artists, The Foobar Collective] (none)&amp;lt;br&amp;gt;&#039;&#039;Notes&#039;&#039;: Field name is ALBUM ARTIST, with &#039;&#039;no underscore&#039;&#039;.  Tag should exist if and only if an album is by multiple artists, and be contained in every track.  Track-specific artists should be entered in the ARTIST tag, never in the TITLE tag.&amp;lt;br&amp;gt;[http://wiki.hydrogenaudio.org/index.php?title=Foobar2000_Encouraged_Tag_Standards#ALBUM_ARTIST (more about this standard)]&lt;br /&gt;
* LAST_PLAYED [2005-03-22 19:00:00...] ([http://www.hydrogenaudio.org/forums/index.php?showtopic=20719 foo_playcount])&amp;lt;br&amp;gt;&#039;&#039;Notes&#039;&#039;: Any amount or type of data may be placed after the time.  Compliant TAGZ code shall use $substr() instead of $right() when extracting substrings from this field.&amp;lt;br&amp;gt;&#039;&#039;See also&#039;&#039;: [http://wiki.hydrogenaudio.org/index.php?title=Foobar2000#Standardize_my_PLAY_DATE_and_PLAY_TIME_fields Standardize my PLAY_DATE and PLAY_TIME fields]&amp;lt;br&amp;gt;[http://wiki.hydrogenaudio.org/index.php?title=Foobar2000_Encouraged_Tag_Standards#LAST_PLAYED (more about this standard)]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Important Links ===&lt;br /&gt;
&lt;br /&gt;
==== Official Site ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.foobar2000.org foobar2000.org: Homepage]&lt;br /&gt;
&lt;br /&gt;
* [http://www.foobar2000.org/download.html foobar2000.org: Download]&lt;br /&gt;
&lt;br /&gt;
* [http://www.foobar2000.org/requirements.html foobar2000.org: Requirements]&lt;br /&gt;
&lt;br /&gt;
==== Community ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.hydrogenaudio.org/forums/index.php?showforum=28 Official foobar2000 forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.fforum.ru/index.php?showforum=59 Russian-language forum]&lt;br /&gt;
&lt;br /&gt;
* [http://www.foobar.prv.pl/ Polish-language forum]&lt;br /&gt;
&lt;br /&gt;
==== Guides ====&lt;br /&gt;
&lt;br /&gt;
* [http://foobar2000.net/ French-language guide]&lt;br /&gt;
&lt;br /&gt;
==== Appearance ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.hydrogenaudio.org/forums/index.php?showtopic=30988 Foobar Gallery]: screenshot thread&lt;br /&gt;
&lt;br /&gt;
* [http://pelit.koillismaa.fi/fb2k/index.php Default UI formatting strings]: cut-n-paste ready&lt;br /&gt;
&lt;br /&gt;
* [http://foobar.nub4life.net/columns/ Columns UI configs]: .fcs file format&lt;br /&gt;
&lt;br /&gt;
* [http://www.hydrogenaudio.org/forums/index.php?showtopic=30281 foo_ui_gfx (alpha)]: skin support for foobar&lt;br /&gt;
&lt;br /&gt;
==== Components / Plugins ====&lt;br /&gt;
&lt;br /&gt;
===== General =====&lt;br /&gt;
&lt;br /&gt;
* [http://www.hydrogenaudio.org/forums/index.php?showtopic=21105 Most Sought-After Plugins] (forum thread)&lt;br /&gt;
&lt;br /&gt;
* [http://pelit.koillismaa.fi/plugins/ Official third-party components site]&lt;br /&gt;
&lt;br /&gt;
* [http://www.hydrogenaudio.org/forums/index.php?showtopic=28647 Columns UI thread]: first post contains links to many Columns UI panel extensions&lt;br /&gt;
&lt;br /&gt;
* [http://foobar2000.free.fr/ A comprehensive guide to foobar2000 components] (French)&lt;br /&gt;
&lt;br /&gt;
===== Specific Components =====&lt;br /&gt;
&lt;br /&gt;
* [http://www.saunalahti.fi/cse/html/foobar.html case&#039;s Page]: special installer, diskwriter components, etc.&lt;br /&gt;
&lt;br /&gt;
* [http://www.saunalahti.fi/cse/kode54/index.php kode&#039;s Page]: file-formats, archive-support, OSD, shuffle (temporary mirror since the primary host is down)&lt;br /&gt;
&lt;br /&gt;
* [http://www.stud.uni-karlsruhe.de/~uzbs/fb2k/html/ foosion&#039;s Page]: dbsearch, cut n&#039; paste, history, etc.&lt;br /&gt;
&lt;br /&gt;
* [http://members.chello.pl/d.sieradzki/foobar/ Messer&#039;s page]: freedb-masstagger, streaming with save-function, etc.&lt;br /&gt;
&lt;br /&gt;
* [http://music.morbo.org/ musicmusic&#039;s Page]: textwriter, quicktag, custom sort, ui_columns, panels&lt;br /&gt;
&lt;br /&gt;
=== Thanks ===&lt;br /&gt;
&lt;br /&gt;
picmixer: ReplayGain tutorial&lt;/div&gt;</summary>
		<author><name>Musicmusic</name></author>
	</entry>
</feed>