oscillator.detune() 在网络音频 API 中如何工作?

How does oscillator.detune() work in Web Audio API?

我读到 1200 音分是 1 个八度。

所以,我尝试了以下方法:

const audioContext = new AudioContext();

function Oscillator(frequency, detune) {
    this.oscillator = audioContext.createOscillator();
    this.oscillator.connect(audioContext.destination);

    this.oscillator.frequency.value = frequency;
    this.oscillator.detune.value = detune;

    this.oscillator.start(0);
    this.oscillator.stop(3);
    console.log('Playing new oscillator!');
}

案例 1:

const x = 200;
new Oscillator(x, 1200);
new Oscillator(2 * x, 0);

对于 x 的所有值,两个振荡器都单独产生相同的声音,这对我来说很有意义,因为 1200 音分失谐是一个八度(频率的两倍)。

案例二:

const x = 200;
new Oscillator(x, 600);
new Oscillator(x * 1.5, 0);

所以,我预计如果我在美分方面达到一半,那么频率应该提高 50%。但是,当我单独听到它们时,对于许多不同的 x 值,它们都会产生不同的声音。听起来这两种声音频率相同但振幅不同

我不明白为什么会这样。这个你能帮我吗。我对声音背后的物理学还很陌生。

将失谐参数值转换为 Hz 的公式为 Math.pow(2, detune / 1200)

https://webaudio.github.io/web-audio-api/#oscillatornode

这意味着您的第二个示例应该是...

const x = 200;

new Oscillator(x, 701.95);
new Oscillator(x * 1.5, 0);

...或...

const x = 200;

new Oscillator(x, 600);
new Oscillator(x * 1.414, 0);