use*_*177 5 python audio qt pygame pyqt
我正在尝试向我的跨平台 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()
Run Code Online (Sandbox Code Playgroud)
我不太熟悉与Python和Qt的交互,但我确实有定时器和线程以及Qt的经验。
Qt中的时序一般是为图形动画制作的。在Qt Timers文档中,它说计时器精确到大约 15 毫秒,但这取决于平台。在 Windows 中,如果您阅读有关计时器和系统时钟的文档,就会发现它们的精确度约为 11 到 16 毫秒。
此外,线程的优先级也会影响节拍器的结果。您可能应该考虑将线程的优先级设置为时间关键型(请参阅 参考资料QThread::Priority
),以便系统为您提供更好的计时,然后告诉您的函数执行 sleep(0) 或yieldCurrentThread()
在播放完声音后进行调用。
Qt 中的 Connect 调用是使用 完成的Qt::AutoConnection
,这意味着 Qt 决定是使用事件队列还是使用直接调用来连接它。对于计时,最好直接调用。
另外,播放声音后是否调用 processEvents 或根本不调用。提前执行此操作会告诉 Qt,您希望在下一次调用之前处理事件队列中的任何其他内容。查看有关qt 事件系统的文档。
据我所知,大多数游戏中生成的声音都是使用 MIDI 文件完成的。它们很小,并且声音循环的渲染在许多平台上都非常一致。也许您可以从 100 个 MIDI 文件中选择一个来实现一些目标。还有像ScaleTempo这样的项目,但看起来有点旧(最后更新于 2008 年)。
希望有帮助。
免责声明:我发布的大多数链接都来自 Qt 5。我主要在 Qt 4.7 中进行编程,但据我所知,计时器和事件系统并未计划针对 Qt 5 进行改造(主要是动画后端优化) 。
归档时间: |
|
查看次数: |
2836 次 |
最近记录: |