首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python和Qt创建精确的节拍器

使用python和Qt创建精确的节拍器
EN

Stack Overflow用户
提问于 2012-06-26 09:45:29
回答 1查看 2.9K关注 0票数 5

我试图在我的跨平台pyQt程序中添加一个简单的节拍器,但获得准确的计时有很大的困难。使用PyGame的声音系统播放声音似乎效果最好。我试过Phonon,但它根本不一致,而且QSound在我的系统上根本不起作用。我尝试过使用python的时间库和QTimers来处理计时,但QTimeLine似乎工作得最好。

在较低的节奏下的时机并不是太糟糕。在这里和那里仍然是一个问题。然而,更高的节拍根本就不准确。

如有任何想法/建议,我们将不胜感激!

下面是一些代码:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-26 12:54:51

我不太熟悉Python和Qt的交互,但我有使用计时器、线程和Qt的经验。

一般的时间限制

Qt中的计时通常是为图形动画制作的。在Qt Timers文档中,它说计时器精确到大约15毫秒,但这取决于平台。在windows中,如果你阅读他们的定时器和系统时钟的documentation,就会发现它们的精确度约为11到16毫秒。

线程优先级

此外,线程的优先级将影响节拍器的结果。您可能应该考虑将线程的优先级设置为time critical (请参见QThread::Priority),以便系统为您提供更好的计时,然后在您播放完声音后告诉函数执行睡眠(0)或yieldCurrentThread()调用。

QObject连接调用

Qt中的连接调用是使用Qt::AutoConnection完成的,这意味着Qt决定是使用事件队列还是使用直接调用来连接它。对于定时,直接调用是更可取的。

另外,在播放声音之后执行processEvents调用,或者根本不执行。事先这样做会告诉Qt,在到达下一个调用之前,您希望事件队列中的任何其他内容都得到处理。请查看qt event system上的文档。

MIDI文件

据我所知,大多数游戏中生成的声音都是使用MIDI文件完成的。它们很小,其声音循环的渲染在许多平台上都是相当一致的。也许你可以从100个midi文件中选择一个。也有像ScaleTempo这样的项目,但它看起来有点老了(最近一次更新是在2008年)。

希望这能有所帮助。

免责声明:我发布的大部分链接来自Qt5。我主要是在Qt4.7中编程,但据我所知,Qt5的计时器和事件系统(主要是动画后端优化)并没有计划进行改造。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11199747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档