Зацикливание звука в середине?

#javascript #midi

Вопрос:

Я пытаюсь использовать MIDIjs для воспроизведения звука (в частности, потому, что я использую WAD.js, который его использует). К сожалению, я не могу понять, как зациклить звук, из-за досадного отсутствия документации, и я ничего не нахожу в исходном коде. По крайней мере , я хотел бы знать, когда файл естественным образом закончился, чтобы перезапустить MIDIjs.play() его, но я даже не вижу ничего для этого.

Я был бы признателен, если бы кто-нибудь указал мне на решение, спасибо.

Ответ №1:

Правильно, функции цикла нет (это нигде здесь не задокументировано).

Тем не менее, мы можем , по крайней мере, смоделировать это с MIDIjs.player_callback помощью, которая вызывается каждые 100 мс с объектом, который выглядит так { time : number } . Это время в секундах, прошедших. Мы можем объединить это с get_duration определением конца воспроизведения.

 function playAutoReset(url)
{
    // get_duration requires a callback as it returns nothing.
    MIDIjs.get_duration(url, function (duration)
    { 
        console.info(`Duration: ${duration}`);
        // Start the initial play
        MIDIjs.play(url);
        
        // This lets us keep track of current play time in seconds
        MIDIjs.player_callback = function (mes)
        {
            if (mes.time / duration >= 1)
            {
                console.info('End reached');
                // This plays the audio again
                MIDIjs.play(url);
            }
        };
    });
}
 

Примечание:

Это действительно вызывает play каждый раз, поэтому, вероятно, он повторно загрузит исходный код (документы, похоже, подразумевают, что это всегда так). Если вам нужно что-то более эффективное для работы в сети, вы можете изучить XHRs/AJAX и создать URL-адрес объекта, как указано в документах, который play принимает URL-адрес. Тем не менее, я подумал, что это будет самое простое решение, и оно действительно показывает, что вам нужно сделать, чтобы снова воспроизвести midi-дорожку, когда она закончится.