@@ -676,21 +676,33 @@ def play(self, loop: Optional[bool] = None) -> bool: # noqa: PLR0912
676
676
677
677
current_time = time .monotonic ()
678
678
if current_time - self ._last_event_time >= self ._next_event_delay :
679
- event = self ._parser .next_event
679
+ event = self ._parser .current_event
680
680
if event :
681
- if event ["type" ] == "note_on" :
682
- self .on_note_on (event ["note" ], event ["velocity" ], event ["channel" ])
683
- elif event ["type" ] == "note_off" :
684
- self .on_note_off (event ["note" ], event ["velocity" ], event ["channel" ])
685
- elif event ["type" ] == "tempo" :
686
- self .on_tempo_change (event ["tempo" ])
687
- elif event ["type" ] == "controller" :
688
- self .on_controller (event ["controller" ], event ["value" ], event ["channel" ])
689
- elif event ["type" ] == "program_change" :
690
- self .on_program_change (event ["program" ], event ["channel" ])
691
- elif event ["type" ] == "end_of_track" :
692
- self .on_end_of_track (event ["track" ])
693
- self ._next_event_delay = self ._parser .calculate_delay (event )
681
+ current_absolute_time = event ["absolute" ]
682
+ while (
683
+ self ._parser .current_event
684
+ and self ._parser .current_event ["absolute" ] == current_absolute_time
685
+ ):
686
+ event = self ._parser .next_event
687
+ if event ["type" ] == "note_on" :
688
+ self .on_note_on (event ["note" ], event ["velocity" ], event ["channel" ])
689
+ elif event ["type" ] == "note_off" :
690
+ self .on_note_off (event ["note" ], event ["velocity" ], event ["channel" ])
691
+ elif event ["type" ] == "tempo" :
692
+ self .on_tempo_change (event ["tempo" ])
693
+ elif event ["type" ] == "controller" :
694
+ self .on_controller (event ["controller" ], event ["value" ], event ["channel" ])
695
+ elif event ["type" ] == "program_change" :
696
+ self .on_program_change (event ["program" ], event ["channel" ])
697
+ elif event ["type" ] == "end_of_track" :
698
+ self .on_end_of_track (event ["track" ])
699
+ if self ._parser .current_event :
700
+ time_diff = self ._parser .current_event ["absolute" ] - current_absolute_time
701
+ self ._next_event_delay = (time_diff / self ._parser .ticks_per_beat ) * (
702
+ self ._parser .tempo / 1000000
703
+ )
704
+ else :
705
+ self ._next_event_delay = 0.1
694
706
self ._last_event_time = current_time
695
707
else :
696
708
self ._playing = False
0 commit comments