采用OpenAL的线性1D音频平衡

时间:2014-04-18 12:22:28

标签: c# audio openal opentk

我已经在OpenTK论坛上提出了这个问题,但似乎没有人能够回复。 (http://www.opentk.com/node/3638

在OpenTK中,我试图将-1到1的平衡值转换为左/右音频通道。当0(默认值)时,双方都应该获得100%的增益。当1 100%为右,0%为左,而相反为-1。我很难在OAL工作,因为这实际上是我第一次使用它。

到目前为止,我已尝试过: OAL初始化后:

AL.DistanceModel(ALDistanceModel.LinearDistanceClamped);

对于每个新来源:

AL.Source(SourceId, ALSourcef.MaxDistance, 1f);
AL.Source(SourceId, ALSourceb.SourceRelative, false);

用于设置余额:

float balance = 0f; //(-1f to 1f)
OpenTK.Vector3 position = new OpenTK.Vector3(balance, 0f, 0f);
AL.Source(SourceId, ALSource3f.Position, ref position);

这将使音频在左声道上高于100%,在右边为0%,对于所有负值的余额,刚好在100%左右,所有正值都留0%左右,所以我有点卡住了。

我应该怎么做呢?任何帮助表示赞赏!

Gr.Viller

BTW:这看起来像是未答复OpenAL 2d panning C++的近似副本。

1 个答案:

答案 0 :(得分:1)

使用OpenAL Soft邮件列表我得到了我需要的答案:

在FNA中我们会做这样的事情,但它可能并不理想(如果不是不正确的话):

https://github.com/flibitijibibo/MonoGame/blob/monogame-sdl2/MonoGame.Framework/Audio/SoundEffectInstance.cs#L58

我肯定知道这并不能提供很难的平移,但你可能并非真的想要做硬盘。我们这样做是为了使距离保持在1.0f,但如果您的项目不需要衰减,您可以关闭它并节省一些时间/精力:

https://github.com/flibitijibibo/MonoGame/blob/monogame-sdl2/MonoGame.Framework/Audio/OpenALDevice.cs#L102

-Ethan

TL; DR: 使用以下命令禁用距离系统:

AL.DistanceModel(ALDistanceModel.None);

然后像这样设置余额:

AL.Source(SourceId, ALSource3f.Position, balance, 0f, (float)Math.Sqrt(1 - Math.Pow(balance, 2)));

基本上在Z轴上创建一个半圆,以便在将方向移动到音频的同时始终与听众保持相同的距离。