Звуки психопии, воспроизводимые из смеси CSV-файлов (время измеряется в кадрах) - PullRequest
0 голосов
/ 25 апреля 2018

В эксперименте, который я готовлю, звуки воспроизводятся из файла CSV, а время измеряется в кадрах. Учитывая тот факт, что каждый звук длится 300 мс, это равняется 18 кадрам.

from psychopy import data
from psychopy import core, visual, gui, data, event
from psychopy.tools.filetools import fromFile, toFile
import numpy, random, csv, time
from psychopy import logging, prefs
prefs.general['audioLib'] = ['pyo']  # Set the Audio Library [pyo (highest performer, check it), sounddevice (looks promessing, check it) or pygame (not good with timing)]
prefs.general['audioDriver']=['coreaudio']
from psychopy import sound


win = visual.Window([400,300], monitor="testMonitor", units="cm", fullscr=False)
stimuli = []
datafile = open("audioStim.csv", "rb")
reader = csv.reader(datafile, delimiter=";")
for row in reader:
    stimuli.append(row[0])
    #print (stimuli)
datafile.close()

clock = core.Clock()
for stimulus in stimuli:
    #print (stimuli)
    for frameN in range(18):
        #print clock.getTime()
        sound_stimulus = sound.Sound(stimulus)
        sound_stimulus.play()
        win.callOnFlip(clock.reset)
        win.flip()



## Closing Section
win.close()
core.quit()

При проведении эксперимента звуки, кажется, смешиваются друг с другом. Они не звучат дискретно. Результат немного проблематичен, это проблема с Psychopy (не хорошего качества, когда звуки такие короткие?) Или с кодом?

Спасибо за ваше время! Любые другие рекомендации или предложения по улучшению кода приветствуются.

1 Ответ

0 голосов
/ 26 апреля 2018

Ваш код начинает воспроизводить звук в каждом кадре, т. Е. 60 раз в секунду.Сделайте это:

for stimulus in stimuli:
    #print (stimuli)
    for frameN in range(18):
        #print clock.getTime()
        win.flip()
        if frameN == 0:
            sound_stimulus = sound.Sound(stimulus)
            sound_stimulus.play()
            clock.reset()  # Time zero is stimulus onset

Я сделал две вещи здесь.Во-первых, я запускаю sound_stimulus.play() и clock.reset() только при включенном режиме, но не при последующих обновлениях.Во-вторых, я включил звук ПОСЛЕ win.flip, чтобы он был приурочен к щелчку.Если вы играете до переворота, звук может начаться в любом месте с интервалом 16,7 мс (но, вероятно, будет только для самого первого испытания).

Кстати, так как вы на самом деле не используете переменную sound_stimulus, вы можете упростить код еще больше:

        if frameN == 0:
            sound.Sound(stimulus).play()
...