Tworzenie dokładnego metronomu z pytonem i Qt
Próbuję dodać prosty metronom do mojego wieloplatformowego programu pyQt, ale mając duże trudności z uzyskaniem dokładnego pomiaru czasu. Odtwarzanie dźwięku wydaje się działać najlepiej przy użyciu systemu dźwiękowego PyGame. Spróbowałem Phonona, ale w ogóle nie był on spójny, a QSound w ogóle nie działa w moim systemie. Próbowałem obsługiwać timing za pomocą biblioteki czasu Pythona i używać QTimerów, ale QTimeLine wydaje się działać najlepiej.
Czas w niższym tempie nie jest taki zły ... wciąż czkawka tu i tam. Wyższe tempa nie są jednak dokładne.
Wszelkie pomysły / sugestie byłyby bardzo mile widziane!
Oto kod:
class Metronome(object):
def init_metronome(self):
self.metronome_timer = QtCore.QTimeLine(100000)
self.metronome_timer.valueChanged.connect(self.tick)
self.metronome_timer.setCurveShape(3) #linear curve
self.ui.pushButton_metronome.toggled.connect(self.toggle_metronome)
self.ui.spinBox_metronome_bpm.valueChanged.connect(self.set_metronome_bpm)
pygame.mixer.init()
self.sound = pygame.mixer.Sound("./sounds/tick.wav")
def toggle_metronome(self):
if self.ui.pushButton_metronome.isChecked() == True:
self.set_metronome_bpm()
self.metronome_timer.start()
else:
self.metronome_timer.stop()
def set_metronome_bpm(self):
bpm = self.ui.spinBox_metronome_bpm.value()
self.metronome_timer.setUpdateInterval(60./bpm * 1000)
def tick(self):
QtCore.QCoreApplication.processEvents()
self.sound.play()