我最近发现了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
功能,则不会播放其他声音。
为什么呢?在播放或播放第一个声音后,如何播放其他声音?
答案 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中不太好......不确定为什么