Javascript 使用Web音频API相互连接节点

Javascript 使用Web音频API相互连接节点,javascript,html,web-audio-api,Javascript,Html,Web Audio Api,我正在用我的音频做一些尝试: 增加/减少音频的总音量。 增加/减少左侧特定通道的音量和延迟。 我有以下代码: var audioContext = window.AudioContext || window.webkitAudioContext, context = new audioContext(), sourceNode = context.createMediaElementSource(document.getElementById('audio')); // Nod

我正在用我的音频做一些尝试:

增加/减少音频的总音量。 增加/减少左侧特定通道的音量和延迟。 我有以下代码:

var audioContext = window.AudioContext || window.webkitAudioContext,
    context = new audioContext(),
    sourceNode = context.createMediaElementSource(document.getElementById('audio'));

// Nodes to control the left channel
var channelSplitterNode = context.createChannelSplitter(1);

var leftChannelGainNode = context.createGain();
leftChannelGainNode.gain.value = 1.10;
channelSplitterNode.connect(leftChannelGainNode, 0);

var leftChannelDelayNode = context.createDelay();
leftChannelDelayNode.delayTime.value = 0.10;
channelSplitterNode.connect(leftChannelDelayNode, 0);

// Node to control the track's overall volume
var volumeGainNode = context.createGain();

// I think this might be where I mess up
sourceNode.connect(leftChannelGainNode);
sourceNode.connect(leftChannelDelayNode);
sourceNode.connect(volumeGainNode);
volumeGainNode.connect(context.destination);

// Change gain at any time like so 
// volumeGainNode.gain.value = 1.50;
// leftChannelDelayNode.delayTime.value = 1.50;
// leftChannelGainNode.gain.value = 2.00;
如何建立联系以实现我的目标


现场演示:

您需要将节点连接为链;可以将其视为配线电缆的概念

您还需要一个组合拆分通道的方法,请参阅了解其用法

因此,连接列表将是:

来源→ 分割节点 左声道→ 增益节点 增益节点→ 延迟节点 延迟节点+右通道→ 合并节点 合并节点→ 输出 以图形形式:

更新添加从Dan p.的fiddle更新的技术细节:

然后,使用代码的链将是:

// nodes
sourceNode = context.createMediaElementSource(audioPlayer);
splitter = context.createChannelSplitter(2);
gainL = context.createGain();
delayL = context.createDelay();
merger = context.createChannelMerger(2);
gainGeneral = context.createGain();        

// source to splitter
sourceNode.connect(splitter);

// left channel to gain
splitter.connect(gainL, 0);

// gain to delay
gainL.connect(delayL);

// delay to merger
delayL.connect(merger, 0, 0);

// remeber right channel to merger here:
splitter.connect(merger, 1, 1);

// merged signal to common gain node
merger.connect(gainGeneral);

// gain to output
gainGeneral.connect(context.destination);
演示: var gainL、delayL、gainGeneral、合并、拆分、上下文、源节点、音频播放器; audioPlayer=$'audioPlayer'[0]; $'play'。单击,函数{audioPlayer.play;}; context=new window.AudioContext | | window.webkitadiocontext; //节点 sourceNode=context.createMediaElementSourceaudioPlayer; splitter=context.createChannelSplitter2; gainL=context.createGain; delayL=context.createDelay; 合并=context.createChannelMerger2; gainGeneral=context.createGain; //源到分离器 sourceNode.connectsplitter; //左声道增益 splitter.connectgainL,0; //拖延 gainL.connectdelayL; //推迟合并 delayL.1,0,0; //请记住此处合并的正确渠道: 拆分器。合并,1,1; //合并信号到公共增益节点 合并.连接一般; //输出增益 gainGeneral.connectcontext.destination; $'。调整立体声btn'。单击,功能{ var action=$this.data'action'; 开关动作{ “正常”情况: 增益值=1.00; delayL.delayTime.value=0.00; 打破 案例“宽”:
//我推荐值您需要将节点连接为一条链;将其视为一种配线电缆的概念

您还需要一个组合拆分通道的方法,请参阅了解其用法

因此,连接列表将是:

来源→ 分割节点 左声道→ 增益节点 增益节点→ 延迟节点 延迟节点+右通道→ 合并节点 合并节点→ 输出 以图形形式:

更新添加从Dan p.的fiddle更新的技术细节:

然后,使用代码的链将是:

// nodes
sourceNode = context.createMediaElementSource(audioPlayer);
splitter = context.createChannelSplitter(2);
gainL = context.createGain();
delayL = context.createDelay();
merger = context.createChannelMerger(2);
gainGeneral = context.createGain();        

// source to splitter
sourceNode.connect(splitter);

// left channel to gain
splitter.connect(gainL, 0);

// gain to delay
gainL.connect(delayL);

// delay to merger
delayL.connect(merger, 0, 0);

// remeber right channel to merger here:
splitter.connect(merger, 1, 1);

// merged signal to common gain node
merger.connect(gainGeneral);

// gain to output
gainGeneral.connect(context.destination);
演示: var gainL、delayL、gainGeneral、合并、拆分、上下文、源节点、音频播放器; audioPlayer=$'audioPlayer'[0]; $'play'。单击,函数{audioPlayer.play;}; context=new window.AudioContext | | window.webkitadiocontext; //节点 sourceNode=context.createMediaElementSourceaudioPlayer; splitter=context.createChannelSplitter2; gainL=context.createGain; delayL=context.createDelay; 合并=context.createChannelMerger2; gainGeneral=context.createGain; //源到分离器 sourceNode.connectsplitter; //左声道增益 splitter.connectgainL,0; //拖延 gainL.connectdelayL; //推迟合并 delayL.1,0,0; //请记住此处合并的正确渠道: 拆分器。合并,1,1; //合并信号到公共增益节点 合并.连接一般; //输出增益 gainGeneral.connectcontext.destination; $'。调整立体声btn'。单击,功能{ var action=$this.data'action'; 开关动作{ “正常”情况: 增益值=1.00; delayL.delayTime.value=0.00; 打破 案例“宽”:
//我推荐值谢谢你的回答,有助于理解。我仍然没有得到我想要的结果,但是,也就是说,播放开始时,右声道的声音更大,而没有单击任何调整按钮,我认为其中一个原因可能是因为合并。我制作了一个现场演示,使之更易于使用:@DanP。唯一的原因是小提琴中似乎缺少的一点是,拆分器中的正确通道尚未连接回合并;splitter.ConnectMerge,1,1;谢谢,正在工作!我注意到的一点是更改延迟时发出咔哒声。使用setValueAtTime修复了它,例如delayL.delayTime.setValueAtTime0.005,audioContext.currentTime;。谢谢!谢谢你的回答,有助于理解。我仍然没有得到我想要的结果,但是,也就是说,播放开始时,右声道的声音更大,而没有单击任何调整按钮,我想其中一个原因可能是因为合并。我制作了一个现场演示,以使这更容易使用:@DanP。唯一小提琴中似乎缺少的是,拆分器的正确通道尚未连接回合并;splitter.ConnectMerge,1,1;谢谢,正在工作!我注意到的一件事是更改延迟时发出咔哒声。使用setValueAtTime修复了它,例如delayL.delayTime.setValueAtTime0.005,audioContext.currentTime;。谢谢!