如何在js中每只耳朵发出不同的声音?
How to have a different sound on each ear in js?
我需要在左右耳上发送不同的声音,但我没有成功。我遵循了这些步骤:
- 加载了我的声音(句子和一种纯音 'bip'),
- 使用
getChannelData()
处理原始数据 (Float32Array):对我使用的三个句子之一应用增益,然后在变量 'source' 中求和以同时听到这 3 个句子.
- 使用
createBuffer(1,source.length,fs)
将我的源变量从类型 Float32Array 转换为 AudioBuffer。
- 终于使用了
createBufferSource()
我可以放缓冲区来播放它。
- 效果很好,但现在我需要在左耳播放 'source' 变量中的那些句子,在右耳播放同名变量中的 'bip' 声音。因此,我进行了如下修改,将源变量和 bip 变量放在一个不同的通道中。问题是当我听到它时,句子不完全在左边,bip 也不完全在右边。我听说它不是完全混合的,但它不是完全分开的。我不明白为什么以及如何解决它。 js 在播放前混合频道吗?我该怎么做才能真正在左边发出一种声音,在右边发出另一种声音?我没有精确,但左右需要同时,这是为了听觉测试。我尝试使用
StereoPannerNode
和 pan
但效果不佳,有两个问题:(1) 是的,我可以在左侧或右侧设置 more 级别一个平衡的声音,但我不能把 all 声音放在一个声音中......并且(2)似乎我不能用它把一个声音放在左边,一个声音正确,因为它作用于最终混音...
// concatenate all sentences and put it in a buffer
let buffer = context.createBuffer(2, source.length, fs);
let bufferData = {
l: buffer.getChannelData(0),
r: buffer.getChannelData(1)
};
bufferData.l.set(source);
bufferData.r.set(bip);
// create a source that will be used to play the buffer
trial.sound = context.createBufferSource();
trial.sound.buffer = buffer;
trial.sound.connect(context.destination);
编辑: Raymond Toy 的评论帮助我找到了解决方案。当我尝试他的小测试代码时,它不能正常工作,而 js 说它是 (context.destination.channelCount = 2)。这让我想起了之前给我带来很多问题的事情:预装的杜比软件(如下所示,现在已禁用)。它基本上是一个过滤器(我认为)和...一个混音器,我只是通过尝试禁用它才意识到这一点。 Enable : sound in the two ears, Disable : one sound in each ear...所以我的问题部分解决了,因为我需要让它对任何人都有效,我目前唯一的解决办法是制作一个视频来解释观众如何在进行测试之前禁用它...
请注意,我也可以让 Dobly 启用,但引用您在下一张图片中看到的框“désactiver les effets sonores”,即“禁用音效”
:
这应该有效。作为对您的设置的简单测试,请尝试以下(未测试):
// context is the AudioContext.
let s1 = new OscillatorNode(context, {frequency: 440});
let s2 = new OscillatorNode(context, {frequency: 880});
let g1 = new GainNode(context);
let g2 = new GainNode(context);
let merger = new ChannelMergerNode(context, {numberOfInputs: 2});
merger.connect(context.destination);
s1.connect(g1).connect(merger, 0, 0);
s2.connect(g2).connect(merger, 0, 1);
s1.start();
s2.start();
您应该会在一只耳朵中听到 440 Hz 的音调,在另一只耳朵中听到 880 Hz 的音调。当然,这假设您的音频硬件支持立体声。检查 context.destination.channelCount
是否真的是两个。
如果听起来仍然很有趣,请尝试设置 g1.gain.value=0
或 g2.gain.value=0
(但不能同时设置)。这应该会强制声音只向左或向右传播。如果不是,则有其他问题。我在 https://hoch.github.io/canopy 测试了它,它按我预期的那样工作。
我需要在左右耳上发送不同的声音,但我没有成功。我遵循了这些步骤:
- 加载了我的声音(句子和一种纯音 'bip'),
- 使用
getChannelData()
处理原始数据 (Float32Array):对我使用的三个句子之一应用增益,然后在变量 'source' 中求和以同时听到这 3 个句子. - 使用
createBuffer(1,source.length,fs)
将我的源变量从类型 Float32Array 转换为 AudioBuffer。 - 终于使用了
createBufferSource()
我可以放缓冲区来播放它。 - 效果很好,但现在我需要在左耳播放 'source' 变量中的那些句子,在右耳播放同名变量中的 'bip' 声音。因此,我进行了如下修改,将源变量和 bip 变量放在一个不同的通道中。问题是当我听到它时,句子不完全在左边,bip 也不完全在右边。我听说它不是完全混合的,但它不是完全分开的。我不明白为什么以及如何解决它。 js 在播放前混合频道吗?我该怎么做才能真正在左边发出一种声音,在右边发出另一种声音?我没有精确,但左右需要同时,这是为了听觉测试。我尝试使用
StereoPannerNode
和pan
但效果不佳,有两个问题:(1) 是的,我可以在左侧或右侧设置 more 级别一个平衡的声音,但我不能把 all 声音放在一个声音中......并且(2)似乎我不能用它把一个声音放在左边,一个声音正确,因为它作用于最终混音...
// concatenate all sentences and put it in a buffer
let buffer = context.createBuffer(2, source.length, fs);
let bufferData = {
l: buffer.getChannelData(0),
r: buffer.getChannelData(1)
};
bufferData.l.set(source);
bufferData.r.set(bip);
// create a source that will be used to play the buffer
trial.sound = context.createBufferSource();
trial.sound.buffer = buffer;
trial.sound.connect(context.destination);
编辑: Raymond Toy 的评论帮助我找到了解决方案。当我尝试他的小测试代码时,它不能正常工作,而 js 说它是 (context.destination.channelCount = 2)。这让我想起了之前给我带来很多问题的事情:预装的杜比软件(如下所示,现在已禁用)。它基本上是一个过滤器(我认为)和...一个混音器,我只是通过尝试禁用它才意识到这一点。 Enable : sound in the two ears, Disable : one sound in each ear...所以我的问题部分解决了,因为我需要让它对任何人都有效,我目前唯一的解决办法是制作一个视频来解释观众如何在进行测试之前禁用它...
请注意,我也可以让 Dobly 启用,但引用您在下一张图片中看到的框“désactiver les effets sonores”,即“禁用音效”
这应该有效。作为对您的设置的简单测试,请尝试以下(未测试):
// context is the AudioContext.
let s1 = new OscillatorNode(context, {frequency: 440});
let s2 = new OscillatorNode(context, {frequency: 880});
let g1 = new GainNode(context);
let g2 = new GainNode(context);
let merger = new ChannelMergerNode(context, {numberOfInputs: 2});
merger.connect(context.destination);
s1.connect(g1).connect(merger, 0, 0);
s2.connect(g2).connect(merger, 0, 1);
s1.start();
s2.start();
您应该会在一只耳朵中听到 440 Hz 的音调,在另一只耳朵中听到 880 Hz 的音调。当然,这假设您的音频硬件支持立体声。检查 context.destination.channelCount
是否真的是两个。
如果听起来仍然很有趣,请尝试设置 g1.gain.value=0
或 g2.gain.value=0
(但不能同时设置)。这应该会强制声音只向左或向右传播。如果不是,则有其他问题。我在 https://hoch.github.io/canopy 测试了它,它按我预期的那样工作。