Уникальный стереовход для ScriptProcessorNode

Я надеюсь реализовать звуковые эффекты в API веб-аудио, которые требуют непрерывного доступа к двум или более аудиопотокам.

Я могу определить обработчик сценариев с 2 входными каналами и 2 выходными каналами:

var mod = context.createScriptProcessor(4096,2,2);

Затем я могу подключить несколько синусоид к этому процессору:

mySine.connect(mod);
mySine2.connect(mod);

Есть ли способ подключить их к определенному входному каналу аудиопроцессора?

В конце концов, когда я пишу функцию onaudioprocess и слушаю каждый входной канал по отдельности, каждый входной канал содержит все звуки, подключенные к процессору. У меня нет возможности получить доступ к каждой синусоидальной волне отдельно в функции onaudioprocess. Это правильно? Или есть способ подключить звуки к одному входному каналу скриптового процессора?


person suncannon    schedule 16.10.2014    source источник


Ответы (1)


Вы можете либо создать два идентичных одноканальных процессора сценариев, либо использовать объединение каналов, чтобы назначить две синусоидальные волны каждому каналу процессора сценариев следующим образом:

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();

person imcg    schedule 17.10.2014
comment
Используйте слияние каналов. Вот для чего он нужен. - person cwilso; 17.10.2014