来自具有睡眠功能的振荡器的 JS 音频音符序列



我正在尝试创建一个简单的函数playTone(freq, dur),该函数以freq赫兹播放dur(毫秒)秒的音调。

我无法让函数等待上一个笔记完成,然后再开始一个新的笔记。我的代码如下,使用此站点的sleep函数。我还不了解 JS 的同步/异步功能,我想让事情尽可能简单。任何人都可以帮助使我的代码工作吗?目前,所有音符都一起演奏。

<script>
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}
function playTone(freq, dur) {
    var audio = new AudioContext();
    var osc = audio.createOscillator();
    var gainNode = audio.createGain()
    gainNode.gain.value = 0.2
    osc.frequency.value = freq;
    osc.type = "square";
    osc.connect(gainNode);
    gainNode.connect(audio.destination);
    osc.start(0);
    osc.stop(dur);
}
for (var i = 0; i < 20; i++) {
    playTone(440 + 10 * i, 1);
    sleep(1000);
}
</script>

这不是最好的方法,但你可以创建一个递归方法,如下所示:

function playTone(freqs, idx, dur) {
    var audio = new AudioContext();
    var osc = audio.createOscillator();
    var gainNode = audio.createGain()
    gainNode.gain.value = 0.2
    osc.frequency.value = freqs[idx];
    osc.type = "square";
    osc.connect(gainNode);
    gainNode.connect(audio.destination);
    osc.start(0);
    setTimeout(function() {
        osc.stop(0); //Now setTimeout controls the stop
        if (freqs[idx + 1]) {
            playTone(freqs, idx + 1, dur);
        }
    }, dur);
}
var frequencies = [];
for (var i = 0; i < 20; i++) {
    frequencies.push(440 + 10 * i);
}
playTone(frequencies, 0, 1000);

最新更新