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 音分失谐是一个八度音阶(频率的两倍)。

案例二:

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

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

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

4

1 回答 1

2

将失谐参数的值转换为 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);
于 2020-04-06T13:12:37.723 回答