Engine Loop Creation using Pyrespeeder and iZotope RX


Massive thank you to my collegue and friend Tyoma Makeev for introducing me to Pyrespeeder. This guide would not be here without him, so please go check out his website!

RPM formula

Design and implementation of a good sounding vehicle is very difficult. The sound of a car consists of a myriad of layers such as the engine itself (engine and exhaust), turbo, tyres, suspension, etc.. All of them need to work well together, react to the player’s input and game’s simulation. Making matters worse, there is barely any available information online. Each of these building blocks can be studied in extreme depths, but in this blog post I would like to shine a light on a way of creating engine loops without the use of game-ready granular synths such as REV by CrankcaseAudio

Before I continue, I would like to warn you that this process is not ideal, and has its own setbacks (such as being time consuming).


Tools


Okay then! First of all, I would like to provide a list of necessary software (some of it open source and free, some of it is paid).

  1. Your DAW of choice (I use Reaper) (paid or free)
  2. iZotope RX 10 (paid/ subscription)
  3. Pyaudiorestoration (open source and free)
  4. IDE with Python support (I use PyCharm)

Source


After obtaining all the necessary software, it is time to find an engine recording. It is best to use ramp type recordings, as they consist of all the RPMs of an engine both onload (throttle engaged) and offload (throttle disengaged). For this blog, I will be using a Mitsubishi exhaust take from Soundly.

WaveformRamp

After the files are obtained, put these recordings into your DAW and start chopping up your audio into small sections or create regions for rendering later on (I prefer regions). Make sure to pay attention to the frequency contents of the chops you are making and try to make sure the response does not change too much, as it can lead to problems further on.

After the choppage is done, bounce the resulting files (do not forget to name them!) and proceed to the next step. I will be using only one snippet of the recording for demonstration purposes.


Extracted snippet of the recording



Pitch Flattening

Pyaudiorestoration has a great little module called pyrespeeder. It was mainly developed to remove wow and flutter from vinyl recordings (by adjusting sample rate to keep the pitch stable) but it turns out that it is a great tool for engine loop creation.

Load one of your files (by the way you can load multichannel audio, so make sure to use this feature by writing all the mic positions into one sound file!). Set all the settings as seen on the screenshot, zoom in into the fundamental frequency (or any other prominent stable harmonic) and draw a line on it by dragging your mouse while holding Ctrl. Wa-bang! Pyrespeeder has detected the frequency changes. Press Ctrl+R and the processed file will be rendered. Rinse and repeat for all the files.

PseepdSettings

Processed file from Pyrespeeder, notice pitching noise


While writing this blog post I have found out that iZotope RX 10 Advanced is capable of doing the exact same thing as Pyaudiorestoration by utilising Wow & Flutter module set to Wow with Wow rate set to slow. While this is a game changer for me, you cannot get this module in standard edition available by subscription. But if you have access to this software, use this method instead.


Loop Creation


After all the files are processed, you might have noticed that the upper spectrum noise is behaving weird. This is one of the biggest downsides of this method (not present when using RX 10 Wow and Flutter). This happens due to the fact that noise is static in pitch (duh). In order to fix this, get the noise layer from the unprocessed file and combine it with a flattened one by using EQs. This is now fixed!

PseepdSettings

With noise layered on top


Now, it is time to learn about looping techniques. First one is the reverse method. Copy paste the audio file and reverse it. Trim the items at their zero crossing file and invert the phase if needed. Don’t waste your time on trying to crossfade them (you can but it is a tedious process). Consolidate two files together and open them in RX. Use the Spectral Repair module in replace mode to patch the loop point. This usually works. If it doesn’t - play with other modules such as de-click.

ReverseLoop

The second one is cutting the file in the middle at a zero crossing and moving the left side to the right. Again, do not crossfade them and use RX in the way described above.

Put the final file into the RX again and use Spectral repair to fix weird and uneven frequencies.

FinalLoopRX

Wowzers, just listen to this loop!


Congratulations! You have created a stable engine loop ready for implementation.


Recommendations and Further Reading


After you have processed all files, you need to find the RPM of the loop. Use this article to help you calculate it based on the fundamental frequency.

The implementation of engine loops in Wwise is superbly explained by Arto Koivisto in this blog.

Engine loops are only a starting point for creating a good sounding car engine. If the vehicle physics in your game do not realistically simulate engine RPMs, you might have to create transmission, wobble and rev limiter logic yourself. Do not ignore this, as otherwise the engine will sound boring and unrealistic. Also think about how suspension might affect the RPMs. This blogpost by Xu Wei is great learning material!

Additionally, I would recommend doing these things to make your car engine sound great!

Have fun and good sound designing!