Я создаю синтезаторный голос, который содержит три осциллятора, как вы можете видеть в следующем фрагменте.
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. Это как-то масштабируется? Я что-то пропустил?