Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Как правильно интерполировать звук (двигателя)? (OpenAL-soft)

Как правильно интерполировать звук (двигателя)? (OpenAL-soft)

Страницы: 1 2 3 4 Следующая »
vindastПостоялецwww14 сен. 201818:13#0
Пытаюсь сделать качественный звук двигателя. Есть набор семплов (15 штук, пока только для случая с набором оборотов).
Пытаюсь микшировать просто интерполируя AL_GAIN между двумя соседними семплами в зависимости от оборотов, получается хрень.
Как правильно это сделать? В программировании звука только начальные знания. Может надо крутить не только громкость?
help

Код интерполятора, если нужен.

+ Показать

Правка: 14 сен. 2018 18:14

MikleМодераторwww14 сен. 201819:37#1
vindast
> Есть набор семплов (15 штук, пока только для случая с набором оборотов).
Столько не нужно, нужно менять частоту воспроизведения, и достаточно будет одного семпла, если добавлять, то не так. Например, иметь три семпла:
1. Работа под натугой, когда газ выжат сильно, но что-то сопротивляется, например, машина идёт в гору.
2. Звук, когда уровень газа соответствует оборотам.
3. Звук при торможении двигателем.
Микшировать эти три величины в зависимости от режима работы, а частоту воспроизведения менять в соответствие с частотой двигателя.
В OpenAL я не спец, в DirectSound мог бы показать.
vindastПостоялецwww14 сен. 201819:57#2
Mikle, да блен.
Эти файлы из игры asseto corsa, как-то же с этим работают.
Если проблему не решу, то буду этот вариант курить.

Правка: 14 сен. 2018 19:58

vindastПостоялецwww14 сен. 201820:04#3
Mikle
> Столько не нужно, нужно менять частоту воспроизведения, и достаточно будет
> одного семпла, если добавлять, то не так. Например, иметь три семпла:
> 1. Работа под натугой, когда газ выжат сильно, но что-то сопротивляется,
> например, машина идёт в гору.
> 2. Звук, когда уровень газа соответствует оборотам.
> 3. Звук при торможении двигателем.
У меня, если честно, сомнения по поводу того что всего трех семплов хватит.

Второй пункт, это что?

Правка: 14 сен. 2018 20:06

MikleМодераторwww14 сен. 201820:13#4
vindast
> Второй пункт, это что?
Грубо, это когда машину подняли на домкратах и крутят двигатель.
vindast
> сомнения по поводу того что всего трех семплов хватит.
Можно, конечно, и набором семплов пользоваться, сама мысль была в том, что в любом случае нужно менять частоту воспроизведения семплов, а не только гейн.

Правка: 14 сен. 2018 20:13

vindastПостоялецwww14 сен. 201821:25#5
Я сделал еще и питч, в зависимости от разницы оборотов.
Только теперь мне кажется что громкость должна падать не линейно.
vindastПостоялецwww14 сен. 201822:29#6
Норм?

Такое ощущение что звук двоит.

MikleМодераторwww14 сен. 201822:46#7
vindast
> Я сделал еще и питч, в зависимости от разницы оборотов.
Я так понимаю, питч - это и есть смена частоты воспроизведения.
vindast
> Такое ощущение что звук двоит.
Это частоты соседних семплов при переходе не совпадают.
vindastПостоялецwww14 сен. 201822:50#8
Mikle
Как быть?
Я пытаюсь ускорять левый и замедлять правый смемпл, что бы интерполировать внутри диапазона.

Код такой пока что:

  inline void update(const float& RPM, const float& MINRPM, const float& MAXRPM, const float& trotle, const vec3& pos)
  {
    float Range = soundInSamples.size() - 1;

    float rpmRange = MAXRPM - MINRPM;
    float normalizedRPM = (RPM - MINRPM) / (MAXRPM - MINRPM);

    if (normalizedRPM < 0.0f)
      normalizedRPM = 0.0f;

    int FirstSample  = floor(normalizedRPM * Range);
    int SecondSample = FirstSample + 1;

    if (SecondSample >= Range)
    {
      SecondSample = Range;
      FirstSample = SecondSample - 1;
    }

    float Gain1 = 1.0f - (normalizedRPM * Range - float(FirstSample));
    float Gain2 = 1.0f - Gain1;

    soundInSamples [  FirstSample]->setGain(Gain1 * trotle);
    soundInSamples [ SecondSample]->setGain(Gain2 * trotle);
    soundOffSamples[  FirstSample]->setGain(Gain1 * (1.0f - trotle));
    soundOffSamples[ SecondSample]->setGain(Gain2 * (1.0f - trotle));


    float currentRPMRange = rpmRange / Range;

    float Pith1 = 1.0f + (RPM - MINRPM - FirstSample / (Range + 1.0f) * rpmRange) / rpmRange;
    float Pith2 = 1.0f + (RPM - MINRPM - SecondSample / (Range + 1.0f) * rpmRange) / rpmRange;
     
    soundInSamples [  FirstSample]->setPith(Pith1);
    soundOffSamples[  FirstSample]->setPith(Pith1);
    
    soundInSamples [ SecondSample]->setPith(Pith2);
    soundOffSamples[ SecondSample]->setPith(Pith2);
    

    for (int i = 0; i < soundInSamples.size(); i++)
    {
      if (i != FirstSample && i != SecondSample)
      {
        soundInSamples[i]->setGain(0.0f);
        soundOffSamples[i]->setGain(0.0f);
      }

      soundOffSamples[i]->setWorldPosition(pos);
      soundInSamples[i]->setWorldPosition(pos);
    }
    
  }

Правка: 14 сен. 2018 22:53

MikleМодераторwww14 сен. 201822:53#9
vindast
> Как быть?
Нужно знать точные основные частоты семплов, в принципе, это можно измерить.
vindastПостоялецwww14 сен. 201822:53#10
Mikle, а что это даст? И что с этим делать? Получить их не вопрос.

Правка: 14 сен. 2018 22:55

MikleМодераторwww14 сен. 201822:55#11
Скинь мне пару соседних семплов, которые у тебя плохо стыкуются, покажу на примере. Если не успею сейчас, то завтра утром сделаю.
vindastПостоялецwww14 сен. 201823:01#12

https://yadi.sk/d/WnPGq9JHAnxxZw

Если хочешь могу скинуть весь пакет с кодом инициализации.

MikleМодераторwww14 сен. 201823:04#13
В принципе, отношение питчей соседних семплов всегда должно быть константным, эту константу для каждой пары семплов и нужно найти.
vindastПостоялецwww14 сен. 201823:06#14
Mikle, что-то я совсем не понял. Можно подробнее? У них вроде как везде частота одинаковая.
Страницы: 1 2 3 4 Следующая »

/ Форум / Программирование игр / Звук

2001—2018 © GameDev.ru — Разработка игр