Линейный баланс звука 1D с OpenAL

Я уже задавал этот вопрос на форумах 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% слева для всех положительных значений, так что я немного застрял.

Как мне это сделать? Любая помощь приветствуется!

Гр.Виллер

Кстати: это похоже на почти дубликат без ответа OpenAL 2d panning C++.


person Villermen    schedule 18.04.2014    source источник
comment
Лучше всего обратиться к списку рассылки OpenAL Soft.   -  person The Fiddler    schedule 18.04.2014


Ответы (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

-Итан

TL;DR: отключите дистанционную систему с помощью:

AL.DistanceModel(ALDistanceModel.None);

Затем установите баланс следующим образом:

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

По сути, создайте полукруг по оси Z, чтобы всегда сохранять одинаковое расстояние от слушателя при изменении направления звука.

person Villermen    schedule 21.04.2014