Я работаю над программой для преобразования текста в азбуку Морзе.
Скажи, что я sos
в sos
Моя программа превратит это в массив [1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1]
. Где s = dot dot dot
(или 1,1,1
), а o = dash dash dash
(или 2,2,2
). Эта часть довольно проста.
Далее у меня есть два звуковых файла:
var dot = new Audio('dot.mp3');
var dash = new Audio('dash.mp3');
Моя цель - иметь функцию, которая будет воспроизводить dot.mp3
когда он видит 1
, и dash.mp3
когда он видит 2
, и dash.mp3
паузу, когда он видит 0
.
Следующий вид/вид/иногда работает, но я думаю, что это в корне ошибочно, и я не знаю, как это исправить.
function playMorseArr(morseArr) {
for (let i = 0; i < morseArr.length; i++) {
setTimeout(function() {
if (morseArr[i] === 1) {
dot.play();
}
if (morseArr[i] === 2) {
dash.play();
}
}, 250*i);
}
}
Эта проблема:
Я могу перебирать массив и воспроизводить звуковые файлы, но выбор времени - это проблема. Если я не установлю интервал setTimeout()
просто правильно, если последний аудиофайл не будет воспроизведен, и 250ms
истекли, следующий элемент в массиве будет пропущен. Таким образом, dash.mp3
длиннее, чем dot.mp3
. Если мое время слишком короткое, я могу услышать [dot dot dot pause dash dash pause dot dot dot]
или что-то в этом роде.
Эффект, который я хочу
Я хочу, чтобы программа работала так (в псевдокоде):
- посмотреть на
ith
элемент массива - если
1
или2
, начните воспроизведение звукового файла или создайте паузу - дождитесь окончания звукового файла или сделайте паузу
- увеличьте
i
и вернитесь к шагу 1
Что я думал, но не знаю, как реализовать
Итак, главное, что я хочу, чтобы цикл проходил синхронно. Я использовал обещания в ситуациях, когда у меня было несколько функций, которые я хотел выполнить в определенном порядке, но как мне связать неизвестное число функций?
Я также подумал об использовании пользовательских событий, но у меня та же проблема.