def test_book_examples(self): # Interval Creation interval = Interval(5, IntervalType.Perfect) print(interval) interval = Interval.parse("m:10") print(interval) interval = Interval.create_interval(DiatonicPitch.parse("a:3"), DiatonicPitch.parse("f#:4")) print(interval) # Interval Addition/Subtraction i1 = Interval(5, IntervalType.Perfect) i2 = Interval.parse("M:3") interval = i1 + i2 print(interval) interval = i1 - i2 print(interval) interval += i2 print(interval) interval -= i2 print(interval) # compute end and start interval = Interval(5, IntervalType.Perfect) pitch = interval.get_end_pitch(DiatonicPitch.parse("F#:5")) print(pitch) pitch = interval.get_start_pitch(DiatonicPitch.parse("C:5")) print(pitch)
def test_lower_pitch(self): pitch = DiatonicPitch(4, 'C') for i in range(1, 13): for interval_type in TestInterval.INTERVAL_TYPES: if i == 1 and interval_type == IntervalType(IntervalType.Diminished): continue if i == 1 or i == 4 or i == 5 or i == 8 or i == 11 or i == 12: if interval_type == IntervalType(IntervalType.Minor) or \ interval_type == IntervalType(IntervalType.Major): continue else: if interval_type == IntervalType(IntervalType.Perfect): continue try: interval = Interval(i, interval_type) p = interval.get_start_pitch(pitch) except Exception: e = sys.exc_info()[0] print('exception {0} for interval i={1} interval={2} pitch={3}'.format(e, i, interval_type, pitch)) raise Exception('exception {0} for creating interval i={1} type={2} pitch={3}'.format(e, i, interval_type, pitch)) print(p) assert p.diatonic_distance() == 4 * 7 + 0 - (i - 1)
def test_create_interval(self): pitch_a = DiatonicPitch(4, 'C') pitch_b = DiatonicPitch(5, 'C') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Perfect) assert interval.diatonic_distance == 7 pitch_a = DiatonicPitch(4, 'C') pitch_b = DiatonicPitch(5, 'Cb') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Diminished) assert interval.diatonic_distance == 7 pitch_a = DiatonicPitch(4, 'C') pitch_b = DiatonicPitch(5, 'Dbb') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Diminished) assert interval.diatonic_distance == 8 pitch_a = DiatonicPitch(4, 'C') pitch_b = DiatonicPitch(5, 'Cb') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Diminished) assert interval.diatonic_distance == 7 pitch_a = DiatonicPitch(4, 'C') pitch_b = DiatonicPitch(4, 'B#') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Augmented) assert interval.diatonic_distance == 6 assert not interval.is_negative() pitch_a = DiatonicPitch(5, 'C') pitch_b = DiatonicPitch(4, 'Bb') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Major) assert interval.diatonic_distance == -1 assert interval.is_negative() interval = Interval(9, IntervalType(IntervalType.Diminished)) print(interval) assert interval.interval_type == IntervalType(IntervalType.Diminished) assert interval.diatonic_distance == 8 interval = Interval(3, IntervalType(IntervalType.Minor)) pitch = interval.get_start_pitch(DiatonicPitch(4, 'E')) print(pitch) assert str(pitch) == 'C#:4'
def test_negative_intervals(self): interval = Interval(-3, IntervalType.Major) assert interval.diatonic_distance == -2 assert interval.chromatic_distance == -4 assert str(interval) == '-M:3' print(interval) interval = Interval.parse('-P:5') assert interval.diatonic_distance == -4 assert interval.chromatic_distance == -7 assert str(interval) == '-P:5' print(interval) pitch_a = DiatonicPitch(5, 'C') pitch_b = DiatonicPitch(4, 'C') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Perfect) assert interval.diatonic_distance == -7 pitch_a = DiatonicPitch(5, 'C') pitch_b = DiatonicPitch(4, 'Cb') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Augmented) assert interval.diatonic_distance == -7 assert str(interval) == '-A:8' pitch_a = DiatonicPitch(5, 'C') pitch_b = DiatonicPitch(4, 'C#') interval = Interval.create_interval(pitch_a, pitch_b) print(interval) assert interval.interval_type == IntervalType(IntervalType.Diminished) assert interval.diatonic_distance == -7 assert str(interval) == '-d:8' pitch_a = DiatonicPitch(5, 'C') lower_pitches = [DiatonicPitch(4, i) for i in list('CDEFGAB')] answers = ['-P:8', '-m:7', '-m:6', '-P:5', '-P:4', '-m:3', '-m:2'] for (p, a) in zip(lower_pitches, answers): interval = Interval.create_interval(pitch_a, p) assert str(interval) == a lower_pitches = [DiatonicPitch(4, i) for i in 'Cb,Db,Eb,Fb,Gb,Ab,Bb'.split(',')] answers = ['-A:8', '-M:7', '-M:6', '-A:5', '-A:4', '-M:3', '-M:2'] for (p, a) in zip(lower_pitches, answers): interval = Interval.create_interval(pitch_a, p) assert str(interval) == a lower_pitches = [DiatonicPitch(4, i) for i in 'C#,D#,E#,F#,G#,A#,B#'.split(',')] answers = ['-d:8', '-d:7', '-d:6', '-d:5', '-d:4', '-d:3', '-d:2'] for (p, a) in zip(lower_pitches, answers): interval = Interval.create_interval(pitch_a, p) assert str(interval) == a interval = Interval.parse('-M:3') p = DiatonicPitch(4, 'Ab') end_p = interval.get_end_pitch(p) print(end_p) assert str(end_p) == 'Fb:4' interval = Interval.parse('-P:5') p = DiatonicPitch(4, 'D') end_p = interval.get_end_pitch(p) print(end_p) assert str(end_p) == 'G:3' interval_strs = ['-P:1', '-M:2', '-M:3', '-P:4', '-P:5', '-M:6', '-M:7', '-P:8', '-M:9', '-M:10', '-P:11', '-P:12', '-M:13', '-M:14', '-P:15'] intervals = [Interval.parse(i) for i in interval_strs] p = DiatonicPitch(4, 'G') answers = ['G:4', 'F:4', 'Eb:4', 'D:4', 'C:4', 'Bb:3', 'Ab:3', 'G:3', 'F:3', 'Eb:3', 'D:3', 'C:3', 'Bb:2', 'Ab:2', 'G:2' ] end_ps = [] for interval in intervals: end_p = interval.get_end_pitch(p) print(end_p) end_ps.append(end_p) for end_p, answer in zip(end_ps, answers): assert str(end_p) == answer # Negation tests interval_strs = ['P:1', 'M:2', 'M:3', 'P:4', 'P:5', 'M:6', 'M:7', 'P:8', 'M:9', 'M:10', 'P:11', 'P:12', 'M:13', 'M:14', 'P:15', '-P:1', '-M:2', '-M:3', '-P:4', '-P:5', '-M:6', '-M:7', '-P:8', '-M:9', '-M:10', '-P:11', '-P:12', '-M:13', '-M:14', '-P:15'] intervals = [Interval.parse(i) for i in interval_strs] count = 1 for interval, i_str in zip(intervals, interval_strs): neg_interval = interval.negation() if count <= 15: assert str(neg_interval) == ('-' if count > 1 else '') + i_str else: assert str(neg_interval) == i_str[1:] count += 1 interval_strs = ['-P:1', '-M:2', '-M:3', '-P:4', '-P:5', '-M:6', '-M:7', '-P:8', '-M:9', '-M:10', '-P:11', '-P:12', '-M:13', '-M:14', '-P:15'] intervals = [Interval.parse(i) for i in interval_strs] p = DiatonicPitch(4, 'G') answers = ['G:4', 'A:4', 'B:4', 'C:5', 'D:5', 'E:5', 'F#:5', 'G:5', 'A:5', 'B:5', 'C:6', 'D:6', 'E:6', 'F#:6', 'G:6' ] end_ps = [] print('+++++') for interval in intervals: end_p = interval.get_start_pitch(p) print(end_p) end_ps.append(end_p) print('-----') for end_p, answer in zip(end_ps, answers): assert str(end_p) == answer