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
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)
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)
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)
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)
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
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
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
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
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
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
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'
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'
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'
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'
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)
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
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)
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)
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)
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)
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)
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
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
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
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)
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'
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