Foobar2000 Configuration
From TrivialBeing
foobar2000, for those not in the know is a thorough audiophile's digital music player that comes as a barebones installation. At first glance it looks mundane and featureless, it isn't until you begin playing that you realize its true potential to obliterate the competition, the only downside is you need some basic programming knowledge and a little perseverance as the foobar communities' dedication to conformity and documentation is a little lax, despite the HydrogenAudio Wiki which describes the TAGZ, components and their uses. Be ready to comb their forums for your information and code.A lot of people have asked how I have my foobar2000 set up as I do and this is the purpose of this wiki entry - to explain and keep a record of my "versions".
Contents |
Design Version Overview
Version 1
This is a standard columns_ui layout with album art panel, album list panel and two traditional track info panels that show what song is being played in a manner clearly visible from a distance. For more of the traditional foobar2000 configurations and old desktops see this blog page: Blog:Desktops
Version 2
- Version 2 set about with a distinct aim, to make all the information visible from a distance and to render the album art as large as possible for asethetic reasons. For functionality all the columns_ui playlist, browser, search and menus are on auto-hide for perusal when needed.
- Version 2.5 introduces the track info panel modification by terrestrial, for which I have attempted to maintain documentation at the wiki. This allowed the inclusion of multiple fonts, PNG image display and absolute text positioning.
- Version 2.6 sees the evolution to a grey colour scheme, the inviso black visual style - while sultry and easy on the eyes, had a number of inconsistencies, most relevant of which was within firefox. So I had to revert back to my trusty W9DProm style and change everything to a less pretty but matchin grey. This was made particularly difficult by the presence of grey border lines due to the column_ui rendering - the colour of these depends wholly on the visual styles 3D system colour. The most relevant functional change is the introduction of a second album art panel - this includes artist images, something I had for a long time wished for. I finally got off my arse and wrote myself a script that could scan last.fm for artist images and download them.
- Version 2.7 comes as the result of a second glorious component from terrestrial, the single column playlist. This has the ability to show a scrollable playlist with all the display and rendering features of the track_info panel.
- Version 2.8, the last of this series presents a compact and elegant display showing a single column playlist, track info, 2x album art info panels (one for album art and one for artist), ratings code that shows a heart or star based on a rating (custom_info tag) usually assigned by keyboard shortcut.
Version 3
- Splitting from the "viewable from a distance" theme linked with the two prior incarnations (my living quarters have changed and I no longer require this) Version 3 attempts to provide an even more compact approach without loosing any of the detail. This was made possible by an update to the single column playlist panel that now allows jpg and gif file extensions to be shown through GDI ($imageabs2 function).
- Update v3.1 are mainly aesthetic improvements. The green "tick" is part of the "file status" script that determines whether the files is backed up, needs burning, has just been downloaded or requires tagging (system based on simply path checks).
- Version 3.2 shifts the tracknumber to the left column and continues to improve aesthetics. A progress bar has also been added for now playing items, not shown here.
Component and Functional Overview
Component List
Bold indicates essential. For more extensive details and latest downloads check here: foobar2000 0.9 Components
- foo_msnalt - MSN Now Playing - Shows currently playing song as MSN personal message
- foo_audioscrobbler - Audioscrobbler/Last.fm - Submits played song info to the last.fm database etc.
- foo_ui_columns - Columns UI - Provides User Interface and is the core basis for customization
- foo_playcount - Playback statistics - Official plugin that tracks "last played" and "playcount"
- foo_uie_single_column_playlist - Single Column Playlist Display - Provides playlist with track info panel display functions.
- foo_uie_quicksearch - Quick Search Toolbar - Search through database, results displayed in playlist
- foo_uie_albumart - Album Art Panel - Shows images based on strings provided, for instance folder.jpg in the same folder as the mp3
- foo_custominfo - Custom Info - Stores extra tag information in SQL, items linked by filename. If file location changes it is no longer linked. Useful for ratings.
- foo_uie_albumlist - Album List Panel - The album list as a panel
- foo_run - Run Services - Run applications from within foobar2000 using strings that can include tags as parameters, can assign to keyboard shortcuts.
- foo_utils - Playlist tools - Adds extra functionality
- foo_uie_trackinfo_mod - Track info panel mod - Allows information display using absolutely positioned text using multiple fonts, also displays images and can create custom buttons.
- foo_cwb_hooks - Title Format Hooks - Adds new and helpful tags which can be used by track info panel, etc.
Single Column Playlist Code
Version 3
This code is based on that found in version 2, so only this version is being shown.
Item Display:
$padding(5,0) // *** COLOUR & FONT SETTINGS *** $puts(font,calibri) $puts(fontSize,10) $puts(fontSizeSelected,10) $puts(fontColor,150-150-150) $puts(fontSmall,Small Fonts) $puts(fontSmallSize,7) $puts(fontSmallColor,101-131-188) $puts(fontLength,Silkscreen) $puts(fontLengthSize,6) $puts(fontLengthColor,111-111-111) // Alternate row colours $if($greater($mod(%list_index%,2),0),$drawrect(0,0,0,0, brushcolor-10-10-10),) // Draw selection $if(%_selected%,$drawrect(-2,0,0,0,brushcolor-20-20-20 pencolor-null)) $if(%_focused%,$drawrect(-2,0,0,0,brushcolor-null pencolor-80-80-80)) $if(%_selected%,$textcolor(SYSCOL-9),$textcolor(SYSCOL-8)) // Text padding $padding(2,0) // Tracknumber column $if(%_selected%,, //$drawrect(-1,0,26,,brushcolor-null pencolor-150-150-150) $drawrect(0,0,25,,brushcolor-42-42-42 pencolor-null) $if($greater($mod(%list_index%,2),0),$drawrect(-1,0,27,, brushcolor-50-50-50),) $alignabs(7,0,25,25,center,middle) $font($get(fontLength),$get(fontLengthSize),fixedwidth,$get(fontSmallColor)) %tracknumber%) // Text padding $padding($if(%_selected%,2,32),0) $font(Arial,8,fixedwidth,$get(fontSmallColor)) // Two settings - one for ratings, one for normal $if($strstr(%cwb_activelist%, '-s-'), // *** RATINGS PLAYLIST *** $align(left,top)%artist% $char(10) $font($get(fontSmall),$get(fontSmallSize),,$get(fontSmallColor))%title% $if(%play_count%, '['%play_count%']') $font($get(fontSmall),$get(fontSmallSize),,$get(fontSmallColor))$align(right,top), // *** NORMAL PLAYLIST *** $align(left,top) // Determine if Various Artists album based on filename (VA, OST, DJ Kicks) $if($or($strstr(%path%,'VA'),$strstr(%path%,'OST'),$strstr(%path%,'DJ Kicks'),$strstr(%cwb_activelist%,Search)), // --- VARIOUS ALBUMS --- // If selected show ONLY title $if(%_selected%, $align(left,middle)$font($get(font),$get(fontSizeSelected),bold,255-255-255) » $cut(%title%,35) $font($get(fontSmall),$get(fontSmallSize),boldfixedwidth,$get(fontSmallColor)) [ %_time_elapsed%] $font($get(fontSmall),$get(fontSmallSize),,$get(fontSmallColor))$if(%play_count%, '['%play_count%']'), // Normally show ALL info (i.e. not selected) $align(left,middle)$font(,,,$get(fontColor)) $cut(%title%,38)$char(10) // Show artist as well $font($get(fontSmall),$get(fontSmallSize),,$get(fontSmallColor))%artist% $if(%play_count%, '['%play_count%']') $font($get(fontSmall),$get(fontSmallSize),,$get(fontSmallColor))$align(right,top)), // --- NORMAL ALBUMS --- $align(left,middle)$font($get(font), $if(%_selected%,$get(fontSizeSelected),$get(fontSize)),$if(%_selected%,bold),$if(%_selected%,255-255-255,$get(fontColor))) $if(%_selected%, » )$cut(%title%,45) $font($get(fontSmall),$get(fontSmallSize),boldfixedwidth,$get(fontSmallColor)) [ %_time_elapsed%] $font($get(fontSmall),$get(fontSmallSize),,$get(fontSmallColor)) $if(%play_count%, '['%play_count%']') //End of VA IF ) //End of PLAYLIST IF ) $if(%_selected%,, //$drawrect($sub(%_width%,100),0,26,,brushcolor-null pencolor-150-150-150) $drawrect($sub(%_width%,115),0,63,,brushcolor-32-32-32 pencolor-null) $if($greater($mod(%list_index%,2),0),$drawrect($sub(%_width%,116),0,65,, brushcolor-40-40-40),) ) // *** RATINGS & TRACKNUMBER CODE *** // If rating show NO track / length details $if(%RATING%, , // Otherwise show them $font($get(fontLength),$get(fontLengthSize),fixedwidth,$get(fontSmallColor)) //$align(right,middle)%tracknumber% $font($get(fontSmall),$get(fontSmallSize),,$get(fontLengthColor))$char(10) $font($get(fontLength),$get(fontLengthSize),fixedwidth,$get(fontLengthColor)) //%_length% $if(%_selected%,,$alignabs($sub(%_width%,38),10,100,20,left,top)$font(,,fixedwidth,$get(fontSmallColor))%length%) $if(%_selected%,,$alignabs($sub(%_width%,70),10,30,50,center,top)$font(,,,$get(fontLengthColor))%list_index%) //$alignabs($sub(%_width%,100),10,27,50,right,top)$font(,,,$get(fontSmallColor))%tracknumber% ) // Ratings images $if(%RATING%, $if($greater(%RATING%,4), // If Rating > 4 show HEART image $imageabs($sub(%_width%, 55),3,images/heart-1.png,) , // Else show STAR $imageabs($sub(%_width%, 50),3,images/star-1.png,))) $if($and(%isplaying%,%_selected%), //////////TRACKINFO MOD PROGRESS BAR $padding(0,0) $drawrect($sub(%_width%,85),10,63,7,brushcolor-null pencolor-101-131-188) $puts(progress,$muldiv(%playback_time_seconds%,62,%length_seconds%)) $ifgreater($get(progress),0, $drawrect($sub(%_width%,84),11,$get(progress),5,brushcolor-101-131-188 pencolor-null),) )
Trackinfo Display Codes
Version 2 Code
I apologise for this mess, I never released it so I never bothered to tidy up the code much, a lot of tests still remain comented out. For formatting details etc. scroll past the code that modifies the date into a readable and nice form.
$if(%isplaying%, // Original code by necropimp, then modified by AstreaEdge, and again by KockRoach // Habla likes things his way, and modified it more. // FofR stripped it down and gutted for new trackinfo mod // Show Artist? (1 = show, 0 = don't show) $puts(arts,1) // Show Album? $puts(albs,1) // Show Title? $puts(tils,1) // Info Heading Color e.g. "Title:" $puts(head,$rgb(98,98,98)) // Info Color, e.g. "Black Dog" $puts(info,�000000�) // Info Annotation Color (e.g. "kbps" is the annotation) $puts(anno,�000000�) // ****************************************************************** // ************************ DATE CONVERSION ************************* // ****************************************************************** // Day Conversion $puts(day,$substr(%last_played%,9,10)) $if(%last_played%, $if($strcmp($left($get(day),1),0),$puts(day,$right($get(day),1)))) $if($strcmp($get(day),11),$puts(xx,th), $if($strcmp($get(day),12),$puts(xx,th), $if($strcmp($get(day),13),$puts(xx,th), $if($strcmp($right($get(day),1),1),$puts(xx,st), $if($strcmp($right($get(day),1),2),$puts(xx,nd), $if($strcmp($right($get(day),1),3),$puts(xx,rd), $puts(xx,th))))))) // Month Conversion $puts(month,$substr(%last_played%,6,7)) $puts(month_name,$select($get(month), Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)) // Year Conversion $puts(year,$substr(%last_played%,1,4)) // Time Conversion $puts(hour,$substr(%last_played%,12,13)) $puts(min,$substr(%last_played%,14,16)) $puts(sec,$substr(%last_played%,17,19)) // 24 Hour to 12 Hour Conversion $if($strcmp($left($get(hour),1),0),$puts(hour1,$right($get(hour),1))) $if($strcmp($left($get(hour),1),1),$puts(hour1,$sub($get(hour),12))) $if($strcmp($left($get(hour),1),2),$puts(hour1,$sub($get(hour),12))) $if($strcmp($get(hour),00),$puts(hour1,12)) $if($strcmp($get(hour),10),$puts(hour1,10)) $if($strcmp($get(hour),11),$puts(hour1,11)) $if($strcmp($get(hour),12),$puts(hour1,12)) // AM/PM Conversion $if($strcmp($get(hour),00),$puts(yy,am)) $if($strcmp($get(hour),10),$puts(yy,am)) $if($strcmp($get(hour),11),$puts(yy,am)) $if($strcmp($get(hour),12),$puts(yy,pm)) $if($strcmp($get(hour),24),$puts(yy,am)) $if($strcmp($left($get(hour),1),0),$puts(yy,am)) $if($strcmp($left($get(hour),1),1),$puts(yy,pm)) $if($strcmp($left($get(hour),1),2),$puts(yy,pm)) // Date Format $puts(time_of_year,$get(month_name) $get(day)$get(xx)',' $get(year)) // Time Format $puts(time_of_day,$get(hour1)$get(min)$get(sec) $get(yy)) // ****************************************************************** // ******************* FORMATTING BEGINNING ************************* // ****************************************************************** $drawrect(-10,-18,$add(%_width%,20),50,brushcolor-0-0-0 pencolor-null) $drawrect(-10,-20,$add(%_width%,20),50,brushcolor-217-219-219 pencolor-null) $puts(cwidth, $calcwidth($if(%album%, Album: %album%) # %tracknumber% # $if(%year%, date: %year%) # $if(%genre%, genre: %genre%) : $if(%play_count%, %play_count: %last_played%))) $if($greater($mul($get(cwidth),2),%_width%), $if($greater($sub($mul($get(cwidth),2),100),%_width%), $if($greater($mul($get(cwidth),1),%_width%), $if($greater($sub($mul($get(cwidth),1),123),%_width%), $puts(txt2,9),$puts(txt2,10)),$puts(txt2,13)),$puts(txt2,14)),$puts(txt2,15)) // Top Bar $align(center,top) $font(BigNoodleTitling,9,,) $if($strcmp(1,$get(albs)),$if(%album%,$get(head) Album: $font(Bebas,$get(txt2),,111-111-111)$cut(%album%,37) $font(BigNoodleTitling,9,,) $ifgreater($len(%album%),37,'...',) ,),) $if(%tracknumber%,$get(head)# $get(info)%tracknumber% » ,) $if(%date%,$get(head)Date: $get(info)%date% » ,) $if(%genre%,$get(head)Genre: $get(info)%genre% » ,) //$get(head)Length: $get(info)$if(%_isplaying%,%_time_elapsed%$get(anno)$if(%_length%, / %_length%,),%_length%) // Not currently using Quality settings $font(BigNoodleTitling,9,,) //$get(head)Quality: $if(%__codec%, $get(info)%__codec%) $get(info) //$if2(%__bitrate_dynamic%,%__bitrate%) $get(anno)Kb/s //$if($stricmp(%__codec%,mp3),$if($stricmp(%__extrainfo%,vbr),VBR / ,CBR / )) //$if(%__lame_version%,$get(head)Encoder: $get(info)$left(%__lame_version%,4) //$right(%__lame_version%,4) [$upper(%__lame_profile%)] / ,) //$if(%__flac_vendor%,$get(head)Encoder: $get(info)$if($stricmp(%__flac_vendor%,reference libFLAC 1.1.2 20050205),FLAC 1.1.2 -8) / ,) //$if(%__mpc_profile%,$get(head)MPC Profile: $get(info)%__mpc_profile% / ,) //$if(%_filesize%,$get(head)Size: $get(info) //$div(%_filesize%,1048576).$left($num($muldiv($mod(%_filesize%,1048576),100,1048576),2),2) //$get(anno)'MB',) $if(%last_played%, // Play Stats ,) $if(%play_count%,$get(head)$get(info)%play_count%,) $if(%last_played%, : $get(head)$get(info)$font(BigNoodleTitling,9,,)$get(time_of_year),) //%_width% $put(cwidth, $calcwidth($if(%album%, Album: %album%) # %tracknumber% # $if(%year%, date: %year%) # $if(%genre%, genre: %genre%) : $if(%play_count%, %play_count: %last_played%))) //$get(txt2) $calcwidth(%album%) %_width% // %_width% $mul($calcwidth(%artist% - %title%),5) $mul($calcwidth(%artist% - %title%),4) $puts(txt1,$if($greater($mul($calcwidth(%artist% - %title%),5),%_width%), $if($greater($mul($calcwidth(%artist% - %title%),4),%_width%), $if($greater($mul($calcwidth(%artist% - %title%),3),%_width%), $if($greater($add($mul($calcwidth(%artist% - %title%),2),75),%_width%), 10,15),20),25),30)) $puts(pad,$if($greater(21,$get(txt1)),10,0))) $padding(0,$get(pad)) // Track and Artist $align(center,bottom) $font(Bebas,$get(txt1),,) $if($strcmp(1,$get(arts)),$if(%artist%,$get(head)$get(info)%artist% - ,),) $font(Bebas,$get(txt1),,101-131-188) $if($strcmp(1,$get(tils)),$if(%title%,$if(%title%,$cut(%title%,45) $ifgreater($len(%title%),45,'...',)) ,$get(info)%_filename% ● ),) $char(10) // Gradient - semi transparent PNG placed atop of everything $imageabs(0,37,images/backg_litewhitenew.png,) //$imageabs(0,-22,images/sidefade.png,) $imageabs($sub(%_width%,13),-22,images/sidefaderight.png,) $if(%RATING%, $imageabs(-30,-26,images/star-big3.png,), $if($not($and(%artist%,%title%)),$imageabs(10,0,images/alert.png,))) $if($strstr(%path%,'Permanent'), $imageabs($sub(%_width%, 30),8,images/tick_s2.png,)) $if($strstr(%path%,'Tag Check'),$imageabs($sub(%_width%, 30),4,images/tag_ss2.png,)) $if($strstr(%path%,'Burn'), $imageabs($sub(%_width%, 30),8,images/nero_ss.png,)) $if($strstr(%path%,'Azureus'), $imageabs($sub(%_width%, 25),10,images/Azureus_ss2.png,)) ) )

