首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于OpenAL的线性一维音频天平

基于OpenAL的线性一维音频天平
EN

Stack Overflow用户
提问于 2014-04-18 12:22:28
回答 1查看 510关注 0票数 2

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

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

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

代码语言:javascript
复制
AL.DistanceModel(ALDistanceModel.LinearDistanceClamped);

对于每一个新的来源:

代码语言:javascript
复制
AL.Source(SourceId, ALSourcef.MaxDistance, 1f);
AL.Source(SourceId, ALSourceb.SourceRelative, false);

用于设置余额:

代码语言:javascript
复制
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++的一个几乎重复的版本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-21 02:08:47

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

在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:禁用远程系统:

代码语言:javascript
复制
AL.DistanceModel(ALDistanceModel.None);

然后像这样设置平衡:

代码语言:javascript
复制
AL.Source(SourceId, ALSource3f.Position, balance, 0f, (float)Math.Sqrt(1 - Math.Pow(balance, 2)));

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23154049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档