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
1
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:

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)

2
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 permission of the author:
  • Aura Dark
  • Aura Light
  • Aurora
  • Purenight Blue
The DropBox links used in the respective skin pages do not work anymore.

Aura Dark

Version1.0
Preview

Aura Light

Version5.0
Preview

Aurora

Version3.0
Preview

Purenight Blue

Version2.0
Preview

Silvestreccf's homepages


3
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':
https://getmusicbee.com/forum/index.php?topic=40410.0
https://getmusicbee.com/forum/index.php?topic=40429.0

4
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:

Original
Translated/Transliterated
Album ArtistЧАЙКОВСКИЙ, ПётрTCHAIKOVSKY, Piotr
AlbumComplete Piano Works (vol. 4)
ArtistПОСТНИКОВА, ВикторияPOSTNIKOVA, Viktoria
ComposerЧАЙКОВСКИЙ, ПётрTCHAIKOVSKY, Piotr
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

Conventions:
  • 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:
Code
{Album Artist:TCHAIKOVSKY, Piotr}; {Artist:POSTNIKOVA, Viktoria}; {Composer:TCHAIKOVSKY, Piotr}; {Work:The Seasons}; {Movement Name:December: Christmas}; {Title:The Seasons - 12. December: Christmas}

NOTES:
  • 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:
Code
$If(
    $IsMatch(<TranslatedTags>,"(?<={(Artist|AR)[:])[^}]*(?=})"),
    $RxMatch(<TranslatedTags>,"(?<={(Artist|AR)[:])[^}]*(?=})"),
    $IsNull(<Artist>,,<Artist>)
)
(Newlines and indentations have been added for the sake of readability.)

Comments:
  • [^}]* = 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
Formula
Result
TranslatedAlbumArtist$If($IsMatch(<TranslatedTags>,"(?<={(Album Artist|AA)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Album Artist|AA)[:])[^}]*(?=})"),$IsNull(<Album Artist>,,<Album Artist>))TCHAIKOVSKY, Piotr
TranslatedAlbum$If($IsMatch(<TranslatedTags>,"(?<={(Album|AL)[:])[^}]*(?=})"),$RxMatch(<TranslatedTags>,"(?<={(Album|AL)[:])[^}]*(?=})"),$IsNull(<Album>,,<Album>))
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

References

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

5
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

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

Summary

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

Resources

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 10https://aka.ms/segoemdl2https://learn.microsoft.com/en-us/windows/apps/design/downloads/#fontshttps://learn.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font
Segoe Fluent IconsWindows 11https://aka.ms/SegoeFluentIconshttps://learn.microsoft.com/en-us/windows/apps/design/downloads/#fontshttps://learn.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font

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 learn.microsoft.com.

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)

8
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 for:
  • match tests
  • substring extractions
  • replacements


(1b) Virtual tag functions using RegExes

Function and syntaxPurposeIF <tag> matches RegEx,
returns:
ELSE,
returns:
$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

SymbolMeaning
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).

SymbolMeaning
\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.

SymbolMeaning
\.
\[   \]
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.

SymbolMeaning
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.
Example:
    • (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'.

SymbolMeaningExample
$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"
$RxReplace(<MyTag>,"(?<First>.{3})(?<Second>.{3})","${Second}")
-> '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.

SymbolMeaningExample
\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).

SymbolMeaningExample
+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.

GreedyLazyMeaning
++?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.

SymbolMeaningExample
^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.

SymbolMeaningExample
(?-i)case-sensitive:
applies to the RegEx part to its right
"(?-i)a" matches "a" but not "A"
(?i)case-insensitive:
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:
  • https://RegEx101.com/
    - 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:

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

Issue:
- 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):
https://drive.google.com/drive/folders/1PzZOQKTYo6Ij9FgAyFjm6lM8rrLhSYmh?usp=share_link

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

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

10
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
Composer
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.
TCHAIKOVSKY, Piotr
WorkPopulated if the work is split up into several movements.
Empty otherwise.
Swan Lake, Op. 20
GroupingOptional.
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').

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




Encoding
phase
Virtual tagFormula
1v.Str.Album.Composer<Album><Composer>
1v.Str.Album.Work<Album><Work>
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)))
2v.chk.Composer$IsNull(<Composer>,,$If($And($Not($Count(<v.Str.Album.Composer>)=$Count(<Album>)),$IsMatch(<Genre>,"Classical")),C,))
2v.chk.Work$IsNull(<Work>,,$If($Count(<v.Str.Album.Work>)=$Count(<Album>),,W))
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

v.Str.Album.Composer
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

v.Str.Album.Work
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

v.Composer.Short
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:
    CASALS, COUPERIN, MARCELLO, PACHELBEL, SCARLATTI, ...
  • 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:
    DA PALESTRINA, DE LASSUS, VAN BEETHOVEN, VON WEBER

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

v.chk.Composer
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>

v.chk.Work
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>

v.SubGrouping.Header
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}

11
Concerns:

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

Problem:

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:
<GUI_ArtistPicCircle>true</GUI_ArtistPicCircle>
or
<GUI_ArtistPicCircle>false</GUI_ArtistPicCircle>

Versions where the bug shows up:

MB v3.5.8242 P and above

Latest version without the bug:

MB v3.5.8237 P

12
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:

Variable
Typical value (may differ)
%USERPROFILE%C:\Users\(YourUserID)
%APPDATA%C:\Users\(YourUserID)\AppData\Roaming
%LOCALAPPDATA%C:\Users\(YourUserID)\AppData\Local
%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

Nr.
Content
Files
Folder
(installed version)
Folder
(portable version)
AMain_settings
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.1LibraryMusicBeeLibrary*.*%USERPROFILE%\Music\MusicBee.\Library
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.4Biographies*.bio.dat%LOCALAPPDATA%\MusicBee\InternalCache\ArtistData.\AppData\InternalCache\ArtistData
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
.\Icons
D.3Toolbar icons*.ico, *.png
  • %ProgramFiles(x86)%\MusicBee\Icons
  • %APPDATA%\MusicBee\Icons
.\Icons
D.4Tab icons*.ico, *.png
  • %ProgramFiles(x86)%\MusicBee\Icons
  • %APPDATA%\MusicBee\Icons
.\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
.\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
.\Plugins\TheaterMode.List
.\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
G.1Plugins(various)
  • %ProgramFiles(x86)%\MusicBee\Plugins
  • %APPDATA%\MusicBee\Plugins
.\Plugins
G.2Visualisers(various)
  • %ProgramFiles(x86)%\MusicBee\BBplugin
  • %APPDATA%\MusicBee\BBplugin
.\BBplugin
G.3Equaliser presets*.sde
  • %ProgramFiles(x86)%\MusicBee\Equaliser
  • %APPDATA%\MusicBee\Equaliser
.\Equaliser
HPodcastsInstalled versionPortable version
H.1IndexSubscriptions.dat%USERPROFILE%\Music\MusicBee\Podcasts.\Library\Podcasts\
H.2Episodes(audio files)%USERPROFILE%\Music\MusicBee\Podcasts.\Library\Podcasts\
H.3Artwork(picture files)%LOCALAPPDATA%\MusicBee\InternalCache\Subscriptions.\AppData\InternalCache\Subscriptions
IBookmarksInstalled versionPortable version
I.1Indexbookmarks.dat%APPDATA%\MusicBee.\AppData


(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.

Caution:
  • 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:
<ENV_OrigSetPath>...
</ENV_OrigSetPath>
C:\Users\(YourUserID)\AppData\Roaming\MusicBee

or the value of:
%APPDATA%\MusicBee
(Portable MB path)\AppData
On the next line:
<ENV_LibPath>...
</ENV_LibPath>
,
C:\Users\(YourUserID)\Music\MusicBee

or the value of:
%USERPROFILE%\Music\MusicBee
(Portable MB path)\Library
Below:
<ENV_KnownLib>...
</ENV_KnownLib>
,
C:\Users\(YourUserID)\Music\MusicBee

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

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

or the value of:
%ProgramFiles(x86)%\MusicBee
(Portable MB path)


(3b) In Subscriptions.dat

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

or the value of:
%USERPROFILE%\Music\MusicBee\Podcasts
(Portable MB path)\Library\Podcasts


(4) Access and remarks

Nr.
Content
Access
AMain_settings
A.1Application settingsPreferences
A.2Saved application settings(MB menu) -> Edit -> Saved settings
BLibrary_&_tags
B.1Library-
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
CArtist_profiles
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
DIcons
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...
EPlaylists
E.1PlaylistsPlaylists explorer tab
E.2Current playlistNow Playing tab
E.3Current auto DJ playlistAuto DJ tab
FSkins_&_layouts
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
GPlugins_&_equaliser
G.1PluginsPreferences -> Plugins
G.2Visualisers(MB menu) -> View -> Visualizer
G.3Equaliser presetsEqualiser button (player controls)

13
Bug Reports / MB 3.5.8206 P doesn't display some album covers
« on: June 22, 2022, 08:29:47 AM »
Symptom:
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.

14
Bug Reports / Some hotkeys not kept when changing the interface language
« on: January 28, 2022, 10:40:14 AM »
Some hotkeys are not kept when choosing another interface language.

Concerned actions:
* (EN) View: Theater mode
    --> (FR) Affichage: Mode Cinéma
    --> (IT) Visualizza: Modalità home theater
* (EN) View: Theater mode - Show list
    --> (FR) Affichage: Mode Cinéma - Afficher la liste
    --> (IT) Visualizza: Modalità home theater - elenco visualizzazioni

Note: I haven't performed an exhaustive check of the hotkeys, so I don't know if other actions are concerned.

* MB version 3.4.8033 portable (but the bug showed up in the installed version, too)
* Win 10 x64

Steps to reproduce:
* Interface language = EN
* Define hotkeys for the two actions above.
* Choose another interface language (I have tried with FR and IT).
* Result: hotkeys not available anymore (unless you revert to the original interface language).

The behaviour also shows up when defining the hotkeys in FR and then switching to EN/IT.

After changing the language and noticing that the hotkeys are not present, if you want to re-assign them, you get a confirmation window.
Warning message in EN: F9 is used for '' - do you want to reassign it to 'View: Theater Mode'?

Screenshots available here.

Anyway, thanks to Steven and the team for their brilliant work: MB is a pure gem!

15
Bug Reports / CUE with M4A: wrong "Artist" value displayed
« on: April 21, 2021, 02:41:55 PM »
Software: MusicBee v3.4.7764, Windows 10 x64

Files:
  • M25.m4a
  • M25.cue

ARTIST value defined in the files:
  • in M25.m4a: ARTIST = "hr-Sinfonieorchester; François Leleux (dir.)"
  • in M25.cue: same, at album level, PERFORMER "hr-Sinfonieorchester; François Leleux (dir.)"

Problem:
  • The "Artist" value is incorrect when displaying the album data in columns (main screen), or in TheaterMode. The value displayed is that of AlbumArtist (in this case: "MOZART, Wolfgang Amadeus"). Repeating PERFORMER for each TRACK in the CUE sheet does not change the behaviour.

However:
  • The "Artist" field value is correct when displaying the fields of a track with right-click -> "Edit" -> "Tags".

The files are available here:
https://drive.google.com/drive/folders/10lGhM10gqIoFLh0Ug8UOWL05G124tJTq

Pages: 12