Я работаю над программой для преобразования текста в азбуку Морзе.
Скажи, что я 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
Что я думал, но не знаю, как реализовать
Итак, главное, что я хочу, чтобы цикл проходил синхронно. Я использовал обещания в ситуациях, когда у меня было несколько функций, которые я хотел выполнить в определенном порядке, но как мне связать неизвестное число функций?
Я также подумал об использовании пользовательских событий, но у меня та же проблема.