Author Topic: Add more/unlimited virtual tags  (Read 5936 times)

SonicRings

  • Sr. Member
  • ****
  • Posts: 277
I find myself with only 5 more blank virtual tags I can use, meaning I've made 27 virtual tags, and I don't plan on stopping. They're one of the most important features of this music player and I love them so much.

I would like for there to either be an increase in virtual tags to, say, 64 (double the current amount), or just make them unlimited, where you click a + button to create a new one as needed. Similar to the Highlighting Rules Editor.



If you were to make them similar to the Highlighting Rules Editor, it would be very important if they be made impossible to remove via - button unless the formula field is blank. This is to prevent accidental deletions of existing virtual tags. Perhaps even hide the - button when it's not blank, if possible.

Thanks for considering!

purplebee

  • Jr. Member
  • **
  • Posts: 72
+1
I currently only have 8 empty virtual tags left, and use most of my tags for my main custom view. If I was to make alternate custom views I'd probably run out of them. Also agree on having a better way to delete/move them around.


Zak

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 2450
If you were to make them similar to the Highlighting Rules Editor, it would be very important if they be made impossible to remove via - button unless the formula field is blank. This is to prevent accidental deletions of existing virtual tags. Perhaps even hide the - button when it's not blank, if possible.
No to this bit.

As described, that would operate contrary to most user's expectations and become a source of confusion.
If there's concerns about accidentally deleting a value, it should be addressed with a confirmation prompt, not by overriding default control behaviours.
Bee excellent to each other...

phred

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 9303
If there's concerns about accidentally deleting a value, it should be addressed with a confirmation prompt, not by overriding default control behaviours.
+1
Download the latest MusicBee v3.5 or 3.6 patch from here.
Unzip into your MusicBee directory and overwrite existing files.

----------
The FAQ
The Wiki
Posting screenshots is here
Searching the forum with Google is  here

The Incredible Boom Boom

  • Sr. Member
  • ****
  • Posts: 1269
I believe there is a request for more Virtual Tags (and Custom Tags), but I will +1 this post too

SonicRings

  • Sr. Member
  • ****
  • Posts: 277
Well, it's been half a a year and I find myself needing to make 5 more virtual tags, but sadly only have 2 more free virtual tag slots left. I currently have 30 virtual tags and need 35.

Can there please be more virtual tags added if it's too difficult to let us add as many as we want? Perhaps 8 more, bringing the total to 40? Preferably more, if at all possible. 64 would last me a very long time.

I would appreciate it very much!
Last Edit: November 09, 2022, 09:07:50 AM by SonicRings

boroda

  • Sr. Member
  • ****
  • Posts: 4595
-1 for unlimited number of virtual tags. this would break the whole current implementation (e.g. in plugins, and i suppose inside mb too).

SonicRings

  • Sr. Member
  • ****
  • Posts: 277
-1 for unlimited number of virtual tags. this would break the whole current implementation (e.g. in plugins, and i suppose inside mb too).
I mean, not if it's implemented in such a way that that won't be the case.

sapr

  • Newbie
  • *
  • Posts: 15
+1 too, though for me it's Custom Tags being almost used up

hiccup

  • Sr. Member
  • ****
  • Posts: 7785
Personally I would be interested to learn what the users who are requesting (even) more custom and virtual tags are using them for exactly.
To me the amount of both of them seems more than adequate, and I am wondering if there aren't ways already available to accomplish what they are trying to do.
Last Edit: November 12, 2022, 10:15:27 PM by hiccup

The Incredible Boom Boom

  • Sr. Member
  • ****
  • Posts: 1269
I would definitely like the freedom of having more Custom Tags and Virtual Tags. I have five Custom Tag slots left, but that's because I've consolidated some of the eleven I use now in order to have the leftover tags for information that won't fit into any of the currently used ones.

Custom Tags
Code
SETSUBTITLE
TRACKSUBTITLE
MOVIEORALBUM
ENSEMBLE
WORKSUBTITLE
STYLE
IPLST
SONGKEY
PERIOD
ORIGINALDATE
RECORDINGINFO

For Virtual Tags, I have three remaining, but I may be able to free up a fourth if <Album Duration> displays in HH:MM:SS format (I haven't updated to the patch where @Steven made this change yet.) I would like more Virtual Tags, because I have many extremely complicated functions. Some tags are performing two or more distinct actions, simply because I'm trying to save VTs where I can.

The below Virtual Tag was difficult to write.
Code
$Trim($RxReplace($Replace($Replace($Replace($Replace($Split(<RECORDINGINFO>,:,1),recorded,"Recorded "),overdubbed,Overdubbed),mixed,"Mixed "),mastered,"Mastered "),",(?=[^,]*$)","and")$RxReplace($If($Contains($Split(<RECORDINGINFO>,;,1)," in"),"at ",$If($IsMatch($Split(<RECORDINGINFO>,:,2),"[A-Za-z]"),"in ",))$Split($Split(<RECORDINGINFO>,:,2),;,1),"\([\d->\/]+\)",""))$Replace($RxMatch(<RECORDINGINFO>,":\("),":("," ")$RxMatch(<RECORDINGINFO>,"(?!:)(?=\()\(|\s\(")$Date($Split($RxMatch($Split(<RECORDINGINFO>,;,1),"[\d-]+\d(?![\w\s])"),"->",1),MMM dd, yyyy)$If($Contains(<RECORDINGINFO>,"->")," to ",)$Date($RxMatch($Split($Split(<RECORDINGINFO>,;,1),"->",2),"[\d-]+\d(?![\w\s])"),MMM dd, yyyy)$RxMatch(<RECORDINGINFO>,"\)");

That's because it has to parse a tag that may look like this...
Code
recorded:Spin Recording Studios in Long Island City, New York, United States (2013-04-22->2013-04-24); mixed:Spin Recording Studios in Long Island City, New York, United States; mixed:East Side Sound in Lower East Side, Manhattan, New York City, New York, United States; mastered:Sterling Sound in Manhattan, New York City, New York, United States
...or...
Code
recorded:Eclisse Studio in Milan, Italy (1993-03-25->1993-03-28); mixed, mastered:Pixel Sound in Milan, Italy (1993-03-29->1993-03-30)

The result is something like...
Code
Recorded at Spin Recording Studios in Long Island City, New York, United States (Apr 22, 2013 to Apr 24, 2013)
Mixed at Spin Recording Studios in Long Island City, New York, United States
Mastered at Sterling Sound in Manhattan, New York City, United States
...or...
Code
Recorded at Eclisse Studio in Milan Italy (Mar 25, 1993 to Mar 28, 1993)
Mixed and Mastered at Pixel Sound in Milan, Italy (Mar 29, 1993 to Mar 30, 1993)

If I had more Custom Tags, I would likely come up with an easier process for displaying the track creation process, because parsing the dates with the recording location was a pain in the ass.

These are my two most ridiculous Virtual Tags. I use them to parse the track contributors and credits. I would likely have written them differently had I had Virtual Tags to spare.
Code
$IsNull(<Composer><Lyricist><IPLST>,,$Replace($Replace($Replace($Replace($Replace($Replace($Replace($RxReplace($IsNull(<Composer><Lyricist>$RxSplit(<IPLST>,"(arranger|orchestrator|writer):(.+?)(?:;|$)",2),,$If($And(<Composer>=$RxReplace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(producer|engineer|mixer|writer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),"(arranger|orchestrator):",""),<Composer>=$RxReplace($Replace(<Lyricist>,;,","),",(?=[^,]*$)"," and")),$If(<Composer>=$RxReplace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(producer|engineer|mixer|arranger|orchestrator).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),"writer:",""),"Writing, ",$IsNull(<Composer>,"Writing: "$RxReplace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(producer|engineer|mixer|arranger|orchestrator).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),"writer:",""),"Music, "))$If($Contains(<IPLST>,arranger:),Arrangement,)$If($Contains(<IPLST>,orchestrator:),Orchestration,)$IsNull(<Lyricist>,," and Lyrics: "<Composer>),$IsNull(<Composer>,$If($Contains(<IPLST>,orchestrator:),Orchestration,$If($Contains(<IPLST>,Arrangement),Arrangement,)),$If(<Composer>=$RxReplace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(producer|engineer|mixer|arranger|orchestrator).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),"writer:",""),Writing,Music))$IsNull(<Lyricist>$RxSplit(<IPLST>,"(arranger|orchestrator):(.+?)(?:;|$)",2),": "<Composer>,$IsNull(<Composer><Lyricist>,"Arrangement: "$RxReplace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(producer|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),"(arranger|orchestrator):",""),$If($Or(<Composer>=$RxReplace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(producer|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),"(arranger|orchestrator):",""),<Composer>=$RxReplace($Replace(<Lyricist>,;,","),",(?=[^,]*$)"," and")),$IsNull(<Composer>,," and"),": "<Composer>)$IsNull($RxSplit(<IPLST>,"(arranger|orchestrator):(.+?)(?:;|$)",2),," "$If($Contains(<IPLST>,orchestrator:),Orchestration,Arrangement)$If($RxSplit(<IPLST>,"(arranger|orchestrator):(.+?)(?:;|$)",2)=$RxReplace($Replace(<Lyricist>,;,","),",(?=[^,]*$)"," and")," and",": "$RxReplace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(producer|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),"(arranger|orchestrator):","")))$IsNull(<Composer>,," "))$IsNull(<Lyricist>,,$If($IsMatch(<STYLE>,"^Classical$"),Libretto,Lyrics)": "$RxReplace($Replace(<Lyricist>,;,","),",(?=[^,]*$)"," and"))))","),"(\s+|\,)$",""),Composition,{font: Meiryo UI;Bold;8.25}Composition{font: default}),Writing,{font: Meiryo UI;Bold;8.25}Writing{font: default}),Music,{font: Meiryo UI;Bold;8.25}Music{font: default}),Arrangement,{font: Meiryo UI;Bold;8.25}Arrangement{font: default}),Orchestration,{font: Meiryo UI;Bold;8.25}Orchestration{font: default}),Lyrics,{font: Meiryo UI;Bold;8.25}Lyrics{font: default}),Libretto,{font: Meiryo UI;Bold;8.25}Libretto{font: default})$If($Contains(<STYLE>,Soundtrack),$IsNull(<CREDITS>,,)" ",))

Code
$IsNull(<IPLST>,,$Replace($Replace($Replace($RxReplace($IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,)$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,),,$If($And($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)=$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,),$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)=$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,)),$If($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)=$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|engineer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),writer:,),"Writing, ",$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,),"Writing: "$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|engineer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),writer:,),"Producer, "))" "$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,),," and Mixer: "$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)),$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,),,$If($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)=$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|engineer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),writer:,),Writing,Producer))$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,)$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,),": "$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,),$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,),"Engineer: "$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,),$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,),,$If($Or($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)=$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,),$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)=$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,))," and",": "$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|engineer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),producer:,)))$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,),,$If($Contains(<IPLST>,producer)," ",)Engineer$If($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,)=$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,)," and",": "$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|mixer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),engineer:,)))$If($IsMatch(<IPLST>,"producer|engineer")," ",))$IsNull($Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,),,"Mixer: "$Replace($RxReplace($RxReplace($RxReplace($RxReplace(<IPLST>,"(arranger|orchestrator|writer|producer|engineer).+?(;\s|$)",""),";(?=[^;$])",","),",(?:\s|)$",""),",(?=[^,]*$)"," and"),mixer:,))))","),"(\s+|\,)$",""),Producer,{font: Meiryo UI;Bold;8.25}Producer{font: default}),Engineer,{font: Meiryo UI;Bold;8.25}Engineer{font: default}),Mixer,{font: Meiryo UI;Bold;8.25}Mixer{font: default})$If($Contains(<STYLE>,Soundtrack),,))
Last Edit: November 23, 2022, 06:33:45 PM by The Incredible Boom Boom

hiccup

  • Sr. Member
  • ****
  • Posts: 7785
I would definitely like the freedom of having more Custom Tags and Virtual Tags.
While I have been reluctant to ask and support 'more, more, more' (we are already very spoiled compared to any other music managing software out there), you have made a perfect case of describing why I would also be quite happy with a couple more custom and virtual tags.

+1

Steven

  • Administrator
  • Sr. Member
  • *****
  • Posts: 34312
for v3.6 i am planning to make fields in the album and tracks view and the artwork view editable templates like with the track information panel fields

SonicRings

  • Sr. Member
  • ****
  • Posts: 277
for v3.6 i am planning to make fields in the album and tracks view and the artwork view editable templates like with the track information panel fields
That sounds good. However, I need virtual tags for other things, such as the discord rich presence plugin discordbee. Can you please considering adding more virtual tags as well? I would appreciate it very much!