def test_define_using_intervals(self): a = PCGroup.from_intervals('D', '1 2 b3 4 5 6 b7') self.assertEqual(a.pcs, [2, 4, 5, 7, 9, 11, 0]) self.assertEqual(a.midis, [62, 64, 65, 67, 69, 71, 72]) b = PCGroup.from_intervals('D6', '1 2 b3 4 5 6 b7') self.assertEqual(b.midis, [86, 88, 89, 91, 93, 95, 96]) a = PCGroup.from_intervals('C', '1 3 5') print(str(a))
def test_nth_rotation(self): a = PCGroup.from_intervals('C', '1 2 3 4 5 6 7') b = a.nth_rotation(3) self.assertEqual(a.pcs, [0, 2, 4, 5, 7, 9, 11]) self.assertEqual(b.pcs, [5, 7, 9, 11, 0, 2, 4]) self.assertEqual(a.midis, [60, 62, 64, 65, 67, 69, 71]) self.assertEqual(b.midis, [65, 67, 69, 71, 72, 74, 76])
def test_getitem( self ): # demonstrating generation of continuous pitches using indexing a = PCGroup.from_intervals('C', '1 2 3 4 5 6 7') this_oct = a[0] higher_oct = a[7] lower_oct = a[-7] self.assertEqual(this_oct.oct, 0) self.assertEqual(higher_oct.oct, 1) self.assertEqual(lower_oct.oct, -1) with self.assertRaises(MidiNoteError): note = a[-36] with self.assertRaises(MidiNoteError): note = a[40]
def test_logical_and_operations(self): a = PCGroup.from_names('C E G B') b = PCGroup.from_names('D F G') aandb = a & b aorb = a | b axorb = a ^ b ainv = ~aorb self.assertEqual(aandb, PCGroup.from_names('G')) self.assertEqual(aorb, PCGroup.from_names('C D E F G B')) self.assertEqual(axorb, PCGroup.from_names('C D E F B')) self.assertEqual(ainv, PCGroup.from_names('C# D# F# G# A A#'))
def test_root_get_and_set(self): a = PCGroup.from_intervals('D', '1 2 b3 4 5 6 b7') self.assertEqual(a.root, 'D') a.root = PC('E') # this is same as a transpose operation self.assertEqual(a.pcs, [4, 6, 7, 9, 11, 1, 2])
def test_define_from_midi_notevals(self): # Todo: test from list, numpy and MidiTable a = PCGroup.from_midi([60, 62, 64, 65, 67, 69, 71]) b = PCGroup.from_names('C D E F G A B') self.assertEqual(a, b)
def test_define_using_notenames(self): a = PCGroup.from_names('C D E F# G A B') self.assertEqual(a.notes, [0, 2, 4, 6, 7, 9, 11])
def test_set_behaviour(self): a = PCGroup.from_names('C5 E G C4 C6')
def test_intervals(self): a = PCGroup.from_names('G A B C D E F#') self.assertEqual(a.intervals(), [0, 2, 4, 5, 7, 9, 11]) # self.assertEqual(str(a), 'G A B C D E F#') self.assertEqual(a.intervals(PC('C#')), [6, 8, 10, 11, 1, 3, 5])
def test_get_by_slicing(self): a = PCGroup.from_names('C D E F') b = a[1:7] self.assertEqual(a.midis, [60, 62, 64, 65]) self.assertEqual(b.midis, [62, 64, 65, 72, 74, 76])
def test_get_idx_by_pc(self): a = PCGroup.from_intervals('C', '1 2 3 4 5 6 7') idxs = range(-7, 14) [self.assertEqual(i, a.get_idx_by_pc(a[i])) for i in idxs] with self.assertRaises(PitchGroupError): a.get_idx_by_pc(PC('D#'))
def test_iteration(self): a = PCGroup.from_names('C E G') notes = [PC('C'), PC('E'), PC('G')] [self.assertEqual(note, target) for note, target in zip(a, notes)]