@@ -1,4 +1,8 @@
|
||||
"""Recurring source-position grooves, fills and chord-first bass behavior."""
|
||||
import generator.composition_types
|
||||
import generator.composition
|
||||
import generator.source
|
||||
import generator.validation
|
||||
import concurrent.futures
|
||||
import copy
|
||||
import dataclasses
|
||||
@@ -213,7 +217,7 @@ class RecurringGrooves(unittest.TestCase):
|
||||
source['staves'][0].update(arrangement_part_type='acoustic', tablature=True)
|
||||
generator.acoustic.validate_comping(source)
|
||||
generator.acoustic.combine(source)
|
||||
generator.model.validate_document(source)
|
||||
generator.validation.validate_document(source)
|
||||
generator.fretboard.validate_document(source)
|
||||
generator.acoustic.validate_comping(source)
|
||||
first = source['staves'][0]['measures'][0]
|
||||
@@ -239,26 +243,26 @@ class RecurringGrooves(unittest.TestCase):
|
||||
r = generator.comping_rhythm.realize(pattern, inputs, 'acoustic', generator.comping_rhythm.melody_contexts(source))
|
||||
self.assertTrue(all(e.lane == 'combined' for e in r.events))
|
||||
def test_clean_cached_parallel_and_other_role_settings_keep_groove(self):
|
||||
source = generator.production.SourceAnalysis.read(tests.solo_fixtures.song(count=10, chords=('C7', 'FM7')))
|
||||
source = generator.source.SourceAnalysis.read(tests.solo_fixtures.song(count=10, chords=('C7', 'FM7')))
|
||||
root = pathlib.Path('data').resolve()
|
||||
roles = ('acoustic_accompaniment', 'electric_accompaniment')
|
||||
clean = {r: generator.production.generate_role(source, r, root) for r in roles}
|
||||
clean = {r: generator.composition.generate_role(source, r, root) for r in roles}
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
for r in roles:
|
||||
cold = generator.production.generate_role(source, r, root, cache_dir=directory)
|
||||
warm = generator.production.generate_role(source, r, root, cache_dir=directory)
|
||||
cold = generator.composition.generate_role(source, r, root, cache_dir=directory)
|
||||
warm = generator.composition.generate_role(source, r, root, cache_dir=directory)
|
||||
self.assertTrue(warm['cache_hit'])
|
||||
self.assertEqual(clean[r]['document'], cold['document'])
|
||||
self.assertEqual(clean[r]['document'], warm['document'])
|
||||
generator.production.generate_role(source, roles[1], root, {'seed': 'different'}, directory)
|
||||
self.assertEqual(clean[roles[0]]['document'], generator.production.generate_role(source, roles[0], root, cache_dir=directory)['document'])
|
||||
generator.composition.generate_role(source, roles[1], root, {'seed': 'different'}, directory)
|
||||
self.assertEqual(clean[roles[0]]['document'], generator.composition.generate_role(source, roles[0], root, cache_dir=directory)['document'])
|
||||
with concurrent.futures.ProcessPoolExecutor(max_workers=2, mp_context=multiprocessing.get_context('spawn')) as pool:
|
||||
futures = {r: pool.submit(generator.production._job, (source, r, root, {}, None)) for r in reversed(roles)}
|
||||
futures = {r: pool.submit(generator.production._job, generator.composition_types.RoleRequest(source, r, root)) for r in reversed(roles)}
|
||||
for r, future in futures.items():
|
||||
self.assertEqual(clean[r]['document'], future.result()['document'])
|
||||
def test_reuse_audit_checks_rests_and_all_six_roles(self):
|
||||
source = tests.solo_fixtures.song(count=2, chords=('C7',))
|
||||
for role in generator.production.ROLES:
|
||||
for role in generator.composition_types.ROLES:
|
||||
part = role.split('_')[0]
|
||||
wanted = 'slash' if role.endswith('_solo') else 'vocal' if part == 'vocal' else 'melody' if role.endswith('_melody') else 'accompaniment'
|
||||
section = generator.arrange.form.ArrangementSection('Repeated role', 0, 2, 1, wanted)
|
||||
|
||||
Reference in New Issue
Block a user