Войти
ПрограммированиеФорумЗвук

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

Страницы: 1 2 3 4 Следующая »
#0
(Правка: 18:14) 18:13, 14 сен. 2018

Пытаюсь сделать качественный звук двигателя. Есть набор семплов (15 штук, пока только для случая с набором оборотов).
Пытаюсь микшировать просто интерполируя AL_GAIN между двумя соседними семплами в зависимости от оборотов, получается хрень.
Как правильно это сделать? В программировании звука только начальные знания. Может надо крутить не только громкость?
help

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

+ Показать


#1
19:37, 14 сен. 2018

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

#2
(Правка: 19:58) 19:57, 14 сен. 2018

Mikle, да блен.
Эти файлы из игры asseto corsa, как-то же с этим работают.
Если проблему не решу, то буду этот вариант курить.

#3
(Правка: 20:06) 20:04, 14 сен. 2018

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

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

#4
(Правка: 20:13) 20:13, 14 сен. 2018

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

#5
21:25, 14 сен. 2018

Я сделал еще и питч, в зависимости от разницы оборотов.
Только теперь мне кажется что громкость должна падать не линейно.

#6
22:29, 14 сен. 2018

Норм?

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

#7
22:46, 14 сен. 2018

vindast
> Я сделал еще и питч, в зависимости от разницы оборотов.
Я так понимаю, питч - это и есть смена частоты воспроизведения.
vindast
> Такое ощущение что звук двоит.
Это частоты соседних семплов при переходе не совпадают.

#8
(Правка: 22:53) 22:50, 14 сен. 2018

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);
    }
    
  }
#9
22:53, 14 сен. 2018

vindast
> Как быть?
Нужно знать точные основные частоты семплов, в принципе, это можно измерить.

#10
(Правка: 22:55) 22:53, 14 сен. 2018

Mikle, а что это даст? И что с этим делать? Получить их не вопрос.

#11
22:55, 14 сен. 2018

Скинь мне пару соседних семплов, которые у тебя плохо стыкуются, покажу на примере. Если не успею сейчас, то завтра утром сделаю.

#12
23:01, 14 сен. 2018


https://yadi.sk/d/WnPGq9JHAnxxZw

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

#13
23:04, 14 сен. 2018

В принципе, отношение питчей соседних семплов всегда должно быть константным, эту константу для каждой пары семплов и нужно найти.

#14
23:06, 14 сен. 2018

Mikle, что-то я совсем не понял. Можно подробнее? У них вроде как везде частота одинаковая.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумЗвук