Locomotive Engine Sounds -- A bit of an enigma

Hello all,

I’m extremely new to FMOD (and DAW type editors), so please excuse me if this is something that’s basic and something likely easily obtainable.

I’m looking to use FMOD to program locomotive engine sounds, and have got the basics figured out as far as getting the no-load and loaded sound channels playing and interacting properly within Studio with a few extra twists, but I’d like to take it a bit further.

As you can see here, I have the RPM timeline and logic tracks laid out and blended (there are pitch shifts and the like going on behind the scenes), as well as a load one which is largely the same. This would be good if I was to stick with a rudimentary setup, but that is not the case. Locomotives and their large low-speed diesel engines and complex mechanics of load regulators, mechanical or electronic fuel injection, all tend to behave differently upon rev up and rev down. When recording a session, I record the transitions from throttle setting to throttle setting, as well as a idle to full throttle and reversed sample.

I would like to use the transition one-shots I have for ascending and descending in RPM in the respective order while also laying out cue points (is that the right term to use in relation to this software?) to where the logic track can skip to a sequentially named cue point in the logic track if the requested RPM is greater than one power setting higher.

So for example, if I go from Idle to Notch 2, it would go from idle > N2 transition one-shot > N2 (with the blended loops hidden beneath the one-shot). If I go from Idle to Notch 8, it would go Idle > One-shot N2 up transition > cuepoint set in transition > One-Shot N3 up transition > Cuepoint set in transition > One-Shot N4 up transition > etc until it reaches the target Notch 8 RPM. Vice versa for downward. N8 loop > One-shot to N7 down transition > Cue > N6 down > cue … you get the picture.

The idea is to end up with a similar system to what ESU Loksound uses for their model train decoders to control the sound so it’s as seamless as possible.

Thank you all in advance,
Anthony Wood

This is not so simple, but should be achievable.
To have one-shot transitions between different RPM zones, you should put, on the RPM sheet, another track with you one-shot instruments, each one defined on a short trigger zone. You should of course also define an appropriate seek speed for the RPM parameter. That way, when the parameter will rise (say, from 400 to 500), with your async instrument defined between 445 and 455, the instrument will be triggered and played entirely.
The tricky part is you want different sounds for going up and down. That may not be a perfect solution, but the one that comes to my mind is to have another boolean parameter that will indicate to FMOD if the RPM are going up or down. Doing so, you could create 2 tracks of async one-shot instruments (one up, one down), either with instruments trigger behavior linked to that parameter, or with volume automation to mute/unmute the right track when going up or down (the volume automation could be better if you want to handle the case where there’s a change of direction during a one-shot sound).

1 Like

After a bit of experimentation, I found out a way of triggering a sound going up and another going down, without creating a new parameter:

It involves a “ghost” parameter, that follows the main one, but with a lower seek speed. So you can use it as an indicator of if you’re coming from above or from below!
EDIT : there’s no sound due to a sample frequency issue, but you can see visually the sound triggering

1 Like

I will give both of your suggestions a try, thank you for the prompt reply!

I’ll post an update if this works.

Anthony Wood

By the way, how will be changed the RPM? Does every value is possible or will it change from cue value to cue value?

The RPM will be changed by programming or script with change rates between notches up and down being set based on notes and statistics we have on hand. Same goes for load parameters that will be for the load channels, based on generator field excitation controlled by modules and the load regulator.

Once I get these settled in, for different types of locomotives, I’ll also have a turbo charger sample that will have different spool up and down rates that will be influenced by total load (exhaust pressure) and lag.

That being said, a variance of seek speed controls of the RPM values may be of value to make a bit of difference between two locomotives utilizing the same sounds so they aren’t exactly the same and end up with a strange phasing effect.

Thank you again for your help with this. I may end up with some time to crack down into this today so I should have some results on a demo video to share.

1 Like

In trying to recreate this, I find myself stumbling on how to control the trigger values aside from placement on the timeline. I have created the Ghost Parameter with a lower seek speed (asymmetric) than primary RPM values, but aside from the trigger behavior on the Sound itself, I haven’t quite figured out how to get the up sound to trigger on one parameter change, and not the other.

Here’s the trick:

The seek speed of my “ghost” parameter is better set “epsilon” above RPM parameter (+.01, for instance), that way it will be reactive to any sudden direction change (no risk it will lag behind in the wrong direction).
EDIT : I just found out it also works with a seek speed exactly the same as the main parameter (however, the ghost is needed nevertheless, because it’s impossible to put conditions with the current parameter in its own sheet)

Ah, hah! That did the trick. I think now with some volume automation that you mentioned before to mute sounds for sudden changes in direction and we’ll have the ticket! I demonstrated the issue that creeps up if one were to change power settings rapidly like you had described.

No it shouldn’t happen, your settings are not right. For the up element, trigger with a condition 300-320 with the ghost. The idea is to verify that the ghost is OUTSIDE the instrument box when entering. It will trigger only when passing through 320 coming from bellow (so to match visually, you could shorten your instrument on the sheet).

Oh very good. I’ll give that a try. Again, thank you so very much for all the help.

There still will be a potential issue when stopping exactly at 320 coming from above (the up sound will play). However, by setting the ghost range at 300-319.999 resolves the problem!

Thankfully, that shouldn’t be an issue since the set speed for idle is 318 RPM.

Does it work? Could you share a bit more about your project? I find those sounds really interesting. (PM if you prefer)

I was thinking that there could be an issue if there’s a RPM change between 2 notches, as the one-shot will be played entirely whatever is going on. But I don’t see another solution than doing this programmatically.

This is great Alci, quick question… What exactly is the “ghost” parameter?
How did you get it to follow the main (RPM) parameter? Does this mean it doesn’t need to be programmed into the game?

I want to get one-shots to play when the player A. accelerates and B. stops accelerating.

By automating one on the other in fmod.

Thanks! Now just tweaking the conditions to try to get the “accelerate” one shot to only play each time the RPM goes up.

It’s proving to be difficult. Cos it needs to be able to play across the entire RPM range, just only when the player hits accelerate. And same with another sound when the player takes their finger off the accelerate button,

I imagine it’s similar logic to what you have gone into detail in this thread?

That workaround was intended to work on a unique value, not on the entire range. I guess you’ll need to use the game code for that, unfortunately!

I see. Ok, thanks Alci :slight_smile: