Generation
ci / checks (push) Successful in 48m7s

This commit is contained in:
khodowany
2026-09-30 20:30:29 -05:00
parent 09656a9d60
commit 7b60182a3d
3 changed files with 68 additions and 11 deletions
+3 -1
View File
@@ -7,6 +7,8 @@ import functools
import generator.model
import generator.rhythm
ATTACKS_PER_BEAT = {'bass': fractions.Fraction(1, 2), 'upper': fractions.Fraction(3, 4), 'electric': fractions.Fraction(1, 2)}
@dataclasses.dataclass(frozen=True)
class Context:
measure: dict
@@ -75,7 +77,7 @@ def measure_rank(bar, offset, intervals, melody_attacks, melody_spans, companion
missing_bars = int(bool(intervals) and not spans and role != 'electric')
uncovered = sum(not any(start < b and end > a for start, end in spans) for a, b in intervals)
duration = sum((b - a for a, b in intervals), fractions.Fraction())
density = abs(len(attacks) - duration / {'electric': 2, 'bass': 2, 'upper': 1}[role])
density = abs(len(attacks) - duration * ATTACKS_PER_BEAT[role])
collisions = sum((t in melody_attacks) + (t in companions) for t in attacks)
occupied = sum(any(a <= t < b for a, b in melody_spans) for t in attacks)
pulse = -sum(2 if t == 0 else 1 if t.denominator == 1 else 0 for t in attacks)