Sepearate Generation
This commit is contained in:
@@ -106,33 +106,11 @@ class ElectricVoicingTests(unittest.TestCase):
|
||||
before = copy.deepcopy(target)
|
||||
generator.electric.reuse_voicings(links)
|
||||
self.assertEqual(target, before)
|
||||
def test_real_arrangement_reuses_requested_grips_without_changing_melody(self):
|
||||
def test_arrangement_never_reuses_generated_melody_grips(self):
|
||||
source = generator.musicxml.load_musicxml(pathlib.Path('data/songs/autumn_leaves.xml'))
|
||||
before = copy.deepcopy(source)
|
||||
rhythms = tests.rhythm_fixtures.library()
|
||||
with unittest.mock.patch('generator.electric.reuse_voicings'):
|
||||
independent = generator.arrange.generate.arrange_document(source, 'electric', rhythms=rhythms)
|
||||
result = generator.arrange.generate.arrange_document(source, 'electric', rhythms=rhythms)
|
||||
with unittest.mock.patch('generator.electric.reuse_voicings', side_effect=AssertionError('cross-part grip dependency')) as reuse:
|
||||
result = generator.arrange.generate.arrange_document(source, 'electric', rhythms=tests.rhythm_fixtures.library())
|
||||
generator.model.validate_document(result)
|
||||
reuse.assert_not_called()
|
||||
self.assertEqual(source, before)
|
||||
start, checked = 0, set()
|
||||
for section in generator.arrange.form.full_arrangement_sections(source['staves'][0]['measures'], 'electric'):
|
||||
measures = result['staves'][0]['measures'][start:start + section.measure_count]
|
||||
original = independent['staves'][0]['measures'][start:start + section.measure_count]
|
||||
start += section.measure_count
|
||||
if section.role == 'melody':
|
||||
self.assertEqual(measures, original)
|
||||
if section.role != 'accompaniment':
|
||||
continue
|
||||
for offset, (m, old) in enumerate(zip(measures, original)):
|
||||
source_number = source['staves'][0]['measures'][section.source_measure_index + offset]['number']
|
||||
for voice, old_voice in zip(m['voices'], old['voices']):
|
||||
self.assertEqual([{k: v for k, v in n.items() if k != 'pitches'} for n in voice['notes']], [{k: v for k, v in n.items() if k != 'pitches'} for n in old_voice['notes']])
|
||||
for n in voice['notes']:
|
||||
if not n['pitches'] or source_number not in ('4', '12', '22', '24'):
|
||||
continue
|
||||
expected = (3, 3, 3, 3) if source_number == '22' else (3, 5, 5, 5)
|
||||
self.assertEqual(tuple(f for _, f in sorted(shape(n), reverse=True)), expected)
|
||||
self.assertTrue(all('tie_from' not in p and 'tie_to' not in p for p in n['pitches']))
|
||||
checked.add(source_number)
|
||||
self.assertEqual(checked, {'4', '12', '22', '24'})
|
||||
|
||||
Reference in New Issue
Block a user