+9
-8
@@ -1,3 +1,6 @@
|
||||
import generator.production
|
||||
import generator.score
|
||||
import generator.validation
|
||||
import tests.production_fixtures
|
||||
import argparse
|
||||
import copy
|
||||
@@ -10,11 +13,9 @@ import unittest.mock
|
||||
import xml.etree.ElementTree
|
||||
|
||||
import generator.__main__
|
||||
import generator.accompaniment
|
||||
import generator.arrange.generate
|
||||
import generator.model
|
||||
import generator.musicxml
|
||||
import generator.parts
|
||||
import generator.pitch
|
||||
import tests.score_events
|
||||
import tests.arrangement_fixtures
|
||||
@@ -37,7 +38,7 @@ class PartGenerationTests(unittest.TestCase):
|
||||
def test_dense_melody_keeps_rhythmic_accompaniment_without_sustaining_across_changes(self):
|
||||
source = tests.test_musicxml.parse(tests.test_musicxml.xml_score(xml_harmony() + xml_harmony('F', offset=3) + ''.join(tests.test_musicxml.xml_note(duration=1, kind='eighth') for _ in range(8)), divisions=2))
|
||||
for result in (tests.arrangement_fixtures.section_document(source, 'acoustic'), generator.arrange.generate.arrange_document(source, 'electric')):
|
||||
generator.model.validate_document(result)
|
||||
generator.validation.validate_document(result)
|
||||
for measure in result['staves'][0]['measures']:
|
||||
events = measure['voices'][0]['notes']
|
||||
if measure.get('ending_sustain'):
|
||||
@@ -72,13 +73,13 @@ class PartGenerationTests(unittest.TestCase):
|
||||
self.assertTrue(all(generator.model.pitch_number(p) % 12 in {0, 5, 9} for n in carried for p in n['pitches']))
|
||||
for index in (2, 3):
|
||||
self.assertTrue(all(n['kind'] == 'rest' and not n['pitches'] for n in tests.test_musicxml.notes(result, index)))
|
||||
generator.model.validate_document(result)
|
||||
generator.validation.validate_document(result)
|
||||
def test_sparse_accompaniment_preserves_form_and_intentional_space(self):
|
||||
bar = xml_harmony() + ''.join(tests.test_musicxml.xml_note(duration=1, kind='quarter') for _ in range(4))
|
||||
xml = tests.test_musicxml.xml_score(bar).replace('</part>', ''.join(f'<measure number="{i}">{bar}</measure>' for i in range(2, 13)) + '</part>')
|
||||
result = tests.arrangement_fixtures.section_document(tests.test_musicxml.parse(xml), 'acoustic')
|
||||
self.assertEqual(len(result['staves'][0]['measures']), 12)
|
||||
generator.model.validate_document(result)
|
||||
generator.validation.validate_document(result)
|
||||
self.assertTrue(tests.score_events.timeline(result)['events'])
|
||||
self.assertTrue(any(n['kind'] == 'rest' for m in result['staves'][0]['measures'] for n in generator.score.measure_notes(m)))
|
||||
def test_melody_written_pitch_rhythm_rests_and_cross_bar_ties_are_preserved(self):
|
||||
@@ -97,7 +98,7 @@ class PartGenerationTests(unittest.TestCase):
|
||||
for part in ('electric', 'vocal'):
|
||||
with self.subTest(builder=builder.__module__, part=part):
|
||||
result = builder(source, part)
|
||||
generator.model.validate_document(result)
|
||||
generator.validation.validate_document(result)
|
||||
measures = result['staves'][0]['measures']
|
||||
starts = [0] if builder is tests.arrangement_fixtures.section_document else [i for i, m in enumerate(measures) if m.get('section_label') == ('Guitar Melody' if part == 'electric' else 'Vocal Melody')]
|
||||
self.assertTrue(starts)
|
||||
@@ -131,7 +132,7 @@ class PartGenerationTests(unittest.TestCase):
|
||||
for name in names:
|
||||
(source / (name + '.xml')).write_text(tests.test_musicxml.xml_score(tests.test_musicxml.xml_note()))
|
||||
with self.assertRaisesRegex(ValueError, 'conflicting output path') as raised:
|
||||
generator.arrange.generate.generate_performance_scores(source, output)
|
||||
generator.production.generate_tree(source, output)
|
||||
for name in names:
|
||||
self.assertIn(str(source / (name + '.xml')), str(raised.exception))
|
||||
self.assertEqual([p.name for p in output.iterdir()], ['sentinel'])
|
||||
@@ -148,7 +149,7 @@ class PartGenerationTests(unittest.TestCase):
|
||||
unittest.mock.patch('generator.engraving.pipeline.engrave_tree'),
|
||||
unittest.mock.patch('generator.pico_artwork.generate_titles'),
|
||||
unittest.mock.patch('generator.catalog.build_catalog'),
|
||||
unittest.mock.patch('generator.performance.copy_audio', return_value=[]),
|
||||
unittest.mock.patch('generator.audio_assets.copy_audio', return_value=[]),
|
||||
):
|
||||
generator.__main__.generate_assets(args)
|
||||
# Role catalog loading is replaced by this infrastructure fixture. The
|
||||
|
||||
Reference in New Issue
Block a user