正弦波.js设置新频率时不会播放多个音符
Sinewave.js won't play several notes when the new frequency is set
我在尝试让正弦波.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
.
相关文章:
- 如何播放部分音频文件
- HTML5音频加载和播放获胜'我不能在iPad上工作
- 播放当前视频时如何停止其他视频?JavaScript
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- 是否可以使用iframe API在iOS浏览器上播放youtube视频
- 如何检查用户在html5视频播放器中观看了完整的视频
- tiltSlider播放/暂停视频元素(如果li有当前类)
- 可以在响应时隐藏iphone上的“播放”按钮以进行视频播放
- JS,用于播放提示音以通知未按预期工作
- 只在滚动时播放循环css动画-滚动停止时停止
- 让javascript知道epub3电子书中何时播放媒体覆盖
- 我可以使此幻灯片图像自动播放吗?
- CSS动画暂停并使用javascript播放
- YouTube作为弹出窗口在桌面版本上播放,但不在移动设备上播放
- 音乐播放器使用相同的id播放所有内容
- 使用 Javascript 播放音符
- 正弦波.js设置新频率时不会播放多个音符
- JS AudioContext振荡器-同时播放多个音符(复调)
- 如何实现用于音符序列的MIDI.js MIDI播放器
- 我如何使用javascript播放任意MIDI音符