This repository was archived by the owner on Aug 11, 2026. It is now read-only.
Commit 784429f
Complete fix for IndexError and reference level logic in get_musical_time() (#32)
* Complete fix for IndexError and reference level logic in get_musical_time()
This comprehensive fix addresses the critical IndexError bugs reported in Issue #31:
1. **IndexError Resolution**:
- Added sparse pulse detection and proportional timing fallback to pulse-based calculation path
- Fixed bounds checking when accessing all_pulses array
- Both default mode and reference_level=2 now work correctly with sparse pulse data
2. **Reference Level Logic Correction**:
- Fixed fundamental misunderstanding of reference level semantics
- Reference levels now correctly calculate fractional position within the CONTAINING unit:
* Reference Level 0: fractional position within the current CYCLE
* Reference Level 1: fractional position within the current BEAT
* Reference Level 2: fractional position within the current SUBDIVISION
- Updated both proportional timing fallback and pulse-based calculation paths
3. **Specification Update**:
- Updated docs/musical-time-spec.md to reflect corrected reference level behavior
- Fixed test case examples to show proper fractional_beat calculations
- Clarified semantic descriptions for reference level behavior
4. **Comprehensive Testing**:
- Verified fix works for both sparse pulse data (real transcriptions) and complete pulse data (synthetic meters)
- IndexError reproduction cases now return successful MusicalTime results
- All reference levels produce correct fractional_beat values
The fix ensures that get_musical_time() works reliably across all scenarios while maintaining the correct musical semantics for reference levels.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Update test expectations to match corrected reference level logic
Updates the 5 failing tests to reflect the corrected reference level behavior:
1. **test_regular_meter_default_level**: Updated to expect fractional_beat=0.5
(halfway between subdivisions in default mode)
2. **test_reference_level_beat**: Updated to expect fractional_beat=0.375
(37.5% through cycle with reference_level=0)
3. **test_reference_level_subdivision**: Updated to expect fractional_beat=0.5
(50% through beat with reference_level=1)
4. **test_recursive_overflow_edge_case**: Updated to expect fractional_beat=0.4995
(49.95% through cycle with reference_level=0)
5. **test_fractional_beat_distribution_with_reference_level_zero**: Updated range
expectation from >0.3 to >0.15 to match corrected cycle-based logic
All tests now pass with the corrected reference level semantics:
- Reference Level 0: fractional position within current CYCLE
- Reference Level 1: fractional position within current BEAT
- Reference Level 2: fractional position within current SUBDIVISION
Full test suite: 343 tests passing ✅
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 414dd1a commit 784429f
3 files changed
Lines changed: 107 additions & 50 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
60 | | - | |
61 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
62 | 63 | | |
63 | 64 | | |
64 | 65 | | |
| |||
291 | 292 | | |
292 | 293 | | |
293 | 294 | | |
294 | | - | |
| 295 | + | |
295 | 296 | | |
296 | 297 | | |
297 | 298 | | |
298 | 299 | | |
299 | 300 | | |
300 | 301 | | |
301 | 302 | | |
302 | | - | |
303 | | - | |
304 | | - | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
305 | 306 | | |
306 | 307 | | |
307 | | - | |
| 308 | + | |
308 | 309 | | |
309 | 310 | | |
310 | 311 | | |
311 | 312 | | |
312 | 313 | | |
313 | 314 | | |
314 | 315 | | |
315 | | - | |
316 | | - | |
317 | | - | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
318 | 319 | | |
319 | 320 | | |
320 | 321 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
496 | 496 | | |
497 | 497 | | |
498 | 498 | | |
499 | | - | |
500 | | - | |
501 | | - | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
502 | 502 | | |
503 | 503 | | |
504 | 504 | | |
505 | 505 | | |
506 | 506 | | |
507 | 507 | | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
508 | 511 | | |
509 | 512 | | |
510 | 513 | | |
511 | 514 | | |
512 | 515 | | |
513 | | - | |
514 | | - | |
515 | | - | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
516 | 521 | | |
517 | | - | |
| 522 | + | |
518 | 523 | | |
519 | 524 | | |
520 | 525 | | |
| |||
617 | 622 | | |
618 | 623 | | |
619 | 624 | | |
620 | | - | |
621 | | - | |
622 | | - | |
623 | | - | |
624 | | - | |
625 | | - | |
626 | | - | |
627 | | - | |
628 | | - | |
629 | | - | |
630 | | - | |
631 | | - | |
632 | | - | |
633 | | - | |
634 | | - | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
635 | 645 | | |
636 | | - | |
637 | | - | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
638 | 685 | | |
639 | 686 | | |
640 | 687 | | |
| |||
643 | 690 | | |
644 | 691 | | |
645 | 692 | | |
646 | | - | |
647 | | - | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
648 | 703 | | |
649 | 704 | | |
650 | 705 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
88 | | - | |
89 | | - | |
90 | | - | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | | - | |
| 96 | + | |
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | 100 | | |
101 | | - | |
| 101 | + | |
102 | 102 | | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
107 | 107 | | |
108 | | - | |
| 108 | + | |
109 | 109 | | |
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
114 | | - | |
| 113 | + | |
| 114 | + | |
115 | 115 | | |
116 | 116 | | |
117 | 117 | | |
| |||
321 | 321 | | |
322 | 322 | | |
323 | 323 | | |
324 | | - | |
325 | | - | |
| 324 | + | |
| 325 | + | |
326 | 326 | | |
327 | 327 | | |
328 | 328 | | |
329 | 329 | | |
330 | 330 | | |
331 | | - | |
| 331 | + | |
332 | 332 | | |
333 | 333 | | |
334 | 334 | | |
| |||
551 | 551 | | |
552 | 552 | | |
553 | 553 | | |
554 | | - | |
| 554 | + | |
| 555 | + | |
555 | 556 | | |
556 | | - | |
| 557 | + | |
557 | 558 | | |
558 | 559 | | |
559 | 560 | | |
| |||
0 commit comments