Calculate elementary voice leadings which represent motion by a single
arrow on a brightnessgraph()
. vlsig()
finds "voice-leading signature"
of a set moving to transpositions of itself, as determined by vl_generators()
. inter_vlsig()
finds the elementary voice leadings from a set to some other set, i.e. where the goal
parameter of brightnessgraph()
is not NULL
. By default, inter_vlsig()
finds
voice leadings for contextual inversions of a set.
Usage
vlsig(set, index = NULL, display_digits = 2, edo = 12, rounder = 10)
inter_vlsig(
set,
goal = NULL,
index = NULL,
type = c("ascending", "commontone", "obverse"),
display_digits = 2,
edo = 12,
rounder = 10
)
Arguments
- set
Numeric vector of pitch-classes in the set
- index
Integer: which voice-leading generator should be displayed? Defaults to
NULL
, displaying all voice leadings.- display_digits
Integer: how many digits to display when naming any non-integral interval sizes. Defaults to 2.
- edo
Number of unit steps in an octave. Defaults to
12
.- rounder
Numeric (expected integer), defaults to
10
: number of decimal places to round to when testing for equality.- goal
For
inter_vlsig()
only, vector of the transposition type to voice lead to. Defaults toNULL
, producing voice leadings to the inversion ofset
.- type
For
inter_vlsig()
only. String: "ascending", "commontone", or "obverse". Defaults to "ascending", which makes the result prefer ascending voice leadings (as forvlsig()
). The second makes the result prefer common tones (as might be expected for contextual inversions). The third option, "obverse", gives the obverse of a voice-leading in a sense that generalizes Morris (1998, doi:10.2307/746047 )'s concept for Neo-Riemannian PLR transformations. This option returns voice leadings that lead toset
rather than away from it.
Value
List with three elements:
"vl" which shows the distance (in
edo
steps) that each voice moves,"tn" which indicates the (chromatic) transposition achieved by the voice leading,
"rotation" which indicates the scalar transposition caused by the voice leading.
If index=NULL
, returns instead a matrix whose rows are
all the elementary voice leadings.
Details
Note that the voice leadings determined by vlsig()
can be different from the
corresponding ones at the same \(T_n\) level in vl_rolodex()
. The latter function
prioritizes minimal voice leadings, whereas vlsig()
prioritizes elementary voice
leadings derived from a set's brightnessgraph()
. In particular, this means that
vlsig()
voice leadings will always be ascending, involve at least one common tone,
and involve no contrary motion. See the odd_pentachord
voice leadings in the Examples.
For vlsig()
the value "rotation" in the result is non-arbitrary: if the rotation value
is n, the voice leading takes set
to the nth mode of set
. For inter_vlsig()
, there
is no canonical correspondence between modes of set
and goal
, except to assume that
the input modes are the 1st mode of each scale. If goal
is NULL
, finding contextual
inversions of set
, the first mode of the inversion is taken to be the one that holds the
first and last pitches of set
in common. These "rotation" values do not have a transparent
relationship to the values of inter_vlsig()
's index parameter.
For inter_vlsig()
results are not as symmetric between set
and goal
as you might
expect. Since these voice-leading functions study ascending arrows on a brightness graph
the possibilities for ascending from X to Y are in principle somewhat different from
the possibilities for ascending from Y to X. See the examples for the "Tristan genus."
Note that this is still true when type="commontone"
, which might lead to counterintuitive
results.
Examples
# Hook's elementary signature transformation
major_scale <- c(0, 2, 4, 5, 7, 9, 11)
vlsig(major_scale, index=1)
#> $vl
#> [1] 0 0 0 1 0 0 0
#>
#> $tn
#> [1] 7
#>
#> $rotation
#> [1] 4
#>
pure_major_triad <- j(1, 3, 5)
vlsig(pure_major_triad, index=1)
#> $vl
#> [1] 0.00 1.12 1.82
#>
#> $tn
#> [1] 4.98045
#>
#> $rotation
#> [1] 1
#>
vlsig(pure_major_triad, index=2)
#> $vl
#> [1] 0.71 0.00 1.82
#>
#> $tn
#> [1] 8.843587
#>
#> $rotation
#> [1] 2
#>
odd_pentachord <- c(0, 1, 4, 9, 11) # in 15-edo
vlsig(odd_pentachord, index=2, edo=15)
#> $vl
#> [1] 2 3 4 0 1
#>
#> $tn
#> [1] 8
#>
#> $rotation
#> [1] 2
#>
vl_rolodex(odd_pentachord, edo=15)$"8"
#> [1] -3 1 0 -1 -2
# Contextual inversions for Tristan genus:
dom7 <- c(0, 4, 7, 10)
halfdim7 <- c(0, 3, 6, 10)
inter_vlsig(dom7, halfdim7)
#> [,1] [,2] [,3] [,4]
#> [1,] 1 0 0 1
#> [2,] 2 0 0 0
#> [3,] 1 1 0 0
#> [4,] 1 0 1 0
inter_vlsig(halfdim7, dom7)
#> [,1] [,2] [,3] [,4]
#> [1,] 0 1 1 0
#> [2,] 1 0 1 0
#> [3,] 1 1 0 0
# Elementary voice leadings between unrelated sets:
maj7 <- c(0, 4, 7, 11)
min7 <- c(0, 3, 7, 10)
inter_vlsig(min7, maj7)
#> [,1] [,2] [,3] [,4]
#> [1,] 0 1 0 1
#> [2,] 2 0 0 0
brightnessgraph(min7, maj7)
# Elementary inversional VL for just diatonic which is NOT a Q-relation:
inter_vlsig(j(dia), index=3)
#> $vl
#> [1] 0.71 0.71 0.00 0.71 0.71 0.00 0.00
#>
#> $tni
#> [1] 7.726274
#>
#> $rotation
#> [1] 5
#>
# Obverse voice leadings:
# First we see the Parallel transformation which leads from minor to major:
minor <- c(0, 3, 7)
P <- inter_vlsig(minor, index=1)
print(P)
#> $vl
#> [1] 0 1 0
#>
#> $tni
#> [1] 7
#>
#> $rotation
#> [1] 0
#>
# Compare to its obverse, Slide, leading *to* minor from major:
S <- inter_vlsig(minor, index=1, type="obverse")
print(S)
#> $vl
#> [1] 1 0 1
#>
#> $tni
#> [1] 6
#>
#> $rotation
#> [1] 0
#>
# A voice-leading plus its obverse is a chromatic transposition:
P$vl + S$vl
#> [1] 1 1 1