Неверная частота генератора, установленная ConstantSourceNode - PullRequest
0 голосов
/ 05 января 2019

Я создаю синтезаторный голос, который содержит три осциллятора, как вы можете видеть в следующем фрагменте.

const ctx = new AudioContext();

const osc1 = ctx.createOscillator();
osc1.type = "sawtooth";
osc1.start();
const osc2 = ctx.createOscillator();
osc2.type = "sawtooth";
osc2.detune.setValueAtTime(1200, ctx.currentTime);
osc2.start();
const osc3 = ctx.createOscillator();
osc3.type = "sawtooth";
osc3.detune.setValueAtTime(1900, ctx.currentTime);
osc3.start();

const gain = ctx.createGain();
gain.gain.value = 0.2;
gain.connect(ctx.destination);

osc1.connect(gain);
osc2.connect(gain);
osc3.connect(gain);

osc1.frequency.value = 160;
osc2.frequency.value = 160;
osc3.frequency.value = 160;

Чтобы воспроизвести мелодию, я бы хотел контролировать частоту всех генераторов одним AudioParam. Я обнаружил, что это должно быть сделано через ConstantSourceNode. Но по какой-то причине он теперь воспроизводит другую частоту, чем я установил.

const ctx = new AudioContext();

const osc1 = ctx.createOscillator();
osc1.type = "sawtooth";
osc1.start();
const osc2 = ctx.createOscillator();
osc2.type = "sawtooth";
osc2.detune.setValueAtTime(1200, ctx.currentTime);
osc2.start();
const osc3 = ctx.createOscillator();
osc3.type = "sawtooth";
osc3.detune.setValueAtTime(1900, ctx.currentTime);
osc3.start();

const gain = ctx.createGain();
gain.gain.value = 0.2;
gain.connect(ctx.destination);

osc1.connect(gain);
osc2.connect(gain);
osc3.connect(gain);

const control = ctx.createConstantSource();
control.connect(osc1.frequency);
control.connect(osc2.frequency);
control.connect(osc3.frequency);
control.start();
control.offset.value = 160;

Я заметил, что minValue и maxValue различаются для частоты генератора AudioParam и смещения ConstantSource AudioParam. Это как-то масштабируется? Я что-то пропустил?

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Мне кажется, проблема в том, что при подключении AudioNode к AudioParam выходной сигнал AudioNode смешивается с внутренним значением AudioParam.

В вашем конкретном примере это означает, что фактическая частота будет равна 600. Частота генератора по умолчанию равна 440. Это смешивается со значением, полученным из ConstantSourceNode.

440 + 160 === 600

Для достижения желаемого результата вы можете установить значение каждого генератора на ноль.

osc1.frequency.setValueAtTime(0, ctx.currentTime);
osc2.frequency.setValueAtTime(0, ctx.currentTime);
osc3.frequency.setValueAtTime(0, ctx.currentTime);

Вот ссылка на часть спецификации, которая описывает это поведение: https://webaudio.github.io/web-audio-api/#dom-audionode-connect-destinationparam-output

0 голосов
/ 05 января 2019

По умолчанию для частоты OscillatorNode установлено значение 440, но для смещения по умолчанию установлено значение 160.

...