Skip to content

Commit 94a802d

Browse files
authored
Merge pull request #3 from adafruit/polyphony
update play() for polyphony
2 parents 98949c8 + 38dac86 commit 94a802d

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

adafruit_midi_parser.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -676,21 +676,33 @@ def play(self, loop: Optional[bool] = None) -> bool: # noqa: PLR0912
676676

677677
current_time = time.monotonic()
678678
if current_time - self._last_event_time >= self._next_event_delay:
679-
event = self._parser.next_event
679+
event = self._parser.current_event
680680
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
694706
self._last_event_time = current_time
695707
else:
696708
self._playing = False

0 commit comments

Comments
 (0)