@@ -1,4 +1,8 @@
|
||||
"""Independent rhythm contracts and their complete sounding durations."""
|
||||
import generator.composition_types
|
||||
import generator.arrange.assembly
|
||||
import generator.composition
|
||||
import generator.validation
|
||||
import copy
|
||||
import dataclasses
|
||||
import fractions
|
||||
@@ -14,9 +18,8 @@ import generator.fretboard
|
||||
import generator.harmonic_time
|
||||
import generator.harmony
|
||||
import generator.model
|
||||
import generator.production
|
||||
import generator.score
|
||||
import generator.solo.analysis
|
||||
import generator.source
|
||||
import generator.solo.decoder
|
||||
import generator.solo.harmonic
|
||||
import generator.solo.learned
|
||||
@@ -187,17 +190,17 @@ class LayeredComping(unittest.TestCase):
|
||||
changed = copy.deepcopy(self.source)
|
||||
changed['metadata']['tempo'] = 240
|
||||
changed['staves'][0]['measures'][0]['tempos'] = [{'onset': generator.model.rational(0), 'bpm': generator.model.rational(240), 'written': {'type': 'quarter', 'dots': 0}}]
|
||||
a, b = map(generator.production.SourceAnalysis.read, (self.source, changed))
|
||||
a, b = map(generator.source.SourceAnalysis.read, (self.source, changed))
|
||||
self.assertEqual(a.accompaniment_key(), b.accompaniment_key())
|
||||
for role in ('acoustic_accompaniment', 'electric_accompaniment'):
|
||||
first = generator.production.generate_role(a, role, pathlib.Path('data'))
|
||||
second = generator.production.generate_role(b, role, pathlib.Path('data'))
|
||||
first = generator.composition.generate_role(a, role, pathlib.Path('data'))
|
||||
second = generator.composition.generate_role(b, role, pathlib.Path('data'))
|
||||
self.assertEqual(sounding(first['document']), sounding(second['document']))
|
||||
self.assertEqual(first['details'], second['details'])
|
||||
self.assertNotEqual(first['trace']['cache_key'], second['trace']['cache_key'])
|
||||
def test_assembly_keeps_releases_and_canonical_reuse(self):
|
||||
source = generator.production.SourceAnalysis.read(self.source)
|
||||
results = {role: generator.production.generate_role(source, role, pathlib.Path('data')) for role in generator.production.ROLES if not role.endswith('_solo')}
|
||||
source = generator.source.SourceAnalysis.read(self.source)
|
||||
results = {role: generator.composition.generate_role(source, role, pathlib.Path('data')) for role in generator.composition_types.ROLES if not role.endswith('_solo')}
|
||||
# Silence in source-defined solo slots is sufficient to test union;
|
||||
# no generated solo participates in these accompaniment decisions.
|
||||
for part in ('acoustic', 'electric'):
|
||||
@@ -207,12 +210,12 @@ class LayeredComping(unittest.TestCase):
|
||||
for n in v['notes']:
|
||||
n.update(kind='rest', pitches=[])
|
||||
results[part + '_solo'] = empty
|
||||
assembled = generator.production.assemble(source, results)
|
||||
assembled = generator.arrange.assembly.assemble(source, results)
|
||||
self.assertTrue(all(len(m['voices']) == 1 for m in assembled['acoustic']['staves'][0]['measures']))
|
||||
audit = generator.arrange.accompaniment.audit(self.source, assembled)
|
||||
self.assertGreater(audit['acoustic']['reused_bars'], 0)
|
||||
for doc in assembled.values():
|
||||
generator.model.validate_document(doc)
|
||||
generator.validation.validate_document(doc)
|
||||
generator.fretboard.validate_document(doc)
|
||||
def test_combined_voices_reject_conflicting_strings_and_fret_spans(self):
|
||||
for string, fret in ((5, 3), (2, 10)):
|
||||
@@ -266,7 +269,7 @@ class SoloRhythmConditioning(unittest.TestCase):
|
||||
if held:
|
||||
m = source['staves'][0]['measures'][0]
|
||||
m['voices'][0]['notes'] = [generator.model.make_event('held', fractions.Fraction(), fractions.Fraction(4), 'note', [{'letter': 'c', 'alter': 0, 'octave': 4}])]
|
||||
analysis = generator.solo.analysis.analyze(source)
|
||||
analysis = generator.source.analyze(source)
|
||||
harmony = generator.solo.harmonic.Harmony(generator.harmonic_time.read(source['staves'][0]))
|
||||
examples.append({'analysis': analysis, 'harmony': harmony, 'events': [(fractions.Fraction(), fractions.Fraction(duration), 64), (fractions.Fraction(duration), fractions.Fraction(4), 67)]})
|
||||
model = generator.solo.learned.Model(generator.solo.learned.fit(examples, {'purpose': 'independently authored conditional-rhythm test'}))
|
||||
|
||||
Reference in New Issue
Block a user