These functions assist with mapping between scale degrees, notes and chords.
Usage
scale_degree(
notes,
key = "c",
scale = "diatonic",
use_root = TRUE,
strict_accidentals = TRUE,
naturalize = FALSE,
roman = FALSE
)
scale_note(deg, key = "c", scale = "diatonic", collapse = FALSE, ...)
note_in_scale(
notes,
key = "c",
scale = "diatonic",
use_root = TRUE,
strict_accidentals = TRUE
)
chord_degree(
notes,
key = "c",
scale = "diatonic",
strict_accidentals = TRUE,
naturalize = FALSE,
roman = FALSE
)
is_in_scale(notes, key = "c", scale = "diatonic", strict_accidentals = TRUE)
Arguments
- notes
character, a string of notes.
- key
character, key signature (or root note) for scale, depending on the type of
scale
.- scale
character, the suffix of a supported
scale_*
function.- use_root
logical, use lowest pitch in chord. Otherwise yield an
NA
in output.- strict_accidentals
logical, whether representation must match key and scale. See details.
- naturalize
logical, whether to naturalize any sharps or flats before obtaiuning the scale degree.
- roman
logical, return integer scale degrees as Roman numerals.
- deg
integer, roman class, or character roman, the scale degree.
- collapse
logical, collapse result into a single string ready for phrase construction.
- ...
additional arguments passed to the scale function, e.g.,
sharp = FALSE
forscale_chromatic()
.
Details
Obtain the scale degree of a note in a supported scale with scale_degree()
.
This function works on any noteworthy string. It ignores octave numbering.
Rests and any note not explicitly in the scale return NA
. If deg
is
greater than the number of degrees in the scale, it is recycled, e.g., in C
major 8 starts over as C.
By default, flats and sharps checked strictly against the scale. Setting
strict_accidentals = FALSE
will convert any flats or sharps present,
if necessary based on the combination of key
signature and
scale
. The chromatic scale is a special case where strict accidental
is always ignored.
Not any arbitrary combination of valid key
and valid scale
is valid. For
example, key = "am"
and scale = "harmonic"
is valid, but not with
key = "a"
.
note_in_scale()
is a wrapper around scale_degree()
. To check if full
chords are diatonic to the scale, see is_diatonic()
.
The inverse of scale_degree()
is scale_note()
, for obtaining the note
associated with a scale degree. This could be done simply by calling a
scale_*
function and indexing its output directly, but this wrapper is
provided to complement scale_degree()
.
Additionally, it accepts the common Roman numeral input for the degree.
This can be with the roman
class or as a character string.
Degrees return NA
if outside the scale degree range.
Examples
scale_degree("r c, e3 g~ g s g# ceg")
#> [1] NA 1 3 5 5 NA NA 1
note_in_scale("r c, e3 g~ g s g# ceg")
#> [1] NA TRUE TRUE TRUE TRUE NA FALSE TRUE
scale_degree("c e g", roman = TRUE)
#> [1] I III V
scale_degree("c c# d_ e", key = "d")
#> [1] NA 7 NA 2
scale_degree("c c# d_ e", key = "d", strict_accidentals = FALSE)
#> [1] NA 7 7 2
scale_degree("c, e_3 g' f#ac#", use_root = FALSE)
#> [1] 1 NA 5 NA
scale_degree("c, e_3 g' f#ac#", naturalize = TRUE) # lowest chord pitch: c#
#> [1] 1 3 5 1
scale_degree("c# d_ e_' e4 f f# g", key = "c#", scale = "chromatic")
#> [1] 1 1 3 4 5 6 7
scale_note(1:3, key = "am")
#> <Noteworthy string>
#> Format: vectorized time
#> Values: a b c
scale_note(c(1, 3, 8), "d", collapse = TRUE)
#> <Noteworthy string>
#> Format: space-delimited time
#> Values: d f# d
all(sapply(list(4, "IV", as.roman(4)), scale_note) == "f")
#> [1] TRUE
x <- "d dfa df#a f#ac#"
chord_degree(x, "d")
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 1 NA 5
#>
#> [[3]]
#> [1] 1 3 5
#>
#> [[4]]
#> [1] 3 5 7
#>
is_in_scale(x, "d")
#> [1] TRUE FALSE TRUE TRUE