Javascript: создание короткого тона во время каждого испытания в эксперименте

Я работаю с Javascript впервые и программирую эксперимент с часами Libet. Эти часы отображаются на экране, и точка делает два круга внутри часов (как будто это большая рука, проходящая через два часа). В одном из моих 4 условий где-то на этих двух кругах звучит короткий тон. Всего есть 20 испытаний, в которых должен быть создан короткий тон. Тем не менее, я запрограммировал его, и тон воспроизводится только для первых 5 испытаний. В следующем коде я указываю в переключателе, что сначала воспроизводится звук "playready" (только звук, указывающий на начало испытания). Затем часы начинают работать (startclock) и воспроизводится короткий сигнал (startound), если это 4-е условие (инструкция === 4)

    case this.STATE_TRIAL_READY:
    this.playReady(this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].getReady);
    if (this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].instruction === 4)
        this.startSound();
    break;

Функция startSound также вызывается в этом коде, где готовится пробная версия:

    startTrial: function (playSound) {
var progress;
if (this.trialsIndex < this.experiment.phases[this.phasesIndex].trials.length) {
  this.dot.style.display = 'block';
  this.prepareFeedback(this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].feedback);
  this.trialCurrentLap = 0;
  this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].keypressTrialTimes = [];
  this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].delay = Math.floor(Math.random() * (this.experiment.randomDelayMax - this.experiment.randomDelayMin + 1) + this.experiment.randomDelayMin);
  //Random delay MUST be different to the previous one, otherwise CSS3 Animation won't reset
  if (this.trialsIndex > 0) {
    while (this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].delay === this.experiment.phases[this.phasesIndex].trials[this.trialsIndex-1].delay) {
      this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].delay = Math.floor(Math.random() * (this.experiment.randomDelayMax - this.experiment.randomDelayMin + 1) + this.experiment.randomDelayMin);
    }
  }
  this.setClock(this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].delay, this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].cycle, this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].counterclockwise, this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].laps);
  progress = this.trialsIndex * 800 / this.experiment.phases[this.phasesIndex].trials.length;
  this.expScreenProgress.style.width = progress + 'px';
  if (playSound) {
    this.state = this.STATE_TRIAL_READY;

  } else {
    this.state = this.STATE_TRIAL_RUNNING;
    if (this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].instruction === 4) {
        this.startSound();
    } else {
        this.startClock();
    }
  }
} else {
  this.state = this.STATE_PHASE_END;
}
this.displayState();

},

Затем функция startSound выглядит следующим образом (я указываю "тон" в другом файле, например, через 5000 мс после запуска часов):

    startSound: function (i) {
i = i || 1;
i--;
this.dot.style.webkitAnimationPlayState = 'running';
this.dot.style.mozAnimationPlayState = 'running';
this.dot.style.animationPlayState = 'running'; // these 3 are to start the clock
var delay = this.experiment.phases[this.phasesIndex].trials[this.trialsIndex].tone / 1000;
var context = new (window.AudioContext || window.webkitAudioContext)();
var osc = context.createOscillator();
osc.type = 'sine';
osc.frequency.value = 1000;
osc.connect(context.destination);
osc.start(context.currentTime + delay);
osc.stop(context.currentTime + delay + 0.2); // stop 0.2 seconds after the current time

},

В остальной части кода я не нашел ничего, что указывало бы, что это должно быть сделано только 5 раз. Это всегда 5 раз (подряд), никогда более или менее, и я понятия не имею, почему. Он не зависит от частоты или синхронизации тона, и только тональный сигнал останавливается через 5 раз, потому что остальная часть кода для условия 4 (заголовки экрана и т. Д.) Работает для всех испытаний.

У кого-нибудь есть идея, почему это происходит? Я был бы так благодарен, у меня действительно нет выбора...

Огромное спасибо заранее!

0 ответов

Другие вопросы по тегам