我读过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
的许多不同值,它们都会产生不同的声音。听起来好像两种声音的频率相同但幅度不同。
我无法理解为什么会这样。这个你能帮我吗。我对声音背后的物理知识还很陌生。
将失谐参数的值转换为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);