播放baudio多个声音

时间:2014-03-01 19:42:23

标签: linux node.js audio sox

我最近发现了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功能,则不会播放其他声音。

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

2 个答案:

答案 0 :(得分:1)

你的playSound()函数应该在几秒钟内接受一个参数t,你可以使用modulo来重放声音。有关此示例,请考虑此pluck函数:

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的对应关系),它的表现非常差。

答案 1 :(得分:-1)

如果您运行playSound(440, 2);然后定期检查b.t,则会在2秒钟后看到它仍然在增加,如果您选中top或{{1 ,你会看到一个sox进程仍在继续。

事实证明,baudio几乎是sox的包装,它很甜,而baudio::play method returns a reference to a child process running sox

所以,无论如何,可能有更好的方法,但你可以通过在ps结束时终止流程并在每次调用duration时新建一个新流程来使其工作,如:< / p>

playSound

这在节点0.8.24中有效,但在0.10.26中不太好......不确定为什么