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 (заголовки экрана и т. Д.) Работает для всех испытаний.
У кого-нибудь есть идея, почему это происходит? Я был бы так благодарен, у меня действительно нет выбора...
Огромное спасибо заранее!