Fix hold() inflating Part.total_beats and Score.duration_ms — v0.40.8

Note.beats now returns 0.0 for held notes (_hold=True), matching the
renderer which already skipped advancing the beat position. Previously
every hold() call added its full duration to the part's total, causing
duration reports to be 2-3x too long on tracks with drone notes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 13:27:08 -04:00
parent de7575fe0a
commit e0a1ce9d18
3 changed files with 12 additions and 1 deletions
+9
View File
@@ -2,6 +2,15 @@
All notable changes to PyTheory are documented here.
## 0.40.8
- **Fix hold() inflating duration** — `Note.beats` was returning the full
duration for held notes (`_hold=True`), causing `Part.total_beats` and
`Score.duration_ms` to overcount. A part with `hold(Sa, WHOLE * 4)` followed
by `add(Pa, QUARTER)` would report 17 beats instead of 1. Now held notes
return 0 beats, matching the renderer which already skipped advancing the
timeline for held notes.
## 0.40.7
- **Expose missing Synth enum entries** — rhodes, wurlitzer, vibraphone,
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "pytheory"
version = "0.40.7"
version = "0.40.8"
description = "Music Theory for Humans"
readme = "README.md"
license = "MIT"
+2
View File
@@ -475,6 +475,8 @@ class Note:
@property
def beats(self) -> float:
if self._hold:
return 0.0
return self.duration.value