Gain- и PannerNode имеют минимальное и максимальное значения. Контролируйте свой ввод, чтобы эти диапазоны соблюдались. Но проблема кроется в другом месте.
const ctx = new AudioContext();
const gainNode = ctx.createGain();
const panNode = ctx.createStereoPanner();
console.log(gainNode.gain.minValue, gainNode.gain.maxValue);
console.log(panNode.pan.minValue, panNode.pan.maxValue);
Соединение узлов является критическим. Что помогает мне, так это смотреть на нее как на гитару (или любой другой электрический инструмент) с проводами, которые необходимо подключить. Один провод идет от гитары к педали усиления, этот провод идет к педали панорамирования, а этот провод идет к усилителю для вывода сигнала.
То же самое относится и к вашим узлам. Подключите source
(гитара) к gainNode
(педаль усиления), затем gainNode
к panNode
(педаль панорамирования) и panNode
к audioContext.destination
(усилитель).
audioContext.decodeAudioData(se.name.split(`,`)[1].base64ToArrayBuffer(), function(buffer) {
source.buffer = buffer;
source.connect(gainNode);
gainNode.connect(panNode);
panNode.connect(audioContext.destination);
source.detune.value = (se.pitch - 100);
source.start(0);
});
На самом деле попытайтесь визуализировать это так. Может быть, даже нарисовать это на бумаге, если вы сделаете это более сложным.
Несколько узлов могут быть подключены к одному месту назначения. Как наличие нескольких источников, которые проходят через одни и те же эффекты к месту назначения. Вы даже можете сделать из этого коммутатор, подключая и отключая ваши узлы к и от разных мест назначения, в зависимости от того, что вам нужно.
Надеюсь, это поможет. Если у вас есть какие-либо вопросы или мне неясно, пожалуйста, дайте мне знать.