クロスプラットフォームの pyQt プログラムに単純なメトロノームを追加しようとしていますが、正確なタイミングを得るのが非常に困難です。サウンドの再生は、PyGame のサウンド システムを使用するのが最適なようです。Phonon を試してみましたが、まったく一貫性がなく、私のシステムでは QSound がまったく機能しませんでした。Pythonの時間ライブラリとQTimersを使用してタイミングを処理しようとしましたが、QTimeLineが最適に機能するようです。
低いテンポでのタイミングはそれほど悪くありません...それでもあちこちで問題が発生します。ただし、より高いテンポはまったく正確ではありません。
どんなアイデアや提案も大歓迎です!
ここにいくつかのコードがあります:
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()