Compare commits
5 Commits
57559ea70a
...
e6fb8ea528
Author | SHA1 | Date |
---|---|---|
|
e6fb8ea528 | 4 years ago |
|
0d59414104 | 4 years ago |
|
3fa0bc376f | 4 years ago |
|
b3240631f6 | 4 years ago |
|
76759f986b | 4 years ago |
9 changed files with 210 additions and 53 deletions
@ -0,0 +1,45 @@ |
||||
import time |
||||
from typing import Optional |
||||
|
||||
|
||||
class Tempo(object): |
||||
_last_beat: float |
||||
_override_beat: Optional[float] = None |
||||
|
||||
def __init__(self, bpm: float = 60): |
||||
self._bpm: float = bpm |
||||
self.update_last_beat() |
||||
|
||||
def set_bpm(self, bpm: float) -> None: |
||||
self._bpm = bpm |
||||
|
||||
def get_bpm(self) -> float: |
||||
return self._bpm |
||||
|
||||
def update_last_beat(self) -> None: |
||||
self._last_beat = time.time() |
||||
|
||||
def get_beat_time(self) -> float: |
||||
return 1000 / (self._bpm / 60) |
||||
|
||||
def get_beat_delay(self) -> Optional[float]: |
||||
tick = self._override_beat |
||||
if tick is None: |
||||
return None |
||||
self._override_beat = None |
||||
return tick - self._last_beat |
||||
|
||||
def sync_beat(self): |
||||
self._override_beat = time.time() |
||||
|
||||
def wait(self, beat_divider: int = 1): |
||||
now = time.time() |
||||
next_beat = self._last_beat + (self.get_beat_time() / beat_divider / 1000) |
||||
wait_time = next_beat - now |
||||
beat_delay = self.get_beat_delay() |
||||
if beat_delay is not None: |
||||
wait_time += beat_delay |
||||
if wait_time > 0: |
||||
time.sleep(wait_time) |
||||
self.update_last_beat() |
||||
return True |
Loading…
Reference in new issue