2

Python を使用して Vizard でアクション (ビープ音) をスケジュールしようとしています。ただし、試用開始から特定のタイミングでビープ音を鳴らしたい。

私がこれまでに持っているものは、(たとえば、一度実行した後) 回のリストを提供します: [ 1.89229142 5.2610474 9.86058804 11.43137033 13.87078666] そして、さまざまな間隔で音を再生し、上記の要素を出力しますタイミングリスト。これらの要素を再生する秒/タイミングとして実際に使用していないだけです。

私の質問は、これらが単なる数字ではなく、関数/試行の開始からのタイミングであることをPythonにどのように知らせるのですか? おそらくどこかで time.time() を使用することになっていますが、そこに到達する方法のロジックがわかりません。

import time
import numpy as np
import viztask                                              


### Start Vizard ### 
viz.go()


### Cue sound ###
cue = viz.addAudio('cues\dong.wav') 
cueDuration = cue.getDuration() 

### Timings ###

def uniform_min_range(a, b, n, min_dist):
    while True:
        times = np.random.uniform(a, b, size=n)
        np.sort(times)
        if np.all(np.diff(times) >= min_dist):
            return times

def timings():
    global times
    times = uniform_min_range(0, 20, 5, 1.0)
    print "times: ", times


def main():
    global times
    timesIndex =0
    for x in range(len(times)):
        cuetime = times[timesIndex]
        cue.play()
        print 'cue'
        print cuetime
        yield viztask.waitTime(cueDuration + cuetime)
        cue.stop()
        timesIndex = timesIndex + 1



timings()
viztask.schedule(main())

彼の答えへのコメントでの jacantebury の提案に基づいて編集します。これは作業コードを閉じます。ジャカンタベリーが示唆するように、タイミングの不一致はフレームレートに関連していると思います。

import time
import viztask

viz.go()

times= [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369] #at these times since onset of script, a text "hello world" should be printed
time_intervals=[]
prev=0 

for val in times: 
    time_intervals.append( val - prev ) 
    prev = val 
    print time_intervals

intervalsIndex = 1

start = time.time()

def main():
    global intervalsIndex
    yield viztask.waitTime(time_intervals[0])
    for x in range (len(time_intervals)):
        print ('hello world', '- now: ', time.time()- start)
        yield viztask.waitTime(time_intervals[intervalsIndex])
        intervalsIndex = intervalsIndex + 1

 viztask.schedule(main())

これで ('hello world', '- now: ', 1.7820000648498535) ('hello world', '- now: ', 3.133000135421753) ('hello world', '- now: ', 4.5350000858306885) ('hello world', '- now: ', 3.133000135421753) ', '- now: ', 11.040000200271606) ('hello world', '- now: ', 18.897000074386597) これは私のリスト要素 (つまり、タイミング、および私が最初に望んでいたもの) に非常に近いものです。

4

2 に答える 2

2

FOR ループの使用については busfault が正しいです。

を使用してテストするには、呼び出された関数yieldが必要です。schedule例えば

import viz
import viztask

def myfunc():

    for cuetime in (2,3,4):

        mydata = yield viztask.waitTime( cuetime)
        print( 'Wait time: ' , cuetime, ' - Elapsed time: ', mydata.elapsed )

viz.go()
viztask.schedule( myfunc )

このような出力を生成します...

('Wait time: ', 2, ' - Elapsed time: ', 2.002306576051085)
('Wait time: ', 3, ' - Elapsed time: ', 3.016386045747815)
('Wait time: ', 4, ' - Elapsed time: ', 4.016321305293874)

タイミングの不一致は通常、フレーム レート (60 Hz ~ 16.7ms) に関連していることがわかります。

OPによる次の編集:..タイミングの違いがフレーム同期によるものかどうかをテストする簡単な方法は、グラフィックカードの垂直同期(V-Sync)をオフにして再実行することです-多くの結果が得られると思いますただし、ディスプレイでフレームのティアリングが発生する可能性があります。その場合、画質とタイミングの正確さのどちらが重要かはあなた次第です。Todo ウィットのリフレッシュを証明するもう 1 つのオプションは、単にリフレッシュ レートを変更して、時間差がそれに応じて変化するかどうかを確認することです。

time.time() の使用に戻ったことに気付きました-これは、私のデモのように waitTime からの戻りオブジェクトを使用するよりも正確ではありません (つまりmydata = yield viztask.waitTime( cuetime)... )

于 2016-05-17T10:19:56.353 に答える
0

あなたの問題はここにあると思います:forループを使用すると、反復する必要がなく、自動的に反復されます。これが行うことは、特定の値にtimes設定するたびにリストを反復処理することですcuetime

また、cue.stop()すべての譲歩が完了するまで呼び出されないのではないでしょうか。yield私は慣れていないので、後で印刷呼び出しで確認することをお勧めしますyield

def main():
    global times
    for cuetime in times:
        cue.play()
        print 'cue'
        print cuetime
        yield viztask.waitTime(cueDuration + cuetime)
        cue.stop()
于 2016-05-16T20:51:52.647 に答える