Although the Rothenberg propriety of a single scale can be computed directly with isproper()
,
propriety is a scalar feature (like modal "color") which is defined by a scale's position in
the geometry of continuous pc-set space. That is, propriety, contradictions, and ambiguities are
all determined by a scale's relationship to a hyperplane arrangement, but the arrangements which
define these properties are different from the ones of Modal Color Theory. make_roth_ineqmat()
creates the ineqmats
needed to study those arrangements, similar to what makeineqmat()
does
for MCT arrangements. make_rosy_ineqmat()
creates the combination of Rothenberg and MCT arrangements.
(The name puns on the "Roth" of Rothenberg meaning "red," lending a reddish
or rosy tint to the "colors" of the MCT arrangement.)
Value
A matrix with card+1
columns and k rows, where k is the number of hyperplanes
in the arrangement.
Details
Each row of a Rothenberg ineqmat
represents a hyperplane, just like the rows produced by
makeineqmat()
. The rows are normalized so that their first non-zero entry is either 1
or -1
,
and their orientations are assigned so that a strictly proper set will return only -1
s for its
sign vector relative to the Rothenberg arrangement. A 0
in a Rothenberg sign vector represents
an ambiguity. Note that the Rothenberg arrangements are never "central," which means that the
hyperplanes do not all intersect at the perfectly even scale. (It is clear that they must not,
because perfectly even scales have no ambiguities.) These arrangements also grow in complexity
much faster than the MCT arrangements do: for tetrachords, MCT arrangements have 8 hyperplanes while
Rothenberg arrangements have 22. For heptachords, those numbers increase to 42 and 259, respectively.
Thus, this function runs slowly when called on cardinalities of only modest size (e.g. 12-24).
Examples
c_major <- c(0, 2, 4, 5, 7, 9, 11)
hepta_roth_ineqmat <- make_roth_ineqmat(7)
isproper(c_major)
#> [1] TRUE
cmaj_roth_sv <- signvector(c_major, ineqmat=hepta_roth_ineqmat)
table(cmaj_roth_sv)
#> cmaj_roth_sv
#> -1 0
#> 258 1
hepta_roth_ineqmat[which(cmaj_roth_sv==0),]
#> [1] 0.0 0.0 0.0 -1.0 0.0 0.0 1.0 -0.5
# This reveals that c_major has one ambiguity, which results from
# the interval from 4 to 7 being exactly half an octave.