c# - 使用 OpenAL 的线性一维音频平衡

标签 c# audio openal opentk

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

在 OpenTK 中,我试图将 -1 到 1 的平衡值转换为左/右音频 channel 。当为 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

顺便说一句:这看起来像是未回答的 OpenAL 2d panning C++ 的近乎重复.

最佳答案

使用 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

-伊森

长话短说: 禁用距离系统:

AL.DistanceModel(ALDistanceModel.None);

然后像这样设置平衡:

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

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

关于c# - 使用 OpenAL 的线性一维音频平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154049/

相关文章:

c# - 从字符串中删除字符

c# - 涉及锁时,代码契约(Contract)警告 "ensures unproven"

audio - 实时音频流容器格式

python - matplotlib- Y 轴和 X 轴交换

c++ - OGG Vorbis : Defined, 但未使用 - 如何抑制?

php - 创建声音-读取字母-在PHP中

c# - XML 元素重新排序不起作用 XSLT

c# - 为什么我不能创建自己的 Nullable<T> 类似物?

c# - Windows 8 Metro 录制音频(过滤噪音、改变音调)

android - 适用于 Android 的 3D 音频库