перевод оригинальной статьи Алессандро Фама - RMS Level of an FMOD EventInstance
Если мы хотим получить точный RMS-уровень у EventInstance, мы должны будем работать с функциями FMOD.DSP, FMOD.DSP_METERING_INFO и FMOD.ChannelGroup.
Скачайте проект Unity & FMOD для этого руководства. Если после открытия проекта у вас возникнут какие-либо ошибки, удалите файл FMODStudioCache.asset, поскольку он содержит старый путь к проекту FMOD Studio.
Сначала мы объявим FMOD.DSP, FMOD.DSP_METERING_INFO и FMOD.ChannelGroup вместе с EventInstance и путем к нашему ивенту:
FMOD.Studio.EventInstance instance;
[ FMODUnity.EventRef ] public string fmodEvent;
FMOD.DSP dsp = new FMOD.DSP();
FMOD.DSP_METERING_INFO meterInfo = new FMOD.DSP_METERING_INFO();
FMOD.ChannelGroup channelGroup;
В Unity методе Start() мы запускаем наш инстанс:
void Start ( )
{
instance = FMODUnity.RuntimeManager.CreateInstance(fmodEvent);
instance.start();
StartCoroutine(GetChannelGroup());
}
Мы выполняем корутину (Coroutine) GetChannelGroup (), чтобы получить определение ChannelGroup для нашего инстанса:
Невозможно получить результат ChannelGroup, пока инстанс ивента не будет успешно загружен. Соответственно, мы выполняем цикл getChannelGroup(), пока не получим возвращаемое значение FMOD.RESULT.OK. С помощью channelGroup.getDSP() мы получаем адрес переменной для получения указателя на запрошенный блок DSP. С помощью setMeteringEnabled() мы активируем измерение выходных данных.
Следующим шагом является создание метода, который возвращает уровень RMS как переменную с значением float:
Теперь мы можем получить доступ к уровню RMS в коде с помощью метода GetRMS(). В проекте Unity я сделал визуализацию значений с помощью Unity Canvas и текстового элемента:
#unity #unity3d #fmod #audioengine #gamedev #sounddesign #саунддизайн