我最近发现了很棒的baudio NodeJS库。

我有以下代码:

var baudio = require("baudio")
  , b = baudio()
  , tau = 2 * Math.PI
  ;

function playSound (f, duration) {

    console.log(f, duration);

    b.push(function (t) {
        return (square (f) + square (f + 1)) * (t < duration);
        function square (freq) {
            return Math.sin(tau * t * freq) < 0 ? -1 : 1;
        }
    });

    b.play();
}
playSound(440, 2)将播放A键2秒钟。这是正确的。如果我再次调用playSound函数,将不会播放其他声音。

为什么?在播放第一个或正在播放的声音后,如何播放其他声音?

最佳答案

您的playSound()函数应该在几秒钟内接受参数t,并且您可以使用模数回放声音。例如,请考虑以下采摘功能:

return function (t, i) {
  return pluck(t % 0.5, 100, 10, 10);
}

function pluck (t, freq, duration, steps) {
    var n = duration;
    var scalar = Math.max(0, 0.95 - (t * n) / ((t * n) + 1));
    var sum = 0;
    for (var i = 0; i < steps; i++) {
        sum += Math.sin(2 * Math.PI * t * (freq + i * freq));
    }
    return scalar * sum / 6;
}

Use this link to experiment with a live version

请勿在歌曲中使用setTimeout,setInterval或其他类型的IO。由于baudio与事件循环的交互方式(它固定,并且系统时间与音乐时间之间不存在1:1的对应关系),因此执行效果会非常差。

10-05 21:57