Voice Leading
ci / checks (push) Successful in 48m12s

This commit is contained in:
khodowany
2026-09-30 15:13:00 -05:00
parent 10d295abfe
commit fb92ed78ee
17 changed files with 511 additions and 484 deletions
+7 -2
View File
@@ -12,11 +12,16 @@ class HarmonySpan:
harmony: dict
location: str
notes: list[dict] = dataclasses.field(default_factory=list)
iteration: int = 0
def harmony_spans(document: dict) -> list[HarmonySpan]:
"""Group attacks by continuous harmony, including changes during silence."""
"""Group attacks by continuous harmony within each arrangement iteration."""
spans, span, active = [], None, None
iteration = 0
for measure in document['staves'][0]['measures']:
if measure.get('section_label'):
iteration += 1
span = None
if {v['id'] for v in measure['voices']} != {'bass', 'upper'}:
span, active = None, None
continue
@@ -30,7 +35,7 @@ def harmony_spans(document: dict) -> list[HarmonySpan]:
if kind == 0:
continue
if span is None:
span = HarmonySpan(harmony, f'measure {measure["number"]}, event {item["id"]}, onset {onset}')
span = HarmonySpan(harmony, f'measure {measure["number"]}, event {item["id"]}, onset {onset}', iteration=iteration)
spans.append(span)
span.notes.append(item)
return spans