Как правильно суммировать буферы многоканального звука в моно?

Я использую разделитель каналов и слияние, чтобы попытаться разделить стерео файл на два дискретных канала, а затем направить их обратно в граф узлов в качестве «моно» источника входного сигнала, который воспроизводится как на левом, так и на правом мониторе. Я придумал, как это сделать, но он использует узел stereoPanner, установленный на 0,5, и это кажется немного "хакерским". Как мне это сделать без использования узла stereoPanner?

//____________________________________________BEGIN Setup

var merger = audioContext.createChannelMerger();
var stereoPanner = audioContext.createStereoPanner();
var stereoInputSource = audioContext.createBufferSource();
stereoInputSource.buffer = soundObj.soundToPlay;

//____________________________________________END Setup


stereoInputSource.connect(merger, 0, 0);
merger.connect(stereoPanner);

stereoPanner.pan.value = 0.5;

stereoPanner.connect(audioContext.destination);

person William    schedule 14.02.2016    source источник


Ответы (3)


Создать ChannelMerger только с одним каналом и использовать для принудительного понижающего микширования?

person cwilso    schedule 14.02.2016
comment
Я ответил на свой вопрос, но согласен, что подумал бы использовать для этого слияние. Мне нужен был только разделитель каналов. Мне любопытно, что вы думаете об опубликованном мной ответе. - person William; 14.02.2016

Просто возьмите среднее значение левой и правой выборки.

person Greg Valcourt    schedule 14.02.2016
comment
Я не знаю, как это сделать, хотите показать код? - person William; 14.02.2016

Думаю, я слишком долго об этом подумал. Кажется, работает следующее. Я думаю, что названия узлов немного сбивают с толку. Я бы хотел, чтобы для этого мне понадобился узел слияния

stereoInputSource.connect(splitter);

splitter.connect(monoGain, 0); // left output
splitter.connect(monoGain, 1); // right output

monoGain.connect(audioContext.destination);

ИЗМЕНИТЬ

Крис упомянул «правильный» способ. Меня смутила явная установка выходного канала при вызове узла слияния.

var stereoInputSource = audioContext.createBufferSource();
var merger = audioContext.createChannelMerger(1); // Set number of channels

stereoInputSource.buffer = soundObj.soundToPlay;
stereoInputSource.connect(merger);
merger.connect(audioContext.destination)
person William    schedule 14.02.2016
comment
Единственная проблема заключается в том, что вы должны установить моногейн на 0,5, чтобы суммирование не ограничивалось. (Кстати, это то же самое, что и средний ответ выше.) - person cwilso; 15.02.2016