def test_secondary_chord(self): print('----- test_secondary_tonality -----') diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicTone("C")) chort_t_i = TertianChordTemplate.parse('tI') chord_i = chort_t_i.create_chord(diatonic_tonality) chord_v_ii = SecondaryChordTemplate.parse('V/ii').create_chord( diatonic_tonality) chord_vi_v = SecondaryChordTemplate.parse('vi/V').create_chord( diatonic_tonality) chord_t_ii = TertianChordTemplate.parse('tii') chord_ii = chord_t_ii.create_chord(diatonic_tonality) hc_track = HarmonicContextTrack() hc_track.append( HarmonicContext(diatonic_tonality, chord_i, Duration(1))) hc_track.append( HarmonicContext(diatonic_tonality, chord_v_ii, Duration(1))) hc_track.append( HarmonicContext(diatonic_tonality, chord_vi_v, Duration(1))) hc_track.append( HarmonicContext(diatonic_tonality, chord_ii, Duration(1))) TestTFlip.print_hct(hc_track) tune = [('C:5', (1, 1)), ('E:5', (1, 1)), ('E:5', (1, 1)), ('G:5', (1, 1))] line = TestTFlip.build_line(tune) cue = DiatonicPitch(5, 'd') tflip = TDiatonicReflection(line, hc_track, cue) temporal_extent = Interval(Fraction(0), Fraction(4)) score_line, score_hct = tflip.apply(temporal_extent, cue) TestTFlip.print_notes(score_line) TestTFlip.print_hct(score_hct) notes = score_line.get_all_notes() assert len(notes) == 4 assert str(notes[0].diatonic_pitch) == 'E:5' assert str(notes[1].diatonic_pitch) == 'C#:5' assert str(notes[2].diatonic_pitch) == 'C:5' assert str(notes[3].diatonic_pitch) == 'A:4' hc_list = score_hct.hc_list() assert len(hc_list) == 4 assert hc_list[1].chord.primary_chord.chord_template.scale_degree == 7 assert {t[0].diatonic_symbol for t in hc_list[1].chord.tones} == {'C#', 'E', 'G'} assert hc_list[1].chord.primary_chord.chord_template.inversion == 3 assert hc_list[2].chord.primary_chord.chord_template.scale_degree == 7 assert {t[0].diatonic_symbol for t in hc_list[2].chord.tones} == {'C', 'F#', 'A'} assert hc_list[2].chord.primary_chord.chord_template.inversion == 3
def test_standards(self): diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicTone("G")) template = SecondaryChordTemplate.parse('V/ii') print(template) t_chord = template.create_chord(diatonic_tonality) print(t_chord) s = ', '.join(str(tone[0].diatonic_symbol) for tone in t_chord.tones) print(s) assert s == 'E, G#, B' template = SecondaryChordTemplate.parse('V/IV') print(template) t_chord = template.create_chord(diatonic_tonality) print(t_chord) s = ', '.join(str(tone[0].diatonic_symbol) for tone in t_chord.tones) print(s) assert s == 'G, B, D' diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicTone("G")) template = SecondaryChordTemplate.parse('V/ii') print(template) t_chord = template.create_chord(diatonic_tonality) print(t_chord) s = ', '.join(str(tone[0].diatonic_symbol) for tone in t_chord.tones) print(s) assert s == 'E, G#, B' diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicTone("Bb")) template = SecondaryChordTemplate.parse('VI/ii') print(template) t_chord = template.create_chord(diatonic_tonality) print(t_chord) s = ', '.join(str(tone[0].diatonic_symbol) for tone in t_chord.tones) print(s) assert s == 'A, C, Eb'
def test_interesting(self): diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicTone("F")) template = SecondaryChordTemplate.parse('V/V[NaturalMinor]') print(template) t_chord = template.create_chord(diatonic_tonality) print(t_chord) s = ', '.join(str(tone[0].diatonic_symbol) for tone in t_chord.tones) print(s) assert s == 'G, Bb, D'
def test_sample(self): diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicTone("C")) template = SecondaryChordTemplate.parse('qVIPPaa/iv[Major]') print(template) t_chord = template.create_chord(diatonic_tonality) print(t_chord) s = ', '.join(str(tone[0].diatonic_symbol) for tone in t_chord.tones) print(s) assert s == 'D, G, C, F#, B#' template = SecondaryChordTemplate.parse('qIIIPPaa/V[MelodicMinor]') print(template) t_chord = template.create_chord(diatonic_tonality) print(t_chord) s = ', '.join(str(tone[0].diatonic_symbol) for tone in t_chord.tones) print(s) assert s == 'Bb, Eb, Ab, D, G#'
def test_book_examples(self): diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicTone("A")) template = SecondaryChordTemplate.parse('V/V') if template: print('succeeded') chord = template.create_chord(diatonic_tonality) print(chord) else: print("failed") template = SecondaryChordTemplate.parse('III/II') chord = template.create_chord(diatonic_tonality) print(chord) template = SecondaryChordTemplate.parse('CMaj7/II') chord = template.create_chord(diatonic_tonality) print(chord) template = SecondaryChordTemplate.parse('V/V[NaturalMinor]') chord = template.create_chord(diatonic_tonality) print(chord) template = SecondaryChordTemplate.parse('V/V[Phrygian]') chord = template.create_chord(diatonic_tonality) print(chord) template = SecondaryChordTemplate.parse('QVIPPAP@2/V') chord = template.create_chord(diatonic_tonality) print(chord)
def test_secondary_chord(self): print('----- test_secondary_tonality -----') diatonic_tonality = Tonality.create(ModalityType.Major, DiatonicFoundation.get_tone("C")) chort_t_i = TertianChordTemplate.parse('tI') chord_i = chort_t_i.create_chord(diatonic_tonality) chord_v_ii = SecondaryChordTemplate.parse('V/ii').create_chord( diatonic_tonality) chord_vi_v = SecondaryChordTemplate.parse('vi/V').create_chord( diatonic_tonality) chord_t_ii = TertianChordTemplate.parse('tii') chord_ii = chord_t_ii.create_chord(diatonic_tonality) hc_track = HarmonicContextTrack() hc_track.append( HarmonicContext(diatonic_tonality, chord_i, Duration(1))) hc_track.append( HarmonicContext(diatonic_tonality, chord_v_ii, Duration(1))) hc_track.append( HarmonicContext(diatonic_tonality, chord_vi_v, Duration(1))) hc_track.append( HarmonicContext(diatonic_tonality, chord_ii, Duration(1))) TestTChromaticFlip.print_hct(hc_track) tune = [('C:5', (1, 1)), ('E:5', (1, 1)), ('E:5', (1, 1)), ('G:5', (1, 1))] line = TestTChromaticFlip.build_line(tune) cue = DiatonicPitch(5, 'd') tflip = TChromaticReflection(line, hc_track, cue) score_line, score_hct = tflip.apply() TestTChromaticFlip.print_notes(score_line) TestTChromaticFlip.print_hct(score_hct)
def generic_chord_template_parse(chord_txt): """ Generic text parse into chord template. Args: chord_txt: String Returns: ChordTemplate or None if fails. """ # Try parsing chord text through known chord templates. # If all fail, just return None. from harmonicmodel.secondary_chord_template import SecondaryChordTemplate, SecondaryChordException try: chord_template = SecondaryChordTemplate.parse(chord_txt) return chord_template except SecondaryChordException: pass from harmonicmodel.tertian_chord_template import TertianChordTemplate, TertianChordException try: chord_template = TertianChordTemplate.parse(chord_txt) return chord_template except TertianChordException: pass from harmonicmodel.secundal_chord_template import SecundalChordTemplate, SecundalChordException try: chord_template = SecundalChordTemplate.parse(chord_txt) return chord_template except SecundalChordException: pass from harmonicmodel.quartal_chord_template import QuartalChordTemplate try: chord_template = QuartalChordTemplate.parse(chord_txt) return chord_template except QuartalChordTemplate: return None