正弦波.js设置新频率时不会播放多个音符

Sinewave.js won't play several notes when the new frequency is set

本文关键字:播放 音符 设置 js 新频率 频率 正弦波      更新时间:2023-09-26

我在尝试让正弦波.js插件连续演奏多个音符时遇到问题。

链接到正弦波.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);
}
}

"test"命令只播放两个音符的第一个音符,而实际通过刻度频率的那个不播放任何音符,但从阵列中打印出正确的音调。

我试图实现的是"cmajor"命令将播放一个音阶,每 1 秒一个音符。

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

尝试以下操作:

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

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

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