Attention has been given to minimizing typing and keeping the R code short, particularly when the music is repetitive. However, this also needs to be extended to the tablature itself. Sheet music makes use of various styles of repeat notation to keep the number of pages for a song transcription from expanding needlessly.
tabr
offers three functions for common ways to use
repeats with LilyPond and in sheet music. The first is
rp()
. (R functions rep
and repeat
are used for other purposes; think of rp()
as standing for
repeat phrase.) This function is the only one that does not reduce the
length of the guitar tablature. It only serves to shorten code.
rp()
unfolds repeated sections of music so that in
the output the music is explicitly written out on the staff however many
times.
The other two functions are pct()
and
volta()
. These functions do shorten the tablature output.
pct()
is for percent repeat notation. It is useful for
simple repetition of individual beats or of full measures or bars of
music. volta()
is useful for repeating entire measures,
optionally with alternate endings. volta()
is the standard
approach when alternate section endings are present. All three functions
operate similarly and share the same perspective on repeated sections of
music even though some of their arguments as well as their results
differ.
You have already seen how pn()
is used to repeat phrases
and character strings n
times. This helps keep R code
shorter for repetitive music. However, this does nothing for the
resulting LilyPond markup or the final sheet music output. It is
strictly to limit repetitive typing and used more generally than for
section repeats. rp()
achieves the same result. It does not
shorten the music transcription. It is the simplest of the collection of
repeat functions that apply LilyPond repeat tags around phrase
objects.
Take the following phrase as an example.
#> <Musical phrase>
#> <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8
rp(p1, 1) # repeat once (n = 1), or play twice (n + 1)
#> <Musical phrase>
#> \repeat unfold 2 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 }
#>
Note the difference in n
and the results of
pn()
vs. rp()
. Usually an argument like
n
refers to the total number of times, as it does in
pn()
. But for tabr
repeat functions,
n
always refers to the number of repeats added to
the initial play, or one less than the total number of plays. Therefore,
n
always begins counting from one (the default), since
there is no reason to use these repeat functions when not repeating
anything.
In the tablature output above, the first two measures pertaining to
the use of pn()
are identical to the last two resulting
from rp()
. Unfolding a repeated section is no different
than writing it out fully. rp()
represents a shortening of
LilyPond markup by applying the \repeat \unfold
tag around
the music. The 2
shown in the LilyPond markup output is the
total number of plays, n + 1
. Think of pn()
as
a more general purpose helper function in tabr
for pasting
copies of strings together whereas rp()
might be used when
you are thinking more specifically about meaningful, discrete section of
music.
Like rp()
, pct()
does not remove measures
of music in the tablature output. However, percent repeat symbols can
shorten sheet music in so much as they may make measures of music
smaller in size as a result of having nothing else to print in the
measure but the repeat symbol itself. They can also make the
transcription less messy or straining on the eyes particularly when the
section being repeated with percent symbols is one that uses a lot of
ink on the page.
The next example uses pct()
with the previous phrase and
follows with a high ink measure using percent repeats for another four
measures.
pct(p1, 3)
#> <Musical phrase>
#> \repeat percent 4 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 }
#>
p2 <- p("g,b,dgbg'*16", 16)
pc(pct(p1, 3), pct(p2, 3)) |> track() |> score() |> tab("example18.pdf")
It is nice to not have to stare at those rapid bar chords in every measure. The earlier measures are also shorter as a result of not having to display all the notes.
Finally there is the volta()
repeat function. Unlike
rp()
and pct()
, volta
must be
applied to whole measures of music. The endings also must be whole
measures. It is also the only way to specify repeats with alternate
endings, though not required. In either case, this type of repeat
notation does remove entire measures of music from the output.
The examples below uses volta()
with the original phrase
various endings. Here are the endings.
When n = 1
repeat, volta()
simply adds the
double bars around the section. With no other annotation in the sheet
music, it is assumed that the section is repeated one time. When
n
is greater than one, annotation appears clarifying the
number of times to play the section.
volta(p1)
#> <Musical phrase>
#> \repeat volta 2 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 | }
#>
volta(p1, 2)
#> <Musical phrase>
#> \repeat volta 3 { <c>8^"Play 3 times." <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 | }
#>
For brevity, concatenate both of these. Note that the volta repeat bar at the beginning of a repeated section is omitted from the staff if it occurs at the start of the song.
There are instances where you want to suppress this annotation.
Specifically, if there are multiple tab staffs present, there is no need
to print the same annotation above every staff other than the top one.
Also, there is the edge case where notes in the section may already have
annotations attached to them via notate()
, in which case
the above annotation may get in the way. It can be suppressed in
volta()
with silent = TRUE
.
When alternate endings are used with volta()
, the
annotation above the staff is never included because the number of times
the section is played is clear from the explicit endings numbering. Note
that when the number of repeats exceeds the number of alternate endings,
the initial alternate ending is reused first until the number of
remaining repeats are covered by the alternate endings. The subsequent
alternate endings are not recycled.
To be clear, the phrase passed to volta()
does not
contain or represent its own implicit default ending. When used without
alternate endings, there is no “ending”; it is just the phrase. When
alternate endings are provided, they represent all endings. The first
alternate is the “default” if you want to think of it this way.
volta(p1, 1, e1)
#> <Musical phrase>
#> \repeat volta 2 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 | }
#> \alternative {
#> { <f>4 <a>4 <c'>4 <f'>4 | }
#> }
volta(p1, 2, e1)
#> <Musical phrase>
#> \repeat volta 3 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 | }
#> \alternative {
#> { <f>4 <a>4 <c'>4 <f'>4 | }
#> }
As before, concatenate the above two examples. For the remaining examples using alternate endings, a single measure of a whole note C is added after repeated sections to separate them and provide a better sense of the context.
c1 <- p("c", 1)
pc(volta(p1, 1, e1), c1, volta(p1, 2, e1), c1) |> track() |> score() |> tab("example20.pdf")
Multiple alternate endings work similarly to single. The first ending is recycled if necessary. Subsequent endings are used once. If you want to use these subsequent ending more than once, just provide it accordingly. Clearly, there is no reason to provide more endings than the number of times the section is played. If extra endings are providing, LilyPond will issue a warning when rendering the document notifying that there are more alternates than repeats and that the excess have been ignored.
#> <Musical phrase>
#> \repeat volta 3 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 | }
#> \alternative {
#> { <f>4 <a>4 <c'>4 <f'>4 | }
#> { <c>8 <c>8 <c>8 <c>8 <c>8 <c>8 <c>8 <c>8 | }
#> { <c e g c' e'>1 | }
#> }
x2
#> <Musical phrase>
#> \repeat volta 3 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 | }
#> \alternative {
#> { <f>4 <a>4 <c'>4 <f'>4 | }
#> { <c>8 <c>8 <c>8 <c>8 <c>8 <c>8 <c>8 <c>8 | }
#> }
x3
#> <Musical phrase>
#> \repeat volta 3 { <c>8 <e>8 <g>8 <c'>8 <e'>8 <c'>8 <g>8 <e>8 | }
#> \alternative {
#> { <f>4 <a>4 <c'>4 <f'>4 | }
#> }