Как преобразовать двухканальный звук в моно с возможностью управления громкостью каждого канала? - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь прослушивать 2-канальный звук в обоих наушниках (одинаковый звук в левом и правом наушниках).

Текущая ситуация:

Слайдер по центру - отлично работает (оба канала в обоих наушниках).

Ползунок справа - отлично работает (правый канал в обоих наушниках).

Ползунок слева - не работает (левый канал только в левом наушнике).

const splitter = wavesurfer.backend.ac.createChannelSplitter(2);
const merger = wavesurfer.backend.ac.createChannelMerger(2);
const leftGain = wavesurfer.backend.ac.createGain();
const rightGain = wavesurfer.backend.ac.createGain();
const panner = wavesurfer.backend.ac.createPanner();

splitter.connect(leftGain, 0);
splitter.connect(rightGain, 1);

leftGain.connect(merger, 0, 0);
rightGain.connect(merger, 0, 1);

merger.connect(panner);

let slider = document.querySelector('#Slider');
$(slider ).change(function () {
    rightGain.gain.value = Number(slider.value);
    leftGain.gain.value = 1- (Number(slider.value));
})

wavesurfer.backend.setFilters([splitter, leftGain, rightGain, merger]);

Когда слайдер находится слева, я хочу слышать только левый канал в обоих наушниках. Кто-нибудь может мне помочь?

Задача

1 Ответ

0 голосов
/ 06 июня 2019

При вызове setFilters () waversurfer.js соединит все предоставленные узлы в простой цепочке. В вашем случае это означает, что он создаст дополнительные соединения, как это:

splitter.connect(leftGain);
leftGain.connect(rightGain);
rightGain.connect(merger);

Это, вероятно, не то, что вы хотите. Но возможно использовать это поведение. Я немного изменил ваш пример.

const input = wavesurfer.backend.ac.createGain();
const splitter = wavesurfer.backend.ac.createChannelSplitter(2);
const merger = wavesurfer.backend.ac.createChannelMerger(2);
const leftGain = wavesurfer.backend.ac.createGain();
const rightGain = wavesurfer.backend.ac.createGain();

// This will make sure that a mono signal gets upmixed to stereo.
// If you always have stereo sound you can remove it.
input.channelCountMode = 'explicit';

// It is only necessary to connect the right channel
// because this is the one which needs optional parameters.
splitter.connect(rightGain, 1);
rightGain.connect(merger);
rightGain.connect(merger, 0, 1);

// Only the one connection which needs an optional parameter
// needs to be done for the left channel
leftGain.connect(merger, 0, 1);

// wavesufer.js will connect everything else.
wavesurfer.backend.setFilters([ input, splitter, leftGain, merger ]);

Я также добавил еще один GainNode в качестве первого узла, чтобы убедиться, что сигнал микшируется в стерео, если он монофонический. И я удалил PannerNode, так как он не использовался в вашем примере.

...