在 midijs 中循环播放音频?

Looping audio in midijs?

提问人:K. Russell Smith 提问时间:7/12/2021 最后编辑:General GrievanceK. Russell Smith 更新时间:2/15/2023 访问量:164

问:

我正在尝试使用MIDIjs来播放音频(特别是因为我使用的WAD.js使用它)。不幸的是,我无法弄清楚如何循环音频,令人沮丧的是缺乏文档,而且我在源代码中找不到任何内容。至少我想知道文件何时自然结束以使用 重新启动,但我什至没有看到任何相关内容。MIDIjs.play()

如果有人向我指出解决方案,我将不胜感激,谢谢。

JavaScript MIDI

评论


答:

1赞 General Grievance 8/6/2021 #1

没错,没有循环函数(此处的任何地方都有记录)。

但是,我们至少可以用 来模拟它,它每 100 毫秒调用一次,对象看起来像 。这是经过的时间(以秒为单位)。我们可以将其与检测播放结束相结合。MIDIjs.player_callback{ 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);
            }
        };
    });
}

注意:

这每次都会调用,因此它可能会重新下载源代码(文档似乎暗示情况总是如此)。如果你想要一些更高效的网络,你可能需要研究 XHR/AJAX 并创建一个对象 URL,因为文档确实指定了一个 URL。但是,我认为这将是最简单的解决方案,它确实显示了您必须做什么才能在结束时再次播放 MIDI 曲目。playplay

1赞 Pilot_51 2/15/2023 #2

我遇到了同样的问题,并且对另一个答案中的解决方法并不完全满意,因为每次将 url 传递到 MIDIjs 函数时,它都会重新加载文件,并且似乎循环得有点太早了。

因此,我开始深入研究 MIDIjs 源代码,它也有一个映射文件,但我没有费心尝试最大化/反混淆它。我注意到有几个提到它是由函数中的第二个参数设置的。我不确定,但我想也许是,所以我尝试了一下。looptXXplay

MIDIjs.play(url, true);

成功了!

由于我正在使用 Kotlin/JS,因此这是我的代码:external

external object MIDIjs {
    fun play(url: String, loop: Boolean = definedExternally)
    fun stop()
}

在 Kotlin 中以完全相同的方式调用它,不带分号。

MIDIjs.play(url, true)

评论

0赞 General Grievance 9/5/2023
好东西。我讨厌文档没有提到非常有用的东西。