振荡器.detune()如何在Web Audio API中工作?

问题描述 投票:0回答:1

我读过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美分的失谐频率增加了一个八度(频率的两倍)。

案例2:

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

因此,我希望如果我能获得一半的美分,那么频率应该会提高50%。但是,当我分别听到它们时,对于x的许多不同值,它们都会产生不同的声音。听起来好像两种声音的频率相同但幅度不同。

我无法理解为什么会这样。这个你能帮我吗。我对声音背后的物理知识还很陌生。

frequency web-audio-api javascript-oscillator
1个回答
0
投票

将失谐参数的值转换为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);
© www.soinside.com 2019 - 2024. All rights reserved.