Уникальный стереовход для ScriptProcessorNode
Я надеюсь реализовать аудиоэффекты в API Web Audio, которые требуют постоянного доступа к двум или более аудиопотокам.
Я могу определить процессор сценария с 2 входными каналами и 2 выходными каналами:
var mod = context.createScriptProcessor(4096,2,2);
Затем я могу подключить несколько синусоидальных волн к этому процессору:
mySine.connect(mod);
mySine2.connect(mod);
Есть ли способ подключить их к определенному входному каналу аудиопроцессора?
В конце концов, когда я пишу функцию onaudioprocess и слушаю каждый входной канал отдельно, каждый входной канал содержит все звуки, подключенные к процессору. У меня нет способа получить доступ к каждой синусоиде отдельно в рамках функции onaudioprocess. Это правильно? Или есть способ подключить звуки к одному входному каналу скриптового процессора?
1 ответ
Вы можете создать два идентичных одноканальных ScriptProcessors или использовать объединение каналов, чтобы назначить две синусоидальные волны каждому каналу обработчика сценариев следующим образом:
var context = new AudioContext();
var sineA = context.createOscillator();
sineA.type = 'sine';
sineA.frequency.value = 300;
var sineB = context.createOscillator();
sineB.type = 'sine';
sineB.frequency.value = 100;
var script = context.createScriptProcessor(4096, 2, 2);
// create 2 channel merger node
var merger = context.createChannelMerger(2);
// connect sineA to channel 0
sineA.connect(merger, 0, 0);
// connect sineA to channel 1
sineB.connect(merger, 0, 1);
// connect the script to the merger
merger.connect(script);
// process the audio data of each channel
script.onaudioprocess = function(event) {
var input = event.inputBuffer;
var output = event.outputBuffer;
var inputA = input.getChannelData(0);
var inputB = input.getChannelData(1);
var outputA = output.getChannelData(0);
var outputB = output.getChannelData(1);
for (var i = 0; i < input.length; i++) {
outputA[i] = inputA[i];
outputB[i] = inputB[i];
}
}
script.connect(context.destination);
sineA.start();
sineB.start();