Неверная частота генератора, установленная 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);
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 ответа
Я думаю, что проблема в том, что когда вы подключаете 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/
По умолчанию для частоты OscillatorNode установлено значение 440, но для смещения по умолчанию установлено значение 160.