0

我在尝试让 sinewave.js-plugin 连续播放多个音符时遇到问题。

链接到 sinewave.js Github 页面

这是我的代码。

scalePlayer = function(){
var command = arguments[0]; 

if (command == 'play'){
    sinewave.setFrequency(261.63); // C4
    sinewave.play();
}else if (command == 'pause'){
    sinewave.pause();
}else if (command == 'cmajor'){
    // C major scale
    var scale=[
        "130.81",
        "146.83",
        "164.81",
        "174.61",
        "196.00",
        "220.00",
        "246.94",
        "261.63"];
    s = scale.length;
    i=0;
    while (i<=s){
        setTimeout("sinewave.setFrequency("+parseFloat(scale[i])+")", 1000);
        console.log(parseFloat(scale[i]));
      i++;
     }  

}else if (command == 'test'){
        setTimeout("sinewave.setFrequency(300)", 1000);
        setTimeout("sinewave.setFrequency(500)", 1000);
}
}

“测试”命令只播放两个音符中的第一个音符,而实际通过音阶频率的那个不播放任何内容,但会从数组中打印出正确的音调。

我想要实现的是“cmajor”命令会播放一个音阶,每 1 秒一个音符。

我觉得 setTimeout 引起了问题,我不明白为什么“测试”命令不会播放两个不同的音符。

4

1 回答 1

0

尝试以下操作:

 while (i<s){
    setTimeout("sinewave.setFrequency("+parseFloat(scale[i])+")", 1000 * i);
    console.log(parseFloat(scale[i]));
  i++;
 }  

因为超时都是在循环中一个接一个地设置的,没有延迟(在 cpu 速度下,比如分配之间的几毫秒)。所以你需要把它们分开,就像告诉第一个,“等一秒钟”,下一个,“等两个”等等。

在测试时,我还注意到i <= s导致 NaN,所以我将其更改为i < s.

于 2012-05-29T17:33:36.830 回答