How can I set the track numbers on a Vinyl release for A- and B-side separately?

I try to tag this Vinyl album with MusicBrainz Picard v2.13.3:

For the Vinyl track number itself I found this very useful documentation and:
$set(tracknumber,%_musicbrainz_tracknumber%)

But how can I set the total number of tracks to 8 for the A-side and 6 for the B-side instead of 14 for the total number of tracks (totaltracks) for both sides?

The result I’m looking for for the track number is

A1/8
A2/8
...
A8/8

and

B1/6
B2/6
...
B6/6

I’m pretty sure you can do this using the “Persistent Variables” plugin (documentation). To do this, I think you need to have 2 separate tagging scripts – one to collect the track-per-side count, and the other to apply the value.

The following (untested) scripts should do what you want:

Script 1 - Collect the information

$if($in($left(%_musicbrainz_tracknumber%,1),0123456789),
  $noop(Normal numeric track number beginning with a digit)
  $noop(Do nothing)
,
  $noop(Vinyl track number beginning with a letter)
  $noop(Increment the track count for this disc number and side)
  $set(_counter,$upper($left(%_musicbrainz_tracknumber%,1))%discnumber%)
  $set_a(%_counter%,$add($if2($get_a(%_counter%),0),1))
)

Script 2 - Apply the information

$if($in($left(%_musicbrainz_tracknumber%,1),0123456789),
  $noop(Normal numeric track number beginning with a digit)
  $noop(Do nothing)
,
  $noop(Vinyl track number beginning with a letter)
  $noop(Save the total track count for this disc number and side)
  $set(_counter,$upper($left(%_musicbrainz_tracknumber%,1))%discnumber%)
  $set(totaltracks,$get_a(%_counter%))
)

This should set the %totaltracks% tag to the total number of tracks on that side of that vinyl disc number of the album. If the %_musicbrainz_tracknumber% tags are not in the vinyl track numbering format (beginning with a letter), then the special processing should be ignored.

2 Likes

Thank you very much @rdswift - I just need some time to understand and test it.

Sorry, I just re-read your original message and I think I misunderstood what you wanted. Try the following instead for the second script:

Script 2 - Apply the information

$if($in($left(%_musicbrainz_tracknumber%,1),0123456789),
  $noop(Normal numeric track number beginning with a digit)
  $noop(Do nothing)
,
  $noop(Vinyl track number beginning with a letter)
  $noop(Save the total track count for this disc number and side)
  $set(_counter,$upper($left(%_musicbrainz_tracknumber%,1))%discnumber%)
  $set(tracknumber,%_musicbrainz_tracknumber%/$get_a(%_counter%))
)
2 Likes

FANTASTIC!
Your second script does exactly what I wanted it to do!
Thanks again, I would never have found this solution without your help and support.

2 Likes

One little thing that I don’t understand yet:
Why do I see a difference between Original Value for the track A1/8 and the New Value A1/9

That’s because of an “oops” in my scripts. I forgot that matching a file to a track will cause the scripts to be re-run.

In any event, these slightly revised scripts should take care of that:

Script 1 - Collect the information

$if($in($left(%_musicbrainz_tracknumber%,1),0123456789),
  $noop(Normal numeric track number beginning with a digit)
  $noop(Do nothing)
,
  $noop(Vinyl track number beginning with a letter)
  $noop(Increment the track count for this disc number and side)
  $set(_counter,$upper($left(%_musicbrainz_tracknumber%,1))%discnumber%)
  $if($get_a(%_counter%%tracknumber%),,
    $noop(Only increment in not already processed)
    $set_a(%_counter%,$add($if2($get_a(%_counter%),0),1))
    $set_a(%_counter%%tracknumber%,1)
  )
)

Script 2 - Apply the information

$if($in($left(%_musicbrainz_tracknumber%,1),0123456789),
  $noop(Normal numeric track number beginning with a digit)
  $noop(Do nothing)
,
  $noop(Vinyl track number beginning with a letter)
  $noop(Save the total track count for this disc number and side)
  $set(_counter,$upper($left(%_musicbrainz_tracknumber%,1))%discnumber%)
  $set(tracknumber,%_musicbrainz_tracknumber%/$get_a(%_counter%))
)

Sorry about so many iterations to get this working correctly.

2 Likes

@rdswift In my further tests with different vinyl releases, I think I found another “oops”. :wink:
Could it be that we should switch the condition in the $in function from
$in($left(%_musicbrainz_tracknumber%,1),0123456789),
to
$in(0123456789,$left(%_musicbrainz_tracknumber%,1)),

if the documentation for $in says:

Description:
Returns true, if x contains y. Note that comparisons are case-sensitive.

Or do I understand it wrong and the condition:
“The left first character in %_musicbrainz_tracknumber% contains 0123456789”
returns the same as
“0123456789 contains the left first character in %_musicbrainz_tracknumber%”?

1 Like

Good catch! Yes, the first line (in both scripts) should be changed to

$if($in(0123456789,$left(%_musicbrainz_tracknumber%,1)),

or

$if($rsearch(%_musicbrainz_tracknumber%,^[0-9]),

if you prefer to use regular expressions.

2 Likes