library(dplyr)
notes <- "r s a2~ a2 c3 c f4 f' d a f ce_g ceg#"
info <- "4. 4. 4.. 4- 4..-. 8^ 8-^ 8-> 4.-! t4 t4[staccato] t4[accent] 2.."
p1 <- pc(pct(p("a", 1)), rp(p(notes, info)))
p2 <- volta(p("r s a~ a c' c4 f5 f'' d4 a4 f' c'e_'g' c'e'g#'",
"4. 4 8*9 2. 2"))
x1 <- track(p1) |> score()
x2 <- track(p2, tuning = "DADGAD", key = "c#") |> score()
x3 <- track(pc(p1, p2), clef = NA) |> score()
notes <- "a, b, c d e f g a"
p1 <- p(notes, 8)
p2 <- p(tp(notes, 7), 8)
p3 <- p(tp(notes, -12), 8)
x4 <- trackbind(track(p1, voice = 1),
track(p2, voice = 2), id = c(1, 1)) |> score()
x5 <- trackbind(track(p1, key = "b_"), track(p2, key = "c#")) |> score()
chord_prep <- c("b_:m" = "x13321", "c/g" = "332o1o",
"b:m/f#" = "14 12 14 14 13 12", "r" = NA, "s" = NA)
chords <- chord_set(chord_prep)
test_that("chord_set returns as expected", {
expect_equal(names(chords), names(chord_prep))
z <- chord_set(c("b_:m" = "x;1;3;3;2;1;"))
expect_equal(z, chord_set(c("b_:m" = "x;1;3;3;2;1")))
expect_equal(z, chord_set(c("b_:m" = "x 1 3 3 2 1")))
expect_equal(z, chord_set(c("b_:m" = "1 3 3 2 1")))
expect_equal(z, chord_set(c("b_:m" = "x13321")))
expect_equal(z, chord_set(c("b_:m" = "13321")))
expect_error(
chord_set(c("b_:m" = "x 1 3 3 2 1"), n = 5),
"Cannot have more fret values than number of instrument strings.")
})
chord_seq <- setNames(c(4, 4, 2), names(chords[1:3]))
t1 <- trackbind(
track(p1, key = "f"),
track(p3, clef = "bass_8", key = "g", tuning = "bass")
)
x6 <- score(t1)
x7 <- score(t1, chords)
x8 <- score(t1, chord_seq = chord_seq)
x9 <- score(t1, chords, chord_seq)
x10 <- trackbind(
track(p1, key = "d", tab = FALSE, voice = 1),
track(p2, key = "d", tab = FALSE, voice = 2),
track(p3, clef = NA, key = "g", tuning = "bass"),
track(p3, clef = "bass_8", key = "a", tab = FALSE, tuning = "bass"),
id = c(1, 1, 2, 3)
) |>
score()
x11 <- trackbind(
track(p3, key = "d#m", tuning = "bass"),
track(p3, clef = "bass_8", tab = FALSE, key = "e_", tuning = "bass")
) |>
score()
x <- list(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11)
header <- list(
title = "my title", subtitle = "subtitle", composer = "composer",
album = "album", arranger = "arranger", instrument = "instrument",
meter = "meter", opus = "opus", piece = "piece", poet = "poet",
copyright = "copyright", tagline = "tagline")
paper <- list(textheight = 230, linewidth = 160, indent = 20, fontsize = 16,
first_page_number = 10, page_numbers = FALSE)
out <- file.path(tempdir(), c("out.ly", "out.pdf", "out.png", "out.mid"))
cleanup <- file.path(tempdir(), c("out.mid", "out.pdf", "out.png", "out.log",
"out.ly"))
cl <- "NULL"
test_that("track wrappers return as expected", {
z <- phrase("a", 1)
expect_false(track_tc(z)$tab)
expect_equal(track_bc(z)$clef, "bass")
expect_equal(track_bass(z)$clef, "bass_8")
})
test_that("lilypond wrapper runs without error", {
expect_is(lilypond(x1, out[1]), cl)
expect_is(lilypond(x2, out[1]), cl)
purrr::walk(x, ~expect_is(lilypond(.x, out[1]), cl))
purrr::walk(x, ~expect_is(lilypond(.x, out[1], simplify = FALSE), cl))
expect_error(lilypond(NULL, tempo = NULL, midi = TRUE),
"Set an explicit `tempo` if `midi = TRUE`.")
expect_is(lilypond(x1, out[1], tempo = NULL, midi = FALSE), cl)
expect_is(lilypond(x1, out[1], header = list(title = "Title"),
colors = list(x = 2)), cl)
expect_is(lilypond(x1, out[1], header = list(title = "Title"),
colors = list(color = "#FF3030", staff = "red", x = 2)),
cl)
expect_error(lilypond(x1, out[1], paper = list(print_first_page_number = 1)),
"`print_first_page_number` must be logical.")
expect_error(lilypond(x1, out[1], paper = list(page_numbers = 1)),
"`page_numbers` must be logical.")
expect_error(lilypond(x1, out[1], paper = list(first_page_number = TRUE)),
"`first_page_number` must be a number.")
unlink(cleanup)
})
test_that("tab wrapper runs without error", {
skip_on_cran()
include_midi <- TRUE
expect_is(tab(x1, out[2], midi = include_midi, header = list(title = "Title"),
colors = list(x = 2), details = TRUE), cl)
expect_is(tab(x1, out[3], midi = include_midi, header = list(title = "Title"),
colors = list(color = "#FF3030", staff = "red", x = 2)), cl)
expect_is(tab(x1, out[3], midi = include_midi, header = list(title = "Title"),
colors = list(
color = "#FF3030", staff = "red", time = "red", clef = "red",
bar = "red", beam = "red", head = "red", stem = "red",
accidental = "red", slur = "red", tabhead = "red", x = 2),
transparent = TRUE), cl)
expect_is(render_tab(x1, out[3], midi = include_midi, transparent = TRUE), cl)
expect_is(
render_score(x1, out[3], transparent = TRUE,
colors = list(background = "#888888", staff = "red")), cl)
expect_is(render_midi(x1, out[4]), cl)
purrr::walk(x, ~expect_is(
tab(.x, out[2], midi = include_midi), cl))
purrr::walk(x, ~expect_is(
tab(.x, out[3], midi = include_midi), cl))
purrr::walk(x, ~expect_is(
tab(.x, out[3], midi = FALSE, simplify = FALSE), cl))
expect_error(tab(x8, out[2], "d_m", midi = include_midi),
"Invalid `key`. See `keys\\(\\)`.")
purrr::walk(keys(), ~expect_is(
tab(x8, out[2], .x, "2/2", "4 = 110", header = header,
string_names = FALSE, paper = paper, midi = FALSE, keep_ly = FALSE),
cl))
purrr::walk(keys(), ~expect_is(
tab(x10, out[2], .x, "4/4", "4 = 120", header = header,
string_names = TRUE, paper = paper, midi = FALSE,
keep_ly = FALSE, simplify = FALSE), cl))
expect_is(tab(x7, out[2], "c#", "2/2", "4 = 110",
header = c(header[c(1, 3, 4)], metre = "meter"),
string_names = TRUE, paper = paper[1:5], midi = FALSE,
keep_ly = FALSE), cl)
expect_is(tab(x10, out[2], "c#", "2/2", "4 = 110",
header = c(header[c(1, 3, 4)], metre = "meter"),
string_names = TRUE, paper = paper[1:5], midi = FALSE,
keep_ly = FALSE), cl)
unlink(cleanup)
})
test_that("tab wrapper including lyrics runs without error", {
skip_on_cran()
s1 <- score(
trackbind(
track(p("a e'", 4)),
track(p("c' g'", 4), voice = 2, lyrics = as_lyrics(". G")),
id = 1)
)
s2 <- score(
trackbind(
track(p("a e'", 4), lyrics = as_lyrics("A E")),
track(p("c' g'", 4), voice = 2, lyrics = as_lyrics(". G")),
id = 1)
)
s3 <- score(
trackbind(
track(p("a e'", 4), lyrics = as_lyrics("A .")),
track(p("c' g'", 4), lyrics = as_lyrics(". G"))
)
)
s4 <- score(
trackbind(
track(p("a e' s s a e' a e'", 4), lyrics = as_lyrics("1 2 3 4 5 . 7 .")),
track(p("r g' c' g'", 4), lyrics = as_lyrics(". G C G"))
)
)
m1 <- as_music("a,4 b, r c~ c2 d", lyrics = as_lyrics("A2 B2 Rest C3 . D3"))
expect_is(render_score(s1, out[2]), cl)
expect_is(render_tab(s2, out[2]), cl)
expect_is(render_tab(s3, out[3]), cl)
expect_is(render_tab(s4, out[3]), cl)
expect_is(render_music_guitar(m1, out[3], colors = list(lyrics = "red")), cl)
unlink(cleanup)
})
test_that("miditab and midily functions run without error", {
skip_on_cran()
midi <- system.file("example.mid", package = "tabr")
expect_is(midily(midi, out[1]), cl)
expect_is(midily(midi, out[1], key = "b_", quantize = 8,
explicit = TRUE, start_quant = 8, allow_tuplet = "8*2/3",
lyric = TRUE), cl)
expect_is(midily(midi, out[1], key = "cm", quantize = 8,
explicit = TRUE, start_quant = 8, allow_tuplet = "8*2/3",
details = TRUE, lyric = TRUE), cl)
# Using --absolute-pitches seems bugged in the current LilyPond version
# so it is currently deactivated in midily()
expect_is(midily(midi, out[1], key = "b_", absolute = TRUE, quantize = 8,
explicit = TRUE, start_quant = 8, allow_tuplet = "8*2/3",
lyric = TRUE), cl)
expect_is(midily(midi, out[1], key = "cm", absolute = TRUE, quantize = 8,
explicit = TRUE, start_quant = 8, allow_tuplet = "8*2/3",
details = TRUE, lyric = TRUE), cl)
expect_is(miditab(midi, out[2], details = TRUE), cl)
expect_is(miditab(midi, out[3]), cl)
unlink(cleanup)
})
test_that("render_chordchart runs without error", {
skip_on_cran()
chords <- filter(
guitarChords, root %in% c("c", "f") & id %in% c("7", "M7", "m7") &
!grepl("#", notes) & root_fret <= 12) |>
arrange(root, id)
chords <- setNames(chords$fretboard, chords$lp_name)
expect_is(render_chordchart(chords, out[2], 2, paper = list(fontsize = 16),
header = list(title = "A title"), details = TRUE),
cl)
expect_is(render_chordchart(chords, out[3], 1, keep_ly = TRUE), cl)
expect_is(render_chordchart(chords, out[3], 1, transparent = TRUE,
colors = list(color = "blue")), cl)
unlink(cleanup)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.