我最近发现了很棒的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的对应关系),因此执行效果会非常差。