5

クロスプラットフォームの 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()
4

1 に答える 1

3

Python と Qt のやり取りにはあまり詳しくありませんが、タイマーとスレッド、および Qt の使用経験はあります。

一般的なタイミングの制限

Qt のタイミングは、通常、グラフィック アニメーション用に作成されます。Qt タイマーのドキュメントでは、タイマーは約 15 ミリ秒の精度であると書かれていますが、プラットフォームによって異なります。Windows では、タイマーとシステム クロックに関するドキュメントを読むと、約 11 ~ 16 ミリ秒の精度であると書かれています。

スレッドの優先度

また、スレッドの優先度もメトロノームの結果に影響します。おそらく、スレッドの優先度をタイム クリティカルに設定することを検討する必要があります (「参考文献」を参照)。これにより、システムがより適切なタイミングを提供し、サウンドの再生が終了した後にQThread::Priority関数に sleep(0) または呼び出しを行うように指示できます。yieldCurrentThread()

QObject Connect 呼び出し

Qt での接続呼び出しは を使用して行われますQt::AutoConnection。つまり、Qt はイベント キューを使用して接続するか、直接呼び出しを使用して接続するかを決定します。タイミング的には、直接電話が望ましいです。

また、サウンドの再生後に processEvents 呼び出しを実行するか、まったく実行しません。事前にこれを行うと、次の呼び出しに到達する前に、イベント キューにある他のものを処理する必要があることを Qt に伝えます。qt event systemのドキュメントを確認してください。

MIDIファイル

私が認識しているゲームで生成されるサウンドのほとんどは、MIDI ファイルを使用して行われています。それらは小さく、サウンド ループのレンダリングは多くのプラットフォームでかなり一貫しています。たぶん、100 個の midi ファイルの 1 つを選択して何かを引き出すことができます。ScaleTempoのようなプロジェクトもありますが、少し古いようです (最終更新は 2008 年です)。

それが役立つことを願っています。

免責事項: 私が投稿したリンクのほとんどは Qt 5 からのものです。私は主に Qt 4.7 でプログラミングを行っていますが、私の知る限り、タイマーとイベント システムは Qt 5 向けに改良される予定はありませんでした (主にアニメーション バックエンドの最適化)。 .

于 2012-06-26T04:54:51.257 に答える