Ejemplo n.º 1
0
 def _initialize_by_symbolic_string(self, symbolic_string):
     from abjad.tools import tonalanalysistools
     groups = self._symbolic_string_regex.match(symbolic_string).groups()
     start, stop = groups
     start = tonalanalysistools.ScaleDegree(start)
     stop = tonalanalysistools.ScaleDegree(stop)
     return start, stop
Ejemplo n.º 2
0
def test_tonalanalysistools_ScaleDegree_apply_accidental_01():

    degree = tonalanalysistools.ScaleDegree('flat', 2)
    assert degree.apply_accidental('sharp') == tonalanalysistools.ScaleDegree(
        2)
    assert degree.apply_accidental('ss') == tonalanalysistools.ScaleDegree(
        'sharp', 2)
Ejemplo n.º 3
0
def test_tonalanalysistools_RomanNumeral_suspension_01():

    roman_numeral = tonalanalysistools.RomanNumeral(5, 'major', 5, 0, (4, 3))

    assert roman_numeral.suspension == tonalanalysistools.ChordSuspension(4, 3)
    assert roman_numeral.suspension.start == tonalanalysistools.ScaleDegree(4)
    assert roman_numeral.suspension.stop == tonalanalysistools.ScaleDegree(3)
Ejemplo n.º 4
0
def test_tonalanalysistools_ScaleDegree__initialize_by_scale_degree_01():

    degree = tonalanalysistools.ScaleDegree('flat', 2)
    new = tonalanalysistools.ScaleDegree(degree)

    assert new is not degree
    assert new.accidental == pitchtools.Accidental('flat')
    assert new.number == 2
def test_tonalanalysistools_ChordSuspension__initialize_by_symbolic_string_01():

    chord_suspension = tonalanalysistools.ChordSuspension('4-3')
    assert chord_suspension.start == tonalanalysistools.ScaleDegree(4)
    assert chord_suspension.stop == tonalanalysistools.ScaleDegree(3)

    chord_suspension = tonalanalysistools.ChordSuspension('b2-1')
    assert chord_suspension.start == tonalanalysistools.ScaleDegree('flat', 2)
    assert chord_suspension.stop == tonalanalysistools.ScaleDegree(1)
Ejemplo n.º 6
0
def test_tonalanalysistools_RomanNumeral_bass_scale_degree_01():

    roman_numeral = tonalanalysistools.RomanNumeral(5, 'major', 5, 0)
    assert roman_numeral.bass_scale_degree == tonalanalysistools.ScaleDegree(5)

    roman_numeral = tonalanalysistools.RomanNumeral(5, 'major', 5, 1)
    assert roman_numeral.bass_scale_degree == tonalanalysistools.ScaleDegree(7)

    roman_numeral = tonalanalysistools.RomanNumeral(5, 'major', 5, 2)
    assert roman_numeral.bass_scale_degree == tonalanalysistools.ScaleDegree(2)
Ejemplo n.º 7
0
 def _initialize_by_symbolic_string(self, symbolic_string):
     from abjad.tools import tonalanalysistools
     groups = self._symbolic_string_regex.match(symbolic_string).groups()
     accidental, roman_numeral, quality, figured_bass = groups
     scale_degree = tonalanalysistools.ScaleDegree(accidental +
                                                   roman_numeral)
     figured_bass_parts = figured_bass.split('/')
     naive_figured_bass = [x for x in figured_bass_parts if not '-' in x]
     naive_figured_bass = '/'.join(naive_figured_bass)
     extent = self._figured_bass_string_to_extent[naive_figured_bass]
     extent = tonalanalysistools.ChordExtent(extent)
     uppercase = roman_numeral == roman_numeral.upper()
     quality = self._get_quality_name(uppercase, quality, extent.number)
     quality = tonalanalysistools.ChordQuality(quality)
     inversion = self._figured_bass_string_to_inversion[naive_figured_bass]
     inversion = tonalanalysistools.ChordInversion(inversion)
     suspension = [x for x in figured_bass_parts if '-' in x]
     if not suspension:
         suspension = tonalanalysistools.ChordSuspension()
     elif 1 < len(suspension):
         message = 'no multiple suspensions yet.'
         raise NotImplementedError(message)
     else:
         suspension = tonalanalysistools.ChordSuspension(suspension[0])
     return scale_degree, quality, extent, inversion, suspension
Ejemplo n.º 8
0
    def voice_scale_degrees_in_open_position(self, scale_degrees):
        r'''Voice `scale_degrees` in open position:

        ::

            >>> scale = tonalanalysistools.Scale('c', 'major')
            >>> scale_degrees = [1, 3, ('flat', 5), 7, ('sharp', 9)]
            >>> pitches = scale.voice_scale_degrees_in_open_position(
            ...     scale_degrees)
            >>> pitches
            PitchSegment(["c'", "e'", "gf'", "b'", "ds''"])

        Return pitch segment.
        '''
        from abjad.tools import pitchtools
        from abjad.tools import tonalanalysistools
        scale_degrees = [
            tonalanalysistools.ScaleDegree(x) for x in scale_degrees
        ]
        pitch_classes = [
            self.scale_degree_to_named_pitch_class(x) for x in scale_degrees
        ]
        pitches = [pitchtools.NamedPitch(pitch_classes[0])]
        for pitch_class in pitch_classes[1:]:
            pitch = pitchtools.NamedPitch(pitch_class)
            while pitch < pitches[-1]:
                pitch += 12
            pitches.append(pitch)
        pitches = pitchtools.PitchSegment(pitches)
        return pitches
Ejemplo n.º 9
0
 def __init__(self, symbol='V7'):
     from abjad.tools import tonalanalysistools
     groups = self._symbol_regex.match(symbol).groups()
     accidental, roman_numeral, quality, figured_bass = groups
     scale_degree = accidental + roman_numeral
     scale_degree = tonalanalysistools.ScaleDegree(scale_degree)
     figured_bass_parts = figured_bass.split('/')
     naive_figured_bass = [x for x in figured_bass_parts if '-' not in x]
     naive_figured_bass = '/'.join(naive_figured_bass)
     extent = self._figured_bass_string_to_extent[naive_figured_bass]
     extent = tonalanalysistools.ChordExtent(extent)
     uppercase = roman_numeral == roman_numeral.upper()
     quality = self._get_quality_name(uppercase, quality, extent.number)
     quality = tonalanalysistools.ChordQuality(quality)
     inversion = self._figured_bass_string_to_inversion[naive_figured_bass]
     inversion = tonalanalysistools.ChordInversion(inversion)
     suspension = [x for x in figured_bass_parts if '-' in x]
     if not suspension:
         suspension = None
     elif 1 < len(suspension):
         message = 'no multiple suspensions yet.'
         raise NotImplementedError(message)
     else:
         suspension = tonalanalysistools.ChordSuspension(suspension[0])
     self._root_scale_degree = scale_degree
     self._quality = quality
     self._extent = extent
     self._inversion = inversion
     if suspension is not None and suspension.start is None:
         suspension = None
     self._suspension = suspension
Ejemplo n.º 10
0
    def voice_scale_degrees_in_open_position(self, scale_degrees):
        r'''Voices `scale_degrees` in open position.

        ..  container:: example

            >>> scale = abjad.tonalanalysistools.Scale(('c', 'major'))
            >>> scale_degrees = [1, 3, 'b5', 7, '#9']
            >>> segment = scale.voice_scale_degrees_in_open_position(
            ...     scale_degrees)
            >>> segment
            PitchSegment("c' e' gf' b' ds''")

        Return pitch segment.
        '''
        import abjad
        from abjad.tools import tonalanalysistools
        scale_degrees = [
            tonalanalysistools.ScaleDegree(x) for x in scale_degrees
        ]
        pitch_classes = [
            self.scale_degree_to_named_pitch_class(x) for x in scale_degrees
        ]
        pitches = [abjad.NamedPitch(pitch_classes[0])]
        for pitch_class in pitch_classes[1:]:
            pitch = abjad.NamedPitch(pitch_class)
            while pitch < pitches[-1]:
                pitch += 12
            pitches.append(pitch)
        pitches = abjad.PitchSegment(pitches)
        return pitches
Ejemplo n.º 11
0
def test_tonalanalysistools_ScaleDegree___eq___01():

    scale_degree = tonalanalysistools.ScaleDegree(2)
    u = tonalanalysistools.ScaleDegree(2)
    voice = tonalanalysistools.ScaleDegree(3)

    assert scale_degree == scale_degree
    assert scale_degree == u
    assert not scale_degree == voice

    assert u == scale_degree
    assert u == u
    assert not u == voice

    assert not voice == scale_degree
    assert not voice == u
    assert voice == voice
Ejemplo n.º 12
0
 def _initialize_by_scale_degree_quality_extent_and_inversion(self, *args):
     from abjad.tools import tonalanalysistools
     scale_degree, quality, extent, inversion = args
     scale_degree = tonalanalysistools.ScaleDegree(scale_degree)
     quality = tonalanalysistools.ChordQuality(quality)
     extent = tonalanalysistools.ChordExtent(extent)
     inversion = tonalanalysistools.ChordInversion(inversion)
     suspension = tonalanalysistools.ChordSuspension()
     return scale_degree, quality, extent, inversion, suspension
Ejemplo n.º 13
0
def test_tonalanalysistools_ScaleDegree_symbolic_string_01():

    assert tonalanalysistools.ScaleDegree(1).symbolic_string == 'I'
    assert tonalanalysistools.ScaleDegree('flat', 2).symbolic_string == 'bII'
    assert tonalanalysistools.ScaleDegree(3).symbolic_string == 'III'
    assert tonalanalysistools.ScaleDegree('sharp', 4).symbolic_string == '#IV'
    assert tonalanalysistools.ScaleDegree(5).symbolic_string == 'V'
    assert tonalanalysistools.ScaleDegree('flat', 6).symbolic_string == 'bVI'
    assert tonalanalysistools.ScaleDegree('flat', 7).symbolic_string == 'bVII'
Ejemplo n.º 14
0
def test_tonalanalysistools_ScaleDegree_name_01():

    assert tonalanalysistools.ScaleDegree(1).name == 'tonic'
    assert tonalanalysistools.ScaleDegree(2).name == 'superdominant'
    assert tonalanalysistools.ScaleDegree(3).name == 'mediant'
    assert tonalanalysistools.ScaleDegree(4).name == 'subdominant'
    assert tonalanalysistools.ScaleDegree(5).name == 'dominant'
    assert tonalanalysistools.ScaleDegree(6).name == 'submediant'
    assert tonalanalysistools.ScaleDegree(7).name == 'leading tone'
Ejemplo n.º 15
0
def test_tonalanalysistools_ScaleDegree_roman_numeral_string_01():

    assert tonalanalysistools.ScaleDegree(1).roman_numeral_string == 'I'
    assert tonalanalysistools.ScaleDegree(2).roman_numeral_string == 'II'
    assert tonalanalysistools.ScaleDegree(3).roman_numeral_string == 'III'
    assert tonalanalysistools.ScaleDegree(4).roman_numeral_string == 'IV'
    assert tonalanalysistools.ScaleDegree(5).roman_numeral_string == 'V'
    assert tonalanalysistools.ScaleDegree(6).roman_numeral_string == 'VI'
    assert tonalanalysistools.ScaleDegree(7).roman_numeral_string == 'VII'
Ejemplo n.º 16
0
def test_tonalanalysistools_ScaleDegree_title_string_01():

    assert tonalanalysistools.ScaleDegree(1).title_string == 'One'
    assert tonalanalysistools.ScaleDegree(2).title_string == 'Two'
    assert tonalanalysistools.ScaleDegree(3).title_string == 'Three'
    assert tonalanalysistools.ScaleDegree(4).title_string == 'Four'
    assert tonalanalysistools.ScaleDegree(5).title_string == 'Five'
    assert tonalanalysistools.ScaleDegree(6).title_string == 'Six'
    assert tonalanalysistools.ScaleDegree(7).title_string == 'Seven'
Ejemplo n.º 17
0
def test_tonalanalysistools_ScaleDegree__initialize_by_symbolic_string_01():

    scale_degree = tonalanalysistools.ScaleDegree('I')
    assert scale_degree == tonalanalysistools.ScaleDegree(1)

    scale_degree = tonalanalysistools.ScaleDegree('i')
    assert scale_degree == tonalanalysistools.ScaleDegree(1)

    scale_degree = tonalanalysistools.ScaleDegree('bII')
    assert scale_degree == tonalanalysistools.ScaleDegree('flat', 2)

    scale_degree = tonalanalysistools.ScaleDegree('bii')
    assert scale_degree == tonalanalysistools.ScaleDegree('flat', 2)
Ejemplo n.º 18
0
    def bass_scale_degree(self):
        r'''Base scale degree of roman numeral.

        Returns scale degree.
        '''
        from abjad.tools import tonalanalysistools
        root_scale_degree = self.root_scale_degree.number
        bass_scale_degree = root_scale_degree - 1
        bass_scale_degree += 2 * self.inversion.number
        bass_scale_degree %= 7
        bass_scale_degree += 1
        bass_scale_degree = tonalanalysistools.ScaleDegree(bass_scale_degree)
        return bass_scale_degree
Ejemplo n.º 19
0
def test_tonalanalysistools_ScaleDegree__initialize_by_symbolic_string_02():

    scale_degree = tonalanalysistools.ScaleDegree('1')
    assert scale_degree == tonalanalysistools.ScaleDegree(1)

    scale_degree = tonalanalysistools.ScaleDegree('b2')
    assert scale_degree == tonalanalysistools.ScaleDegree('flat', 2)

    scale_degree = tonalanalysistools.ScaleDegree('#4')
    assert scale_degree == tonalanalysistools.ScaleDegree('sharp', 4)
Ejemplo n.º 20
0
    def named_pitch_class_to_scale_degree(self, *args):
        r'''Changes named pitch-class to scale degree.

        Returns scale degree.
        '''
        from abjad.tools import tonalanalysistools
        foreign_pitch_class = pitchtools.NamedPitchClass(*args)
        letter = foreign_pitch_class.diatonic_pitch_class_name
        for i, pc in enumerate(self):
            if pc.diatonic_pitch_class_name == letter:
                native_pitch_class = pc
                scale_degree_index = i
                scale_degree_number = scale_degree_index + 1
                break
        native_pitch = pitchtools.NamedPitch(native_pitch_class, 4)
        foreign_pitch = pitchtools.NamedPitch(foreign_pitch_class, 4)
        accidental = foreign_pitch.accidental - native_pitch.accidental
        return tonalanalysistools.ScaleDegree(accidental, scale_degree_number)
Ejemplo n.º 21
0
def test_tonalanalysistools_Scale_named_pitch_class_to_scale_degree_01():

    scale = tonalanalysistools.Scale('c', 'major')

    assert scale.named_pitch_class_to_scale_degree('c') == \
        tonalanalysistools.ScaleDegree(1)
    assert scale.named_pitch_class_to_scale_degree('d') == \
        tonalanalysistools.ScaleDegree(2)
    assert scale.named_pitch_class_to_scale_degree('e') == \
        tonalanalysistools.ScaleDegree(3)
    assert scale.named_pitch_class_to_scale_degree('f') == \
        tonalanalysistools.ScaleDegree(4)
    assert scale.named_pitch_class_to_scale_degree('g') == \
        tonalanalysistools.ScaleDegree(5)
    assert scale.named_pitch_class_to_scale_degree('a') == \
        tonalanalysistools.ScaleDegree(6)
    assert scale.named_pitch_class_to_scale_degree('b') == \
        tonalanalysistools.ScaleDegree(7)
Ejemplo n.º 22
0
def test_tonalanalysistools_Scale_named_pitch_class_to_scale_degree_03():

    scale = tonalanalysistools.Scale('c', 'major')

    assert scale.named_pitch_class_to_scale_degree('cs') == \
        tonalanalysistools.ScaleDegree('sharp', 1)
    assert scale.named_pitch_class_to_scale_degree('ds') == \
        tonalanalysistools.ScaleDegree('sharp', 2)
    assert scale.named_pitch_class_to_scale_degree('es') == \
        tonalanalysistools.ScaleDegree('sharp', 3)
    assert scale.named_pitch_class_to_scale_degree('fs') == \
        tonalanalysistools.ScaleDegree('sharp', 4)
    assert scale.named_pitch_class_to_scale_degree('gs') == \
        tonalanalysistools.ScaleDegree('sharp', 5)
    assert scale.named_pitch_class_to_scale_degree('as') == \
        tonalanalysistools.ScaleDegree('sharp', 6)
    assert scale.named_pitch_class_to_scale_degree('bs') == \
        tonalanalysistools.ScaleDegree('sharp', 7)
Ejemplo n.º 23
0
def test_tonalanalysistools_Scale_named_pitch_class_to_scale_degree_02():

    scale = tonalanalysistools.Scale('c', 'major')

    assert scale.named_pitch_class_to_scale_degree('cf') == \
        tonalanalysistools.ScaleDegree('flat', 1)
    assert scale.named_pitch_class_to_scale_degree('df') == \
        tonalanalysistools.ScaleDegree('flat', 2)
    assert scale.named_pitch_class_to_scale_degree('ef') == \
        tonalanalysistools.ScaleDegree('flat', 3)
    assert scale.named_pitch_class_to_scale_degree('ff') == \
        tonalanalysistools.ScaleDegree('flat', 4)
    assert scale.named_pitch_class_to_scale_degree('gf') == \
        tonalanalysistools.ScaleDegree('flat', 5)
    assert scale.named_pitch_class_to_scale_degree('af') == \
        tonalanalysistools.ScaleDegree('flat', 6)
    assert scale.named_pitch_class_to_scale_degree('bf') == \
        tonalanalysistools.ScaleDegree('flat', 7)
Ejemplo n.º 24
0
    def bass_scale_degree(self):
        r'''Gets bass scale degree.

        ..  container:: example

            >>> abjad.tonalanalysistools.RomanNumeral('bII6/4').bass_scale_degree
            ScaleDegree('6')

            >>> abjad.tonalanalysistools.RomanNumeral('V7').bass_scale_degree
            ScaleDegree('5')

        Returns scale degree.
        '''
        from abjad.tools import tonalanalysistools
        root_scale_degree = self.root_scale_degree.number
        bass_scale_degree = root_scale_degree - 1
        bass_scale_degree += 2 * self.inversion.number
        bass_scale_degree %= 7
        bass_scale_degree += 1
        bass_scale_degree = tonalanalysistools.ScaleDegree(bass_scale_degree)
        return bass_scale_degree
Ejemplo n.º 25
0
    def from_scale_degree_quality_extent_and_inversion(
        scale_degree,
        quality,
        extent,
        inversion,
    ):
        r'''Makes Roman numeral from `scale_degree`, `quality`, `extent` and
        `inversion`.

        Returns new Roman numeral.
        '''
        from abjad.tools import tonalanalysistools
        scale_degree = tonalanalysistools.ScaleDegree(scale_degree)
        quality = tonalanalysistools.ChordQuality(quality)
        extent = tonalanalysistools.ChordExtent(extent)
        inversion = tonalanalysistools.ChordInversion(inversion)
        roman_numeral = RomanNumeral()
        roman_numeral._root_scale_degree = scale_degree
        roman_numeral._quality = quality
        roman_numeral._extent = extent
        roman_numeral._inversion = inversion
        return roman_numeral
Ejemplo n.º 26
0
    def scale_degree_to_named_pitch_class(self, *args):
        r'''Changes scale degree to named pitch-class.

        ::

            >>> scale = tonalanalysistools.Scale('c', 'major')
            >>> scale_degree = tonalanalysistools.ScaleDegree('flat', 5)
            >>> scale.scale_degree_to_named_pitch_class(scale_degree)
            NamedPitchClass('gf')

        ::

            >>> scale_degree = tonalanalysistools.ScaleDegree('flat', 9)
            >>> scale.scale_degree_to_named_pitch_class(scale_degree)
            NamedPitchClass('df')

        Returns named pitch-class.
        '''
        from abjad.tools import tonalanalysistools
        scale_degree = tonalanalysistools.ScaleDegree(*args)
        scale_index = (scale_degree.number - 1) % 7
        pitch_class = self[scale_index]
        pitch_class = pitch_class.apply_accidental(scale_degree.accidental)
        return pitch_class
Ejemplo n.º 27
0
def test_tonalanalysistools_ScaleDegree_title_string_02():

    assert tonalanalysistools.ScaleDegree('sharp',
                                          4).title_string == 'SharpFour'
    assert tonalanalysistools.ScaleDegree('flat', 6).title_string == 'FlatSix'
def test_tonalanalysistools_ChordSuspension__initialize_by_pair_01():

    chord_suspension = tonalanalysistools.ChordSuspension((4, 3))

    assert chord_suspension.start == tonalanalysistools.ScaleDegree(4)
    assert chord_suspension.stop == tonalanalysistools.ScaleDegree(3)
Ejemplo n.º 29
0
def test_tonalanalysistools_ScaleDegree___str___01():

    assert str(tonalanalysistools.ScaleDegree(1)) == '1'
    assert str(tonalanalysistools.ScaleDegree('flat', 2)) == 'b2'
    assert str(tonalanalysistools.ScaleDegree('sharp', 4)) == '#4'
Ejemplo n.º 30
0
def test_tonalanalysistools_ScaleDegree__initialize_by_accidental_and_number_01(
):

    degree = tonalanalysistools.ScaleDegree('flat', 2)
    assert degree.accidental == pitchtools.Accidental('flat')
    assert degree.number == 2