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: 1
1
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
      (1a) Purposes
      (1b) Virtual tag functions using RegExes
      (1c) Overview of RegEx symbols
    (2) Characters
      (2a) Literal characters and custom character classes
      (2b) Pre-defined character classes (Unicode)
      (2c) Literal characters, backslashed
      (2d) Combining characters within a RegEx
    (3) Groups
      (3a) Group types
      (3b) Lookarounds
      (3c) Substitutions (in the replacement string)
      (3d) Backreferences (in the RegEx)
    (4) Other symbols
      (4a) Quantifiers
      (4b) Greedy and lazy quantifiers
      (4c) Anchors
      (4d) Case-sensitive matches
    (5) External resources
      (5a) Exercises
      (5b) Testing pages
      (5c) Unicode character tables
      (5d) Supported Unicode character classes

    (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 regexp,
    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 "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 "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 (all but be 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 "Custom character classes".
    \+   \*   \?
    \{   \}
    The character after the backslash:
    + * ? { }
    Meaning without \: see "Quantifiers".
    \(   \)
    \|
    The character after the backslash:
    ( ) |
    Meaning without \: see "Groups".
    \^   \$The character after the backslash:
    ^ $
    Meaning without \: see "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 "Quantifiers" below)
    • specify different options
    The contents of the indexed/names memories can then be used in the replacement string (with RxReplace).
    See "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 "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 "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 "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

    For building, testing, and debugging your RegExes (match tests, replacements).
    Same purpose, simpler interfaces:
    (5c) Unicode character tables

    Reference tables in PDF format:
    (5d) Supported Unicode character classes

    Microsoft .NET reference:

    2
    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

    3
    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
    • Summary
    • Other related threads
    • Typical results
    • Tagging conventions
    • Solution with 7 virtual tags (but easy to maintain)
    • Solution with 3 virtual tags (but difficult to maintain)
    • Colour codes and symbols
      + alternative version

    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.

    Other related threads


    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

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

    Solution with 7 virtual tags
    (can be reduced to 3, see below)


    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(<Composer>,"\b(BACH, (?!Johann Sebastian)|CASALS|COUPERIN|HAYDN, (?!Joseph)|MARCELLO|MENDELSSOHN, (?!Felix)|MOZART, (?!W)|PACHELBEL|SCARLATTI|SCHUBERT, (?!Franz))\b"),$RxReplace(<Composer>,"([^;]*)[;].*","$1"),$RxReplace(<Composer>,"([^,;]*)[,;].*","$1")),"(DA|DE|VAN|VON) (BEETHOVEN|LASSUS|PALESTRINA|WEBER)","$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>)

    Explanations

    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 are involved in the track (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; 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.

    Solution with 3 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>
    2v.SubGrouping.Header$IsNull($IsNull(<Disc Count>,,$If($Or(<Disc Count>=1,<Disc#>=0),,$If($IsMatch(<Genre>,"Classical"),,D))),,{color: 40,140,90}💿 <Disc#>" ")$IsNull(<Grouping>,,{color: 125,105,0}¶ <Grouping>" ")$IsNull($IsNull(<Composer>,,$If($And($Not($Count(<v.Str.Album.Composer>)=$Count(<Album>)),$IsMatch(<Genre>,"Classical")),C,)),,{color: 175,25,25}✍ $IsNull(<Composer>,,$If($IsMatch(<Composer>,"\b(BACH, (?!Johann Sebastian)|CASALS|COUPERIN|HAYDN, (?!Joseph)|MARCELLO|MENDELSSOHN, (?!Felix)|MOZART, (?!W)|PACHELBEL|SCARLATTI|SCHUBERT, (?!Franz)|SCHUMANN, (?!Robert))\b"),$RxReplace(<Composer>,"([^;]*)[;].*","$1"),$RxReplace(<Composer>,"([^,;]*)[,;].*","$1")))" ")$IsNull($IsNull(<Work>,,$If($Count(<v.Str.Album.Work>)=$Count(<Album>),,W)),,{color: 0,105,155}♫ <Work>)
    Colour codes used: 4 different colours.

    Colours 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}

    4
    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

    5
    Tips and Tricks / MusicBee File Paths: Installed vs Portable
    « on: July 15, 2022, 11:21:02 AM »
    Structure of MusicBee's folders

    This summary is intended to help those who wish to:
    • switch from the installed to the portable version;
    • backup data;
    • transfer their MB install to another computer.

    Table of Contents
    • Folders and files (installed vs. portable)
    • Adapting MusicBee3Settings.ini
      after switching to the portable version
    • Access and remarks

    Folders and files (installed vs. portable)

    Nr.ContentFilesFolder in Installed versionMB subfolder in 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 & tags
    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 profiles
    C.1Artist thumbs, for:
    - Album Artist
    - Artist
    - Composer
    - Original Artist
    *.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.3Artist profiles,
    - large pictures
    *.dat
    *.tmp
    %LOCALAPPDATA%\MusicBee\InternalCache\ArtistBackdrops.\AppData\InternalCache\ArtistBackdrops
    C.4Artist profiles,
    - biographies
    *.bio.dat%LOCALAPPDATA%\MusicBee\InternalCache\ArtistData.\AppData\InternalCache\ArtistData
    C.5Artist profiles,
    - similar artists
    *.similar.dat%LOCALAPPDATA%\MusicBee\InternalCache\ArtistData.\AppData\InternalCache\ArtistData
    C.6Soundtrack pictures%USERPROFILE%\Music\MusicBee\Soundtrack Pictures.\Soundtrack Pictures\
    DIcons
    D.1Genre icons
    Genre grouping icons
    Artist thumbs for:
    - Lyricist
    - Conductor
    Icons for other tags:
    - Language
    - Mood
    - Occasion
    - Custom tags
    - Virtual tags
    *.png%USERPROFILE%\Music\MusicBee\Artwork\Grouping Icons.\Library\Artwork\Grouping Icons
    D.2
    D.3
    D.4
    Highlighting icons
    Toolbar icons
    Tab icons
    *.ico
    *.png
    %ProgramFiles(x86)%\MusicBee\Icons
    %APPDATA%\MusicBee\Icons
    .\Icons
    EPlaylists
    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 & layouts
    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 & equaliser
    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

    Adapting MusicBee3Settings.ini
    after switching to the portable version


    When switching from the installed to the portable version, copying all your files to their new locations is essential, but not the last step.

    At this point, MusicBee3Settings.ini still needs editing, since it contains references to several folders. Hence, you will have to perform some replacements in the file with your preferred text editor.

    Caution:
    • Make a backup copy of MusicBee3Settings.ini !
    • When replacing an old path by the new matching one, always ensure the new path exists in your portable version.
    The variable parts depending on your particular configuration are in green below.

    Where in the file?Replace:By:
    At the beginning:
    <ENV_OrigSetPath>...
    </ENV_OrigSetPath>
    C:\Users\(YourUserID)\AppData\Roaming\MusicBee\(Portable MB path)\AppData
    On the next line:
    <ENV_LibPath>...
    </ENV_LibPath>
    ,
    C:\Users\(YourUserID)\Music\MusicBee\(Portable MB path)\Library
    Below:
    <ENV_KnownLib>...
    </ENV_KnownLib>
    ,
    C:\Users\(YourUserID)\Music\MusicBee\(Portable MB path)\Library
    all occurrencesC:\Users\(YourUserID)\Music\MusicBee\Playlists(Portable MB path)\Library\Playlists
    all occurrencesC:\Program Files (x86)\MusicBee(Portable MB path)

    Access and remarks

    Nr.ContentAccess and remarks
    AMain settings
    A.1Application settingsPreferences = (MB menu) -> Edit -> Edit preferences
    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, for:
    - Album Artist
    - Artist
    - Composer
    - Original Artist
    Music tab -> (Left panel) -> Album Artist / Artist / Composer / Original Artist
    + Music Explorer -> Artist Information -> Profile
    C.2Artist thumbs, resized from C.1Generated by MusicBee from C.1
    C.3Artist profiles, large picturesMusic Explorer -> Artist Information -> Profile
    C.4Artist profiles, biographiesMusic Explorer -> Artist Information -> Profile
    C.5Artist profiles, similar artistsMusic Explorer -> Artist Information -> Similar Artists -> More Similar Artists
    C.6Soundtrack picturesLearn the whereabouts on MusicBee Wiki
    + See also: Preferences -> Tags (1) -> artwork -> soundtrack picture locations
    DIcons
    D.1Genre icons
    Genre grouping icons
    Music tab -> Left panel -> Genre / Genre Category
    + See also: Preferences -> Tags (2) -> tag handling -> group genres
    D.2Highlighting iconsPreferences -> Tags (2) -> tag handling -> highlighting
    D.3Toolbar icons
    D.4Tab iconsTab contextual menu -> Select Tab Icon...
    EPlaylists
    E.1PlaylistsPlaylistst (Add tab -> Playlists:Playlist Explorer)
    E.2Current playlistNow Playing (Add tab -> Now Playing)
    E.3Current auto DJ playlistAuto DJ (Add tab -> Playlists:Auto DJ)
    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 presetsEqualizer button (player controls)

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

    7
    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!

    8
    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

    9
    Buggy version:
    MusicBeeSetup_3_3_Update4.zip

    Latest functioning version:
    MusicBeeSetup_3_3_Update3.zip

    Actions performed when bug shows up:
    - outside MB, copy artwork to clipboard
    - in MB, right click on an artist's thumbnail
    - select "Paste Artwork"

    Error message:
    In MB 3.3 upd. 4, you get an error window, reading "Invalid picture",
    whereas in MB 3.3 upd. 3, the artist's thumbnail is changed as expected.

    Pages: 1