Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Topics - karbock

Pages: 12
Hello Steven,
This is the description of a minor UI bug I had never bothered to mention.

With a default font size >= 13 pt,
some text portions overlap the bottom of a stack of drop-down/edit boxes.

It occurs
* with different skins, including MusicBee3.xmlc.
* with different fonts, including Segoe UI 13+.

Windows scaling 100%
Screen resolution 1920x1080

In the screenshots below, the mouse cursor is located near the overlapping.
Font used: Segoe UI 14.
4th screenshot: the text at the window bottom is unreadable (truncated, but no scollbar).

Location in interface
Track Information /
Customise Panel...
Preferences /
Albums view /
Customise Panel...
Preferences /
text at the bottom

Skins / Savanna & Wisteria (skins)
« on: May 24, 2024, 01:26:25 PM »
Savanna & Wisteria skins

Two light skins based on Cheetah DNA 1.4 by hiccup.
  • Savanna: light warm tones based on a brown palette.
  • Wisteria: light tones based on a mauve/violet palette.
They are in .XML format (editable), so that you can adapt them to your liking.

Download links


Savanna skin
Wisteria skin
Album view
Album & Tracks view
Now Playing

Changes, compared to Cheetah DNA

Gradients used for:
  • player panel background
  • column headers
  • highlighted tab
  • scrollbar buttons
  • setting buttons
Alternating colours added for:
  • now playing
  • thumbnail browser

Fonts used in the screenshots

Font name
Supported scripts
Default fontUbuntuLatin, Greek, Cyrillic
Sub-grouping headerLiterataLatin, Greek, Cyrillic
Now playing trackLiterataLatin, Greek, Cyrillic
LyricsMonomakh UnicodeLatin, Cyrillic, early Cyrillic (for Slavonic)

Hello Steven,
Unfortunately the latest 3.6 patch fails when opening Preferences / Tags(1).
No error code however with custom button Edit: configure custom/virtual tags.

Error code:

MusicBee v3.6.8869.35315P  (Win10.0), 13 avr. 2024 11:58:

System.IndexOutOfRangeException: L'index se trouve en dehors des limites du tableau.
   à #=zVoMmRDAlqA7NUgg1zKI5vrSUN0li..ctor(#=zEEsjfoBOKVKWBtDGRVqcSDw= #=z7iapCL4=)
   à #=zEEsjfoBOKVKWBtDGRVqcSDw=.#=z5J10nldXZu2WuK0nww==(Object #=zlgYPS5A=, EventArgs #=zAfU1xXk=)
   à #=zg464_YFN5zfP3MvKpUpLOMw=.#=z0aAFBoo6Qpnj(#=zBln3I3eOP4CgtguivPbxYS_6DqDU #=zAfU1xXk=)
   à #=zg464_YFN5zfP3MvKpUpLOMw=.#=zlLs1N_RsVmbO.#=zQVammS0sUlpF(Int32 #=z4WXYZPM=, Boolean #=zQ6WLjxHEYY$J, Boolean #=zkkdI0kCMK_Vl)
   à #=zg464_YFN5zfP3MvKpUpLOMw=.#=zlLs1N_RsVmbO.#=zEs6hUTzsTDZ1TbxQzA==(Int32 #=z4WXYZPM=, Keys #=zP60WF50=)
   à #=zg464_YFN5zfP3MvKpUpLOMw=.#=zlLs1N_RsVmbO.OnMouseDown(MouseEventArgs #=zAfU1xXk=)
   à System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
   à System.Windows.Forms.Control.WndProc(Message& m)
   à #=zzfhvgYrqvo6LjDGGYMMv9V0=.WndProc(Message& #=zUwLpNow=)
   à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Skins / silvestreccf's skins
« on: March 18, 2024, 05:40:07 PM »
Skins by silvestreccf

New common download link
for the following skins created by silvestreccf (deactivated account),
with the author's prior approval:
  • Aura Dark
  • Aura Light
  • Aurora
  • Purenight Blue

The download links used in the respective skin pages are now valid and up-to-date.

Aura Dark

Version3.0 "Newlights", May 2024
DeviantArt pageHere, to view the latest changes and additional screenshots

Aura Light

Version7.0 "Newlights", May 2024
DeviantArt pageHere, to view the latest changes and additional screenshots



Purenight Blue


Silvestreccf's homepages

MusicBee Wishlist / path replacements in bookmarks.dat
« on: December 30, 2023, 11:23:16 AM »
Bookmarks can relate to regular audio tracks or podcasts.

But the references are not adapted in bookmarks.dat, neither for regular audio tracks nor for podcast files:
* when using File -> Library -> Relink Music File Paths...
* when using Preferences -> tab 'Library' -> section 'podcasts' -> 'naming template' -> button 'Reorganise...'

As a result, bookmarks become unusable for files that have been moved.
And since bookmarks.dat isn't plain text, it isn't editable, so there's no workaround.

I suggest that, when the two features mentioned above perform path replacements in the library / playlists / Subscriptions.dat,
they carry out the replacements in bookmarks.dat in the same stride.


Related topics in 'Questions':

Tips and Tricks / Storing and Displaying Translated Tags
« on: December 10, 2023, 05:12:35 PM »
Storing and Displaying Translated Tags

If you wish to store two versions of some tags (original + translated),
the method proposed here uses:
  • one custom tag to store all the translations,
  • virtual tags, one for each translated piece of information.

Example used throughout this post

Let us take as example a track and its translation/transliteration:

AlbumComplete Piano Works (vol. 4)
ArtistПОСТНИКОВА, ВикторияPOSTNIKOVA, Viktoria
WorkВремена годаThe Seasons
Movement NameДекабрь: СвяткиDecember: Christmas
TitleВремена года - 12. Декабрь: СвяткиThe Seasons - 12. December: Christmas

Custom tag

One custom tag suffices to store all the translations if you follow simple syntactic conventions.

Custom tag: TranslatedTags

  • Each piece of information is in the form {TagName: Value} or {TagCode: Value}.
  • Semicolons ; are optional, but allow for a clearer display with the tag inspector.
With our example, TranslatedTags will contain:
{Album Artist:TCHAIKOVSKY, Piotr}; {Artist:POSTNIKOVA, Viktoria}; {Composer:TCHAIKOVSKY, Piotr}; {Work:The Seasons}; {Movement Name:December: Christmas}; {Title:The Seasons - 12. December: Christmas}

  • If you already use { and } in your tags, choose other unique symbols.
  • While complete tag names are used here, two-letter codes could also do the trick: AA, AR, CO, WO, MO, TI.

Typical virtual tag formula

Virtual tag TranslatedArtist will display:
- the piece of information found in TranslatedTags within {Artist:} or {AR:} if it exists,
- Artist otherwise (inside an $IsNull declaration to prevent from displaying "Unknown Artist").

The matching formula is the following:
(Newlines and indentations have been added for the sake of readability.)

  • [^}]* = a string containing no '}', possibly null
  • (?<={(Artist|AR)[:]) = the string must be preceded by '{Artist:' or '{AR:'
  • (?=}) = the string must be followed by '}'

Formulas for common tags

Just adapt the table to your needs:
- if you wish to use other separators;
- if you use other fields, such as Conductor, Lyricist, etc.

Virtual Tag
TranslatedAlbumArtist$If($IsMatch(<TranslatedTags>,"(?<={(Album Artist|AA)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Album Artist|AA)[:])[^}]*(?=})"),$IsNull(<Album Artist>,,<Album Artist>))TCHAIKOVSKY, Piotr
TranslatedArtist$If($IsMatch(<TranslatedTags>,"(?<={(Artist|AR)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Artist|AR)[:])[^}]*(?=})"),$IsNull(<Artist>,,<Artist>))POSTNIKOVA, Viktoria
TranslatedComposer$If($IsMatch(<TranslatedTags>,"(?<={(Composer|CO)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Composer|CO)[:])[^}]*(?=})"),$IsNull(<Composer>,,<Composer>))TCHAIKOVSKY, Piotr
TranslatedWork$If($IsMatch(<TranslatedTags>,"(?<={(Work|WO)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Work|WO)[:])[^}]*(?=})"),$IsNull(<Work>,,<Work>))The Seasons
TranslatedMovementName$If($IsMatch(<TranslatedTags>,"(?<={(Movement Name|MO)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Movement Name|MO)[:])[^}]*(?=})"),$IsNull(<Movement Name>,,<Movement Name>))December: Christmas
TranslatedTitle$If($IsMatch(<TranslatedTags>,"(?<={(Title|TI)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Title|TI)[:])[^}]*(?=})"),$IsNull(<Title>,,<Title>))The Seasons - 12. December: Christmas


MusicBee functions for virtual tags cheatsheet
Regular Expressions: coding, examples, testing resources

Bug Reports / Column Browser: virtual tag "Musician Credits" incomplete
« on: September 03, 2023, 02:42:11 PM »
Hi Steven,

I presume the following behaviour is not intended in the Column Browser:
after using the Multiple Artist Splitter on an .mp3, virtual tag Musician Credits is available,
but it shows only the last artist present in TMCL (2.4) or IPLS (2.3).

MB v3.5.8631.34314 (latest patch).

Test file available in this cloud folder,
with the following tags entered through the Multiple Artist Splitter:

display artist
Sonny & Cher

Artists In text mode:
Sonny Bono: Artist
Cher: Artist
MyTestPerformer23: Performer
Jennifer Kae: Guest Artist
MyTestRemixer23: Remixer
Mike Rubini: piano
Al Pellegrini: conductor
Dean Parker: guitar
Matt Betton: drums
Bert Fanette: organ
David Hungate: bass guitar
Dahrell Norris: percussion

Single value shown in the column browser under "Musician Credits":
Dahrell Norris

Tips and Tricks / Track Information Symbols
« on: April 02, 2023, 03:56:45 PM »
Track Information Symbols


The panels called 'Track Information' and 'Track Information (2)' allow you to define a prompt before each field. Instead of displaying  a text caption, using a symbol for each prompt (with a suitable font) is a convenient way to get a quick overview of the track information.

You can find below a selection of symbol characters for various uses (either in the Track Information panels, or in your custom Theatre Mode scripts).

Preview (.PNG)

Click in the picture to expand it.

Symbols in text

In order to display the following table correctly, Segoe MDL2 Assets and Segoe Fluent Icons must be installed on your computer.
See 'Resources' below for direct download links.

To use a symbol in the Track Information panel:
  • Track Information header menu -> Customise Panel...
  • Copy/Paste the desired symbols onto their respective 'prompt' zones
  • Precede each symbol with: {font: Segoe MDL2 Assets; Regular; 12} or {font: Segoe Fluent Icons; Regular; 12}
    (Just replace 12 by a suitable character size. You don't need to append {font: default} after the symbol.)

Musical pieceMusical piece
FieldSegoe MDL2 AssetsSegoe Fluent IconsFieldSegoe MDL2 AssetsSegoe Fluent Icons
Album  Catalog  
Album Artist  Collection  
Artist / Performer  Comments      
Composer        Conductor
DurationGeographical origin (*)    
Genre  Language    
Grouping        Live recording (*)      
Lyrics        Love  
Lyrics      Lyricist
Play count    Mood    
Title / Work / Movement    Occasion  
Year / Date / History          Rating        
Theatre ModeFile information
PurposeSegoe MDL2 AssetsSegoe Fluent IconsFieldSegoe MDL2 AssetsSegoe Fluent Icons
Flow controls          BPS    
Repeat      Cue sheet (*)        
Repeat      Has PDF?
ShufflePath / Filename    
Mute / Sound volume        Pre-amp  
Track list      Source / Media type      
Settings  
Waveform  (*) Non-standard field


The two fonts kept for the presentation share the same character range and order, only the style changes.

Symbol fontAvailable fromDirect download linkDownload pageReference page
(with complete symbol list)
Segoe MDL2 AssetsWindows 10
Segoe Fluent IconsWindows 11

If you have a Windows version prior to Windows 10, other symbol fonts are available, but:
  • they feature fewer usable symbols than the 2 fonts presented here;
  • the symbol styles and sizes are not always consistent.

Thus, you will save time by installing Segoe MLD2 Assets or Segoe Fluent Icons, since both are freely downloadable from

Should you still want to have a look at those 'deprecated' fonts (but still shipped with newer Windows versions for compatibility reasons), this is the list:
  • Segoe UI Symbols (Windows 7 and above)
  • WebDings, WingDings, WingDings 2, WingDings 3 (character sets in the code range 0..255)

Tips and Tricks / Regular Expressions: coding, examples, testing resources
« on: February 09, 2023, 07:37:58 PM »
A Review of Regular Expressions

Table of contents

(1) Their use in MusicBee
(2) Characters
(3) Groups
(4) Other symbols
(5) External resources

(1) Their use in MusicBee

(1a) Purposes

A regular expression (RegEx) is a pattern used in comparison with any tag content
in order to perform:
  • match tests
  • substring extractions
  • replacements

(1b) Virtual tag functions using RegExes

Function and syntaxPurposeIF <tag> matches RegEx,
$IsMatch(<tag>,RegEx)checks if the RegEx is present anywhere in the tagTF
$RxReplace(<tag>,RegEx,new)global string replacement<tag> content with each occurrence of RegEx replaced by the new replacement stringthe unmodified <tag> content
$RxMatch(<tag>,RegEx)first matching portionfirst portion of the tag matching the RegExa void string
$RxSplit(<tag>,RegEx,n)nth delimited sectionnth section of the <tag> content split up by using RegEx as delimiterthe unmodified <tag> content

Notes for the functions presented above:
  • use double quotes around the RegEx string or new replacement string if they include special characters such as comma, round bracket, angle bracket, single quote, i.e.:
    , ( ) < > '
  • the match test is case-insensitive by default ("x" matches both x and X)
    -> See "(4d) Case-sensitive matches";
  • the tag itself is not modified in the audio track nor in MusicBee's library.

(1c) Overview of RegEx symbols

RegEx symbols include: constituents, quantifiers, anchors and grouping marks.
  • Each RegEx constituent can be
    - a single character: literal, or belonging to a set/range, or
    - a group: several characters between rounded brackets (parentheses).
  • Any constituent is optionally followed by a quantifier, indicating how many times it must be present.
  • Anchors can be added to the RegEx to specify positions or boundaries.
  • You can specify whether the match must be case-sensitive, and for which RegEx portion.

(2) Characters

(2a) Literal characters and custom character classes

aliteral character 'a'
All characters match themselves literally,
except those having special meaning in a RegEx:
. + * ? ^ $ ( ) [ ] { } | \
See also next table "(2c) Literal characters, backslashed".
[aeiou]any character in the set
[^aeiou]any character not in the set
[a-z]any character in the range
[^a-z]any character not in the range
.any character, except new line
[.]character '.'
\uFFFFUnicode (utf16) character with hex. code 'FFFF'

(2b) Pre-defined character classes (Unicode)

Backslash + lowercase letter = positive class.
Backslash + UPPERCASE  letter = negative class (any character not in the positive class).

\wa word character: letter, digit, connector (hyphen, underscore)
\Wa non-word character
\da digit
\Da non-digit character
\sa white space character (including: space, tab, vertical tab, linefeed)
\Sa non-space character
\p{P}any punctuation character, such as:
. , ' ‘ " “ - - : ;
\P{P}any non-punctuation character
\p{S}any symbol character (currency, math, ...)
\P{S}any non-symbol character

(2c) Literal characters, backslashed

To match a character that has special meaning in regular expressions, precede it by a backslash.

\[   \]
The character after the backslash:
. [ ]
Meaning without \: see "(2a) Custom character classes".
\+   \*   \?
\{   \}
The character after the backslash:
+ * ? { }
Meaning without \: see "(4a) Quantifiers".
\(   \)
The character after the backslash:
( ) |
Meaning without \: see "(3) Groups".
\^   \$The character after the backslash:
^ $
Meaning without \: see "(4c) Anchors".
\\a backslash

(2d) Combining characters within a RegEx

You can place single characters side-by-side as you wish.

foobarliteral string 'foobar'
[a-z][0-9]any letter, immediately followed by any digit => matches a3, b0, c9, …

(3) Groups

A group is a series of contiguous single characters, defined by enclosing the string in rounded brackets (parentheses).
A group serves to:
  • store the result of the matching group in an indexed memory (1, 2, 3, …)
  • store the result of the matching group in a named memory
  • define the scope of the next quantifier (see "(4a) Quantifiers" below)
  • specify different options
The contents of the indexed/names memories can then be used in the replacement string (with RxReplace).
See "(3c) Substitutions" below.

(3a) Group types

SymbolGroup typeMeaning
(SubRegEx)indexed group, capturingTreats SubRegEx as a group and places the matching string in an indexed memory.
Each group of the whole RegEx is assigned an incremented number, starting from 1.
See "(3c) Substitutions" below.
(?:SubRegEx)non-capturing groupTreats SubRegEx as a group, without placing the matching string in an indexed memory.
Useful if you simply want to apply a quantifier to the group.
(?<alias>SubRegEx)named group, capturingThe matching string is stored in a named memory instead of an indexed one.
See "(3c) Substitutions" below.
(choice1|choice2|...)option group, capturingMatches any of the choices, and stores the matching string in an indexed memory.
    • (Bach|Mozart) matches 'Bach' and 'Mozart'
(?:choice1|choice2|...)option group, non-capturingMatches any of the choices, without storing the matching string in an indexed memory.

(3b) Lookarounds

'Lookarounds' are special groups used to define the context: what immediately precedes or follows.

SymbolLookaround typeMeaning
a(?=suffix)positive lookaheadMatches 'a' followed by 'suffix',
without including 'suffix' itself in the matching string.
a(?!suffix)negative lookaheadMatches 'a' not followed by 'suffix',
without including 'suffix' itself in the matching string.
(?<=prefix)apositive lookbehindMatches 'a' preceded by 'prefix',
without including 'prefix' itself in the matching string.
(?<!prefix)anegative lookbehindMatches 'a' not preceded by 'prefix',
without including 'prefix' itself in the matching string.

(3c) Substitutions (in the replacement string)

A substitution is the use of an indexed or named memory (capturing group) in the replacement string of $RxReplace.

In the examples below, <MyTag> contains 'FooBar'.

$nindexed group n$RxReplace(<MyTag>,"(.{3})(.{3})","$2,$1")
-> 'Bar,Foo'
$`the substring before the match$RxReplace(<MyTag>,"a","$`")
-> 'FooBFooBr'
$'the substring after the match$RxReplace(<MyTag>,"a","$'")
-> 'FooBrr'
$+the last indexed memory$RxReplace(<MyTag>,"^(.{3})(.{3})(?:.*)$","$+")
-> 'Bar'
${alias}the content of stored memory alias
See: (?<alias>SubRegEx) in "(3) Groups"
-> 'Bar'
$&the matching string$RxReplace(<MyTag>,"[aeiou]{2}","[$&]")
-> 'F[oo]Bar'
$_the whole input string$RxReplace(<MyTag>,"[aeiou]{2}","[$_]")
-> 'F[FooBar]Bar'

(3d) Backreferences (in the RegEx)

A backreference is the use of an indexed or named memory (capturing group) in the very RegEx where the memory is defined, thus not in the replacement string.

\nindexed group n"(.)\1" matches a character followed by its repetition, such as:
aa, bb, cc, …

"(.)(.)\2\1" matches two characters followed by their repetition in mirror, such as:
ABBA, elle, otto, ...
\k<alias>named group alias"(?<one>.)\k<one>" matches a character followed by its repetition, such as:
aa, bb, cc, …

"(?<one>.)(?<two>.)\k<two>\k<one>" matches two characters followed by their repetition in mirror, such as:
ABBA, elle, otto, …

(4) Other symbols

(4a) Quantifiers

A quantifier is placed after a character or a group to indicate how many times it must be repeated (contiguously).

+one or moreba+r matches: bar, baar, baaar, …
but not: br
?zero or oneba?r matches: br, bar
but not: baar
*zero or moreba*r matches: br, bar, baar, …
{m,n}between m and n times (both inclusive)ba{2,3}r matches: baar, baaar
{m,}at least m timesba{2,}r matches: baar, baaar, baaaar, …
{0,n}at most n timesba{0,2}r matches: br, bar, baar

The examples above match repeated single characters.
Here is one for a repeated group:
"(the ){2}" matches a string containing "the the ".

(4b) Greedy and lazy quantifiers

By default, a constituent + quantifier matches the longest possible substring (= greedy behaviour). So as to specify that it must match the shortest possible substring (= lazy behaviour), simply add ? after the quantifier.

++?one or more
???zero or one
**?zero or more
{m,n}{m,n}?between m and n times (both inclusive)
{m,}{m,}?at least m times
{0,n}{0,n}?at most n times

(4c) Anchors

Anchors are special markers: instead of matching actual characters, they specify the position relative to the string boundaries or word boundaries.

^at start of string"^A" matches "A" at the beginning of a string
$at end of string"bee$" matches "bee" at the end of a string
\bon word boundary"\bbee" matches words starting with bee, such as "beehive"
"bee\b" matches words ending with bee, such as "MusicBee"
\Bnot on word boundary"\Bbee\B" matches "bee" in "bumblebees"

(4d) Case-sensitive matches

All match checks are case-insensitive by default in MusicBee (unlike other applications).
  • To make a RegEx part case-sensitive, prefix it with (?-i).
    Thus, placing (?-i) at the very beginning makes the whole RegEx case-sensitive.
  • To switch back to case-insensitive, add (?i) to the RegEx before the concerned part.

applies to the RegEx part to its right
"(?-i)a" matches "a" but not "A"
applies to the RegEx part to its right
"(?-i)a(?i)a" matches "aA" but not "AA"

(5) External resources

(5a) Exercises

Auto-corrected exercises. You can see the result of your RegEx as you type it.

(5b) Testing pages

MusicBee relies on .NET to interpret RegExes. RegEx interpreters other than .NET may give slightly different results, and so far I have found only one testing site providing with the .NET RegEx flavour.

For building, testing, and debugging your RegExes (match tests, replacements),
use this site:
    - Select «.NET (C#)» as RegEx engine (FLAVOR pane on the left).
    - To the right of the REGULAR EXPRESSION, set regex options "g" (global) and "i" (case-insensitive).

Other RegEx flavours:

PCRE = Perl-Compatible Regular Expression

(5c) Unicode character tables

Reference tables in PDF format:

(5d) Supported Unicode character classes

Microsoft .NET reference:

- audio track in M4A
- matching CUE sheet, for the sole purpose of skipping the leading silence (thus only 1 track defined)

- CUE sheet not taken into account

Tried workaround:
- initial state = CUE sheet not recognised
- adding an arbitrary second track to the CUE
- rescanning the audio track in MB -> CUE sheet recognised
- removing the second track from the CUE
- rescanning the audio track
- CUE still taken into account, the track showing now the wished duration

MusicBee v3.5.8436 P (latest)
Windows 10 x64

Files (M4A + CUE):

Not recognised CUE sheet:
TITLE "Concert 01"
FILE "01 - Concert 01.m4a" M4A
  TITLE "Концерт № 01 - Воспойте Господеви, воспойте песнь нову"
  INDEX 01 00:13:00

Recognised CUE sheet with DUMMY track:
TITLE "Concert 01"
FILE "01 - Concert 01.m4a" M4A
  TITLE "Концерт № 01 - Воспойте Господеви, воспойте песнь нову"
  INDEX 01 00:13:00
  INDEX 01 07:55:00

Tips and Tricks / Sub-grouping Header (Classical and Non-Classical Music)
« on: January 24, 2023, 10:55:55 AM »
Sub-grouping Header for Classical and Non-Classical Music

Table of Contents

(1) Summary
(2) Other related threads
(3) Typical results
(4) Tagging conventions
(5) Solution with 7 virtual tags
(6) Explanation of the virtual tags
(7) Colour codes and symbols

(1) Summary

In the Album and Album and Tracks views of the main panel, you can specify a sub-grouping header. In my collection, it is a virtual tag that works for both non-classical and classical music.

For non-classical music, it takes into account Disc# and Grouping.

For classical music, it relies on Grouping, Composer and Work, showing zero, one or more of these fields according to the album content:
  • Grouping (if present)
  • Composer (if only a part of the album is concerned)
  • Work (if only a part of the album is concerned)
Adding Disc# to the sub-grouping header would fuzzy up the display without adding significant information to classical music albums.

(2) Other related threads

(3) Typical results

Below, a few clickable screenshots showing what the subgrouping header can look like, with:
  • a light theme (Faded) + 4 possible colours (one for each element type)
  • a dark theme (Oblivion) + 2 colours, always the same (symbol vs. text)

CombinationLight theme + 4 possible coloursDark theme + 2 colours (always the same)
Composer + Work
Disc + Grouping
Grouping + Work
Work OR Grouping

(4) Classical music tagging conventions

The few conventions that are needed for the virtual tags to work are presented hereafter.

TagContent ConventionsExample
ComposerFormat = Surname, GivenNames.
The other contributing composers, if any, are semicolon-separated.
WorkPopulated if the work is split up into several movements.
Empty otherwise.
Swan Lake, Op. 20
Album section (e.g.: Secular works, Sacred works),
or work section (e.g.: Act 1, Act 2, …).
Act 1
GenreThe keywords must include Classical.Classical; Romanticism; Instrumental; Orchestra; Ballet
The convention on AlbumArtist has been removed. Multi-composer albums (classical music) are now identified by using the $Count function (see below).

(5) Solution with 7 virtual tags

v.SubGrouping.Header is the main virtual tag used as sub-grouping header for the main panel (views 'Album', 'Album and Tracks').

After each encoding phase, [Save] before moving to the next virtual tags.

Virtual tagFormula
1v.Composer.Short$IsNull(<Composer>,,$RxReplace($If($IsMatch($First(<Composer>),"^(BACH, (?!Johann Sebastian)|CASALS,|CHARPENTIER, (?!Marc-Antoine)|COLLINS,|CONTI,|CORNET,|COUPERIN,|HAYDN, (?!Joseph)|JARRE,|LAST,|MARCELLO,|MENDELSSOHN, (?!Felix)|MILLER,|MOZART, (?!W)|PACHELBEL,|PRAETORIUS,|ROBERT,|SCARLATTI,|SCHUBERT, (?!Franz)|SCHUMANN, (?!Robert)|STRAUSS,|TURNER,)"),$First(<Composer>),$RxReplace($First(<Composer>),"([^,]*)[,].*","$1")),"(DA|DE|VAN|VON|CASSANÉA DE) (BEETHOVEN|LASSUS|PALESTRINA|WEBER|MONDONVILLE)","$2"))
1v.chk.Disc$IsNull(<Disc Count>,,$If($Or(<Disc Count>=1,<Disc#>=0),,$If($IsMatch(<Genre>,"Classical"),,D)))
3v.SubGrouping.Header$IsNull(<v.chk.Disc>,,{color: 40,140,90}💿 <Disc#>" ")$IsNull(<Grouping>,,{color: 125,105,0}¶ <Grouping>" ")$IsNull(<v.chk.Composer>,,{color: 175,25,25}✍ <v.Composer.Short>" ")$IsNull(<v.chk.Work>,,{color: 0,105,155}♫ <Work>)

(6) Explanation of the virtual tags

Concatenation of Album and Composer, used to count the number of different composers (populated OR null) within the same album.
Necessary since:
  • $Count(<Album><Composer>) is not accepted
  • $Count(<Composer>,<Album>) doesn't take null <Composer> values into account

Concatenation of Album and Work, used to count the number of different works (populated OR null) within the same album.
Necessary since:
  • $Count(<Album><Work>) is not accepted
  • $Count(<Work>,<Album>) doesn't take null <Work> values into account

If several composers have contributed to the musical piece (semicolon-separated), only the first is shown.
The given names are generally removed, but:
  • For some families comprising several composers, the given names are always kept:
  • For some other families, the given names are kept, except for these figureheads:
    BACH, Johann Sebastian; CHARPENTIER, Marc-Antoine; HAYDN, Joseph; MENDELSSOHN, Felix; MOZART, Wolfgang Amadeus; SCHUBERT, Franz; SCHUMANN, Robert
  • The first word of the surname (DA, DE, VAN, VON) is omitted when customary:

The disc number is shown, if:
  • <Disc#> is not null
  • AND <Disc Count> is not 1
  • AND <Genre> doesn't contain "Classical"

The composer's name is shown for a multi-composer classical album, i.e. if:
  • <Composer> is not null
  • AND <Genre> contains "Classical"
  • AND the track count for the combination <Album>+<Composer> differs from the track count for <Album>

The work is shown if:
  • <Work> is not null
  • AND the track count for the combination <Album>+<Work> differs from the track count for <Album>

Sub-grouping header for the main panel (views 'Album', 'Album and Tracks').
Colour codes used: 4 different colours.

(7) Colour codes and symbols

In the formula of v.SubGrouping.Header, just adapt the colour codes to your taste and the skin(s) you use. The four-colour scheme has been tested with several light and dark skins.

4-colour set
One colour for each component type: disc / grouping / composer / work.

Header partColour code
Disc{color: 40,140,90}
Grouping{color: 125,105,0}
Composer{color: 175,25,25}
Work{color: 0,105,155}

2-colour set
One colour for any symbol, one for any text.

Symbol vs. textColour code
Symbol{color: 150,130,60}
Text{color: 40,140,90}

Symbols + alternative version

Header partfont: defaultfont: Segoe MDL2 Assets
Disc💿{font: Segoe MDL2 Assets; Regular; 12}{font: default}
Grouping{font: Segoe MDL2 Assets; Regular; 12}{font: default}
Composer{font: Segoe MDL2 Assets; Regular; 12}{font: default}
Work{font: Segoe MDL2 Assets; Regular; 12}{font: default}


Preferences -> Layout (1) -> general -> artist pictures: [_] crop to a circle


If you toggle the value and save the preferences, the change is not taken into account.
When re-opening the Preferences window, the tick box still has its previous state (before the change).

The only way to change the parameter is to edit MusicBee3Settings.ini:

Versions where the bug shows up:

MB v3.5.8242 P and above

Latest version without the bug:

MB v3.5.8237 P

Tips and Tricks / MusicBee File Paths: Installed vs Portable
« on: July 15, 2022, 11:21:02 AM »
MusicBee File Paths (Installed vs. Portable)

This summary is intended to help users wishing to:
  • switch from the installed to the portable version;
  • back up data;
  • transfer their MB setup to another computer.

Table of Contents

(1) Environment variables used
(2) Folders and files
(3) Adapting some settings after switching to the portable version
(4) Access and remarks

(1) Environment variables used

The table below uses several environment variables. Unless you have a particular Windows configuration or an older version, here are typical values:

Typical value (may differ)
%ProgramFiles(x86)%C:\Program Files (x86)

Their accurate values can be displayed from Windows' command-line prompt (cmd.exe). Examples of possible commands:
  • echo %USERPROFILE%
    will display the content of that particular variable.
  • echo %USERPROFILE%\Music\MusicBee
    will display the full path of that subfolder.
  • env
    will display all defined environment variables (a few dozens).

(2) Folders and files

(installed version)
(portable version)
A.1Application settingsMusicBee3Settings.ini%APPDATA%\MusicBee\.\AppData
A.2Saved application settings*.ini%APPDATA%\MusicBee\Saved Settings\Application.\AppData\Saved Settings\Application
BLibrary_&_tagsInstalled versionPortable version
B.2Library filters*.xautopf%APPDATA%\MusicBee\Filters.\AppData\Filters
B.3Custom tagsCustomTagConfig.xml%APPDATA%\MusicBee.\AppData
B.4Genre groupingGenreMapping.xml%APPDATA%\MusicBee.\AppData
B.5Tag hierarchy templates*.txt%APPDATA%\MusicBee\TagHierarchyTemplates.\AppData\TagHierarchyTemplates
CArtist_profilesInstalled versionPortable version
C.1Artist thumbs:
- Album Artist
- Artist
- Composer
- Original Artist

For Conductor/Lyricist, see D.1.
*.jpg%USERPROFILE%\Music\MusicBee\Artist Pictures\Thumb.\Library\Artist Pictures\Thumb
C.2Artist thumbs, resized from C.1*.png%LOCALAPPDATA%\MusicBee\InternalCache\ArtistThumbs.\AppData\InternalCache\ArtistThumbs
C.3Large pictures*.dat, *.tmp%LOCALAPPDATA%\MusicBee\InternalCache\ArtistBackdrops.\AppData\InternalCache\ArtistBackdrops
C.5Similar artists*.similar.dat%LOCALAPPDATA%\MusicBee\InternalCache\ArtistData.\AppData\InternalCache\ArtistData
C.6Soundtrack pictures%USERPROFILE%\Music\MusicBee\Soundtrack Pictures.\Soundtrack Pictures\
DIconsInstalled versionPortable version
D.1Genre / Genre grouping
Lyricist /  Conductor
Language / Mood / Occasion
Custom tags / Virtual tags
*.png%USERPROFILE%\Music\MusicBee\Artwork\Grouping Icons.\Library\Artwork\Grouping Icons
D.2Highlighting icons*.ico, *.png
  • %ProgramFiles(x86)%\MusicBee\Icons
  • %APPDATA%\MusicBee\Icons
D.3Toolbar icons*.ico, *.png
  • %ProgramFiles(x86)%\MusicBee\Icons
  • %APPDATA%\MusicBee\Icons
D.4Tab icons*.ico, *.png
  • %ProgramFiles(x86)%\MusicBee\Icons
  • %APPDATA%\MusicBee\Icons
EPlaylistsInstalled versionPortable version
E.1Playlists*.mbp, *.xautopf%USERPROFILE%\Music\MusicBee\Playlists.\Library\Playlists
E.2Current playlistNowPlaying.mbp%USERPROFILE%\Music\MusicBee.\Library\
E.3Current auto DJ playlistAutoDj.xautopf%APPDATA%\MusicBee\Recent Queries.\AppData\Recent Queries
FSkins_&_layoutsInstalled versionPortable version
F.1Skins*.xml, *.xmlc
  • %ProgramFiles(x86)%\MusicBee\Skins
  • %APPDATA%\MusicBee\Skins
F.2Theater modes*.xml
  • %ProgramFiles(x86)%\MusicBee\Plugins\TheaterMode.List
  • %ProgramFiles(x86)%\MusicBee\Plugins\TheaterMode.Embeded
  • %APPDATA%\MusicBee\Plugins\TheaterMode.List
  • %APPDATA%\MusicBee\Plugins\TheaterMode.Embeded
F.3Custom views*.mbv%APPDATA%\MusicBee\Saved Settings\Views.\AppData\Saved Settings\Views
F.4Custom panel arrangements (layouts)*.layout, *.tab-layout%APPDATA%\MusicBee\Saved Settings\Layouts.\AppData\Saved Settings\Layouts
GPlugins_&_equaliserInstalled versionPortable version
  • %ProgramFiles(x86)%\MusicBee\Plugins
  • %APPDATA%\MusicBee\Plugins
  • %ProgramFiles(x86)%\MusicBee\BBplugin
  • %APPDATA%\MusicBee\BBplugin
G.3Equaliser presets*.sde
  • %ProgramFiles(x86)%\MusicBee\Equaliser
  • %APPDATA%\MusicBee\Equaliser
HPodcastsInstalled versionPortable version
H.2Episodes(audio files)%USERPROFILE%\Music\MusicBee\Podcasts.\Library\Podcasts\
H.3Artwork(picture files)%LOCALAPPDATA%\MusicBee\InternalCache\Subscriptions.\AppData\InternalCache\Subscriptions
IBookmarksInstalled versionPortable version

(3) Adapting some settings
after switching to the portable version

When switching from the installed to the portable version, copying all your files to their new locations is the crucial part.
But not the last step: as MusicBee3Settings.ini and Subscriptions.dat still contain references to several folders, you need to perform some easy replacements in the files with your preferred text editor.

  • Make a backup copy of MusicBee3Settings.ini and Subscriptions.dat before editing them!
  • When replacing an old path by the new matching one, ensure the new path exists in your portable version.
The variable parts depending on your particular configuration are in green below.
The drive letter (C: here) may also differ in your case.

(3a) In MusicBee3Settings.ini

Where in the file?Replace:By:
At the beginning:

or the value of:
(Portable MB path)\AppData
On the next line:

or the value of:
(Portable MB path)\Library

or the value of:
(Portable MB path)\Library
all occurrencesC:\Users\(YourUserID)\Music\MusicBee\Playlists

or the value of:
(Portable MB path)\Library\Playlists
all occurrencesC:\Program Files (x86)\MusicBee

or the value of:
(Portable MB path)

(3b) In Subscriptions.dat

Where in the file?Replace:By:
all occurrencesC:\Users\(YourUserID)\Music\MusicBee\Podcasts

or the value of:
(Portable MB path)\Library\Podcasts

(4) Access and remarks

A.1Application settingsPreferences
A.2Saved application settings(MB menu) -> Edit -> Saved settings
B.2Library filtersPreferences -> Library -> Music library -> define filters
B.3Custom tagsPreferences -> Tags (1) -> custom tags
B.4Genre groupingPreferences -> Tags (2) -> tag handling -> group genres
B.5Tag hierarchy templates(Tag Hierarchy Explorer menu) -> Edit Tag Hierarchy
C.1Artist thumbs:
- Album Artist
- Artist
- Composer
- Original Artist

For Conductor/Lyricist, see D.1.
  • Music tab -> (Left panel) -> Album Artist / Artist / Composer / Original Artist
  • Music Explorer -> Artist Information -> Profile
C.2Artist thumbs, resized from C.1-
C.3Large picturesMusic Explorer -> Artist Information -> Profile
C.4BiographiesMusic Explorer -> Artist Information -> Profile
C.5Similar artistsMusic Explorer -> Artist Information -> Similar Artists -> More Similar Artists
C.6Soundtrack pictures
  • Preferences -> Tags (1) -> artwork -> soundtrack picture locations
  • Learn the whereabouts on MusicBee Wiki
D.1Genre icons / Genre grouping icons
Lyricist /  Conductor
Language / Mood / Occasion
Custom tags / Virtual tags
  • Music tab -> Left panel -> Genre / Genre Category
  • Preferences -> Tags (2) -> tag handling -> group genres
D.2Highlighting iconsPreferences -> Tags (2) -> tag handling -> highlighting
D.3Toolbar iconsToolbar context menu -> Configure Toolbar…
D.4Tab iconsTab context menu -> Select Tab Icon...
E.1PlaylistsPlaylists explorer tab
E.2Current playlistNow Playing tab
E.3Current auto DJ playlistAuto DJ tab
F.1Skins(MB menu) -> View -> Skins
F.2Theater modes(MB menu) -> View -> Theater Mode
F.3Custom views(Main panel menu) -> Custom views
F.4Custom panel arrangements (layouts)(MB menu) -> View -> Import/Export
G.1PluginsPreferences -> Plugins
G.2Visualisers(MB menu) -> View -> Visualizer
G.3Equaliser presetsEqualiser button (player controls)

Bug Reports / MB 3.5.8206 P doesn't display some album covers
« on: June 22, 2022, 08:29:47 AM »
some album covers are no longer displayed (although the cover.jpg/png files are still present in the respective folders).
A "File rescan" of those albums retrieves the album covers, which are forgotten again after MB restart.

Version concerned: 3.5.8206 P
Last functioning version: 3.5.8167 P

The impacted albums are always the same when switching from v3.5.8167 to v3.5.8206.
Cover formats: JPG, or PNG
Music formats: OGG, FLAC, or M4A with CUE

Strangely enough, when copying one of those "vanishing" covers to the folder of another album (having a correct cover display in v3.5.8206), the cover display remains correct for that album.

Pages: 12