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);
}
}

「テスト」コマンドは、2 つの音のうち最初の音のみを再生し、実際にスケール周波数を通過する音は何も再生しませんが、配列から正しい音を出力します。

私が達成しようとしているのは、「cmajor」コマンドが 1 秒ごとに 1 つの音階を再生することです。

setTimeout が問題を引き起こしているように感じます。なぜ「test」コマンドが 2 つの異なるノートを再生しないのか理解できません。

4

1 に答える 1

0

次のことを試してください。

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

タイムアウトはすべて、ループ内で遅延なく次々に設定されるためです (CPU 速度では、割り当て間の数ミリ秒と言います)。そのため、最初のものに「1 秒待って」、次のものに「2 秒待って」というように、それらを分散させる必要があります。

テスト中に NaN になることにも気付いi <= sたので、 に変更しましたi < s

于 2012-05-29T17:33:36.830 に答える