Пытаюсь сделать качественный звук двигателя. Есть набор семплов (15 штук, пока только для случая с набором оборотов).
Пытаюсь микшировать просто интерполируя AL_GAIN между двумя соседними семплами в зависимости от оборотов, получается хрень.
Как правильно это сделать? В программировании звука только начальные знания. Может надо крутить не только громкость?
help
Код интерполятора, если нужен.
vindast
> Есть набор семплов (15 штук, пока только для случая с набором оборотов).
Столько не нужно, нужно менять частоту воспроизведения, и достаточно будет одного семпла, если добавлять, то не так. Например, иметь три семпла:
1. Работа под натугой, когда газ выжат сильно, но что-то сопротивляется, например, машина идёт в гору.
2. Звук, когда уровень газа соответствует оборотам.
3. Звук при торможении двигателем.
Микшировать эти три величины в зависимости от режима работы, а частоту воспроизведения менять в соответствие с частотой двигателя.
В OpenAL я не спец, в DirectSound мог бы показать.
Mikle, да блен.
Эти файлы из игры asseto corsa, как-то же с этим работают.
Если проблему не решу, то буду этот вариант курить.
Mikle
> Столько не нужно, нужно менять частоту воспроизведения, и достаточно будет
> одного семпла, если добавлять, то не так. Например, иметь три семпла:
> 1. Работа под натугой, когда газ выжат сильно, но что-то сопротивляется,
> например, машина идёт в гору.
> 2. Звук, когда уровень газа соответствует оборотам.
> 3. Звук при торможении двигателем.
У меня, если честно, сомнения по поводу того что всего трех семплов хватит.
Второй пункт, это что?
vindast
> Второй пункт, это что?
Грубо, это когда машину подняли на домкратах и крутят двигатель.
vindast
> сомнения по поводу того что всего трех семплов хватит.
Можно, конечно, и набором семплов пользоваться, сама мысль была в том, что в любом случае нужно менять частоту воспроизведения семплов, а не только гейн.
Я сделал еще и питч, в зависимости от разницы оборотов.
Только теперь мне кажется что громкость должна падать не линейно.
Норм?
Такое ощущение что звук двоит.
vindast
> Я сделал еще и питч, в зависимости от разницы оборотов.
Я так понимаю, питч - это и есть смена частоты воспроизведения.
vindast
> Такое ощущение что звук двоит.
Это частоты соседних семплов при переходе не совпадают.
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); } }
vindast
> Как быть?
Нужно знать точные основные частоты семплов, в принципе, это можно измерить.
Mikle, а что это даст? И что с этим делать? Получить их не вопрос.
Скинь мне пару соседних семплов, которые у тебя плохо стыкуются, покажу на примере. Если не успею сейчас, то завтра утром сделаю.
https://yadi.sk/d/WnPGq9JHAnxxZw
Если хочешь могу скинуть весь пакет с кодом инициализации.
В принципе, отношение питчей соседних семплов всегда должно быть константным, эту константу для каждой пары семплов и нужно найти.
Mikle, что-то я совсем не понял. Можно подробнее? У них вроде как везде частота одинаковая.
Тема в архиве.