Fix Playability
ci / checks (push) Failing after 23m26s

This commit is contained in:
khodowany
2026-10-08 19:04:06 -05:00
parent bc7baea7c4
commit 3f63b255ac
23 changed files with 633 additions and 374 deletions
+10 -15
View File
@@ -15,6 +15,7 @@ import generator.acoustic_voicing
import generator.arrange.generate
import generator.fretboard
import generator.guitar
import generator.hand_position
import generator.harmony
import generator.model
import generator.parts
@@ -43,7 +44,7 @@ class GuitarTests(unittest.TestCase):
positions = tuple(generator.fretboard.TabPosition(6 - i, fret, 0) for i, fret in enumerate(frets))
self.assertEqual(generator.fretboard.within_fret_span(positions), valid)
self.assertEqual(generator.guitar.compactness(positions), max(frets) - min(frets))
self.assertEqual(generator.guitar.position_center(positions)[0], min(frets) + max(frets))
self.assertEqual(generator.hand_position.base(positions), min(frets))
self.assertTrue(generator.fretboard.within_fret_span(()))
def test_held_notes_obey_the_shared_four_fret_limit(self):
held = {'held': generator.fretboard.TabPosition(4, 7, 57)}
@@ -210,20 +211,14 @@ class GuitarTests(unittest.TestCase):
generator.guitar.place_guitar(source)
tabs = [n['pitches'][0]['tablature'] for n in tests.test_musicxml.notes(source)]
self.assertEqual(tabs, [{'string': 1, 'fret': 10}, {'string': 1, 'fret': 12}])
def test_grid_search_matches_exhaustive_costs_and_tie_breaks(self):
randomizer = random.Random(17)
states = {}
for index in range(40):
positions = tuple(generator.fretboard.TabPosition(s, randomizer.randrange(21), 0) for s in randomizer.sample(range(1, 7), 3))
states[index] = generator.guitar.Placement(generator.guitar.VoicingCost(*(randomizer.randrange(8) for _ in generator.guitar.VoicingCost._fields)), tuple((str(i), p) for i, p in enumerate(positions)), None, ())
grid = generator.guitar.nearest_positions(states)
for x, row in enumerate(grid):
for y, actual in enumerate(row):
candidates = []
for index, state in enumerate(states.values()):
a, b = generator.guitar.position_center(tuple(p for _, p in state.active))
candidates.append((state.cost.moved(abs(x - a) + abs(y - b)), index))
self.assertEqual(actual[:2], min(candidates))
def test_equal_old_centers_can_have_different_finger_adjustments(self):
def grip(frets):
return tuple(generator.fretboard.TabPosition(s, f, 0) for s, f in zip((4, 3, 2, 1), frets))
first, second = grip((3, 5, 3, 5)), grip((5, 3, 5, 3))
self.assertEqual(generator.hand_position.base(first), generator.hand_position.base(second))
self.assertEqual(generator.guitar.movement(first, first, 3, 3), 0)
self.assertEqual(generator.guitar.movement(first, second, 3, 3), 0)
self.assertEqual(generator.hand_position.motion(first, second, 3, 3).fingers, 8)
def test_generated_chord_retains_strings_when_a_melody_enters(self):
content = tests.test_musicxml.xml_note() + '<backup><duration>4</duration></backup><forward><duration>2</duration></forward>' + tests.test_musicxml.xml_note('E', 2, 'half', octave=6, extra='<voice>2</voice>')
document = tests.test_musicxml.parse(tests.test_musicxml.xml_score(content))