Add decimal number (bitmask), from Goyette (2012)

This commit is contained in:
Jonathan Harker 2024-10-02 08:43:41 +13:00
parent 929813c587
commit 6c42477d7a
2 changed files with 19 additions and 0 deletions

View file

@ -82,6 +82,16 @@ class SetClass(list):
"""Returns the brightness of the set class, defined as the sum of the pitch class values."""
return sum(self.pitch_classes)
@cache_property
def decimal(self) -> int:
"""
Returns the decimal value of the pitch classes expressed as a binary bit mask, i.e. the sum
of 2 where i is each pitch class value. For example, {0,1,4,6} has a binary value of
000001010011, which is the decimal value 83.
Goyette (2012) p. 25, citing Brinkman (1986).
"""
return sum([2**i for i in self.pitch_classes])
@cache_property
def adjacency_intervals(self) -> list(int):
"""Adjacency intervals between the pitch classes, used for Leonard notation subscripts."""

View file

@ -86,6 +86,11 @@ def test_brightness():
assert f520.brightness == 20
def test_decimal():
"Set classes have a unique decimal number (sum of 2 raised to each normalised pitch class value)"
assert f520.decimal == 355
def test_pitch_classes():
"Set classes have pitch classes"
assert len(f520) == 5
@ -153,6 +158,10 @@ def test_complement_brightness():
assert f520.complement.brightness == 32
def test_complement_decimal():
assert f520.complement.decimal == 935
def test_complement_pitch_classes():
assert len(f520.complement) == 7
assert len(f520.complement.pitch_classes) == 7