Как работает oscillator.detune () в API Web Audio? - PullRequest
0 голосов
/ 06 апреля 2020

Я прочитал, что 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 все они производили разные звуки. Казалось, что оба звука имеют одинаковую частоту, но разную амплитуду.

Я не могу понять, почему это происходит. Пожалуйста, помогите мне с этим. Я совершенно новичок в физике звуков.

1 Ответ

1 голос
/ 06 апреля 2020

Формула для преобразования значения параметра детонации в Гц: 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);
...