2016-05-16 12 views
2

Я пытаюсь запланировать действие (звуковой сигнал) в Vizard с помощью Python. Тем не менее, я хочу, чтобы звуковой сигнал произошел в определенные тайминги с момента начала судебного разбирательства.Как запланировать действие в различные тайминги из списка в Python

Что мне до сих пор дает мне (например, после запуска один раз) список раз раз: [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()) 

EDIT на основе предложений 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) (' hello world ',' - now: ', 11.040000200271606) (' hello world ',' - now: ', 18.897000074386597) , который очень близок к моим элементам списка (например, таймингам и чего я изначально хотел).

+0

Что сейчас не работает? –

+0

Привет автобус! Не похоже, что он обрабатывает элементы списка «times» как прошедшее время с начала. Может быть, мне нужно определить начало какого-то рода, но потом не знаю, что с ним делать. – Spica

+0

Есть ли какая-то особая причина для использования 'global'? Я не уверен, что это связано с вашей проблемой. –

ответ

2

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 Гц ~ 16.7ms)

После редактирования по OP: .. простой способ проверить, не связаны ли синхронизация времени с синхронизацией кадров, чтобы отключить вертикальную синхронизацию (V-Sync) для вашей видеокарты и повторно запустить ее - я подозреваю, что вы получите намного лучше таймингов, однако вы можете получить рану на вашем дисплее - тогда это ваш звонок что важнее для вас, качество изображения или точность синхронизации. Другой вариант, чтобы доказать, что это нужно, - это просто изменить частоту обновления и посмотреть, не меняется ли разница во времени.

Я замечаю, что вы вернулись к использованию времени.time() - это будет МЕНЬЕ точнее, чем использование возвращаемого объекта из waitTime в соответствии с моей демонстрацией (то есть mydata = yield viztask.waitTime(cuetime) ...)

+0

Спасибо, jacanterbury! Я изменил команду печати для печати ('Now:', viz.tick(), 'Wait time:', cuetime, '- Истекшее время:', mydata.elapsed). Просто чтобы показать, что сама печать не выполняется при таймингах в списке. Интересно, почему я получил ('Now:', 2.376125239373963, 'Wait time:', 2, '- Истекшее время:', 2.0099786548416336) ('Now:', 5.378527175519809, 'Wait time:', 3, '- Elapsed время: ', 3.002428450099741) (' Now: ', 9.3816914591142,' Wait time: ', 4,' - Истекшее время: ', 4.003159436957659) – Spica

+0

Это означает, что «Сейчас» и «Истекшее время» не совпадают , даже если «прошедшее время» и «время ожидания» эквивалентны. – Spica

+0

Из справочных страниц: .tick(): Эта команда вернет текущее время в секундах, начиная с запуска скрипта. прошедшее время - это время, в течение которого waitTime() ждал – jacanterbury

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() 
+0

Спасибо busfault, функция и петля выглядят чище сейчас! И ты прав насчет урожая. Но проблема по-прежнему заключается в том, что она не рассматривает эти элементы как тайминги (играется в те секунды с начала судебного разбирательства). Теперь я пытаюсь обернуть голову вокруг функций таймера. Может быть, мне нужно где-то сказать, что эти элементы - это наборы. – Spica