我正在尝试使用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在评论中给出的答案:这是关闭工作代码。我认为时间的不匹配与帧速率有关,正如jacanterbury所暗示的那样。
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())
现在这给了我 ('你好世界',' - 现在:',1.7820000648498535) ('你好世界',' - 现在:',3.133000135421753) ('你好世界',' - 现在:',4.5350000858306885) ('你好世界',' - 现在:',11.040000200271606) ('你好世界',' - 现在:',18.897000074386597) 这非常接近我的列表元素(即时间,以及我最初想要的)。
答案 0 :(得分:2)
busfault关于你使用FOR循环是否正确。
要使用yield
对其进行测试,您需要schedule
被调用的函数。
e.g。
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 wit更新的另一个选择就是改变你的刷新率,看看时差是否相应变化。
我注意到你已经回到使用time.time() - 这比使用waitTime中的返回对象更准确(即mydata = yield viztask.waitTime( cuetime)
...)
答案 1 :(得分:0)
我认为你的问题在于:使用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()
不熟悉
{{1}}