@@ -1,4 +1,6 @@
|
||||
"""Accompaniment geometry and whole-form movement, using authored small cases."""
|
||||
import generator.composition
|
||||
import generator.source
|
||||
import copy
|
||||
import fractions
|
||||
import itertools
|
||||
@@ -14,7 +16,6 @@ import generator.fretboard
|
||||
import generator.guitar
|
||||
import generator.harmony
|
||||
import generator.model
|
||||
import generator.production
|
||||
import generator.score
|
||||
import generator.vocabulary
|
||||
import tests.solo_fixtures
|
||||
@@ -43,13 +44,13 @@ class CompingVoicings(unittest.TestCase):
|
||||
path, _ = generator.comping.select_grips(((low, high),), (costs,), 'electric', 'lower', left=high, right=high)
|
||||
self.assertEqual(path, (high,))
|
||||
def test_electric_voicing_policy_does_not_reseed_rhythm(self):
|
||||
source = generator.production.SourceAnalysis.read(tests.solo_fixtures.song(count=4, chords=('C7', 'FM7', 'Dm7', 'G7')))
|
||||
source = generator.source.SourceAnalysis.read(tests.solo_fixtures.song(count=4, chords=('C7', 'FM7', 'Dm7', 'G7')))
|
||||
root = pathlib.Path('data')
|
||||
current = generator.production.generate_role(source, 'electric_accompaniment', root)
|
||||
current = generator.composition.generate_role(source, 'electric_accompaniment', root)
|
||||
with tempfile.TemporaryDirectory() as cache:
|
||||
settings = {'voicing': {'register_weight': 0, 'high_position_weight': 0}}
|
||||
other = generator.production.generate_role(source, 'electric_accompaniment', root, settings, cache)
|
||||
warm = generator.production.generate_role(source, 'electric_accompaniment', root, settings, cache)
|
||||
other = generator.composition.generate_role(source, 'electric_accompaniment', root, settings, cache)
|
||||
warm = generator.composition.generate_role(source, 'electric_accompaniment', root, settings, cache)
|
||||
self.assertTrue(warm['cache_hit'])
|
||||
self.assertEqual(other['document'], warm['document'])
|
||||
self.assertNotEqual(current['trace']['cache_key'], other['trace']['cache_key'])
|
||||
@@ -99,7 +100,7 @@ class CompingVoicings(unittest.TestCase):
|
||||
with generator.vocabulary.using(resources, 'acoustic_accompaniment', {'voicing': {'register_weight': -1}}), self.assertRaises(ValueError):
|
||||
generator.comping.local_cost('acoustic', key, high, 53)
|
||||
def test_production_voicing_policy_changes_cache_not_rhythm_or_electric(self):
|
||||
source = generator.production.SourceAnalysis.read(tests.solo_fixtures.song(count=6, chords=('Em7b5', 'A7b9', 'Dm7', 'G7', 'Cm7', 'F7')))
|
||||
source = generator.source.SourceAnalysis.read(tests.solo_fixtures.song(count=6, chords=('Em7b5', 'A7b9', 'Dm7', 'G7', 'Cm7', 'F7')))
|
||||
def rhythm(result):
|
||||
return [[(n['onset'], n['duration'], n['written'], n['kind'], len(n['pitches']), tuple((bool(p.get('tie_from')), bool(p.get('tie_to'))) for p in n['pitches'])) for n in generator.score.measure_notes(m)] for m in result['document']['staves'][0]['measures']]
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
@@ -109,14 +110,14 @@ class CompingVoicings(unittest.TestCase):
|
||||
data = json.loads(role_path.read_text())
|
||||
policy = data['roles']['acoustic_accompaniment'].pop('voicing')
|
||||
role_path.write_text(json.dumps(data))
|
||||
legacy = generator.production.generate_role(source, 'acoustic_accompaniment', root)
|
||||
electric = generator.production.generate_role(source, 'electric_accompaniment', root)
|
||||
legacy = generator.composition.generate_role(source, 'acoustic_accompaniment', root)
|
||||
electric = generator.composition.generate_role(source, 'electric_accompaniment', root)
|
||||
data['roles']['acoustic_accompaniment']['voicing'] = policy
|
||||
role_path.write_text(json.dumps(data))
|
||||
current = generator.production.generate_role(source, 'acoustic_accompaniment', root)
|
||||
current = generator.composition.generate_role(source, 'acoustic_accompaniment', root)
|
||||
settings = {'voicing': {'register_weight': 0, 'high_position_weight': 0, 'comfortable_max_fret': 9}}
|
||||
old = generator.production.generate_role(source, 'acoustic_accompaniment', root, settings, pathlib.Path(directory) / 'cache')
|
||||
warm = generator.production.generate_role(source, 'acoustic_accompaniment', root, settings, pathlib.Path(directory) / 'cache')
|
||||
old = generator.composition.generate_role(source, 'acoustic_accompaniment', root, settings, pathlib.Path(directory) / 'cache')
|
||||
warm = generator.composition.generate_role(source, 'acoustic_accompaniment', root, settings, pathlib.Path(directory) / 'cache')
|
||||
self.assertTrue(warm['cache_hit'])
|
||||
self.assertEqual(old['document'], warm['document'])
|
||||
self.assertNotEqual(current['document'], old['document'])
|
||||
@@ -125,7 +126,7 @@ class CompingVoicings(unittest.TestCase):
|
||||
self.assertEqual(legacy['document'], current['document'])
|
||||
self.assertEqual(rhythm(current), rhythm(old))
|
||||
self.assertEqual(current['details']['accompaniment_rhythm'], old['details']['accompaniment_rhythm'])
|
||||
self.assertEqual(electric['document'], generator.production.generate_role(source, 'electric_accompaniment', root)['document'])
|
||||
self.assertEqual(electric['document'], generator.composition.generate_role(source, 'electric_accompaniment', root)['document'])
|
||||
def test_report_balanced_cost_matches_selected_path(self):
|
||||
canonical = generator.comping.Canonical(tests.solo_fixtures.song(count=4, chords=('Em7b5', 'A7b9', 'Dm7', 'G7')), 'acoustic', 'report')
|
||||
rows = [r for r in canonical.report if r['tones']]
|
||||
@@ -242,13 +243,13 @@ class CompingVoicings(unittest.TestCase):
|
||||
high = generator.comping.Canonical(source, part, 'fixed-rhythm')
|
||||
self.assertEqual(rhythm(low), rhythm(high))
|
||||
def test_accompaniment_cache_matches_clean_generation(self):
|
||||
source = generator.production.SourceAnalysis.read(tests.solo_fixtures.song(count=3))
|
||||
source = generator.source.SourceAnalysis.read(tests.solo_fixtures.song(count=3))
|
||||
for part in ('acoustic', 'electric'):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
role = part + '_accompaniment'
|
||||
cold = generator.production.generate_role(source, role, pathlib.Path('data'), cache_dir=directory)
|
||||
warm = generator.production.generate_role(source, role, pathlib.Path('data'), cache_dir=directory)
|
||||
clean = generator.production.generate_role(source, role, pathlib.Path('data'))
|
||||
cold = generator.composition.generate_role(source, role, pathlib.Path('data'), cache_dir=directory)
|
||||
warm = generator.composition.generate_role(source, role, pathlib.Path('data'), cache_dir=directory)
|
||||
clean = generator.composition.generate_role(source, role, pathlib.Path('data'))
|
||||
self.assertTrue(warm['cache_hit'])
|
||||
self.assertEqual(cold['document'], warm['document'])
|
||||
self.assertEqual(cold['document'], clean['document'])
|
||||
|
||||
Reference in New Issue
Block a user