1. The "zero percent" point used by any curves controlled by "variable2" in an SMS file is determined by the idle RPM set in the engine tables.
2. The actual in-sim idle RPM is determined by the diesel throttle tab.
3. Therefore, the SMS will respect the zero point and engine pitch will increase as it should to the actual specified idle RPM.
I suspected the same would hold true for maximum RPM. The original plan was to have three SMS files, one for the 567D2 (without inertial air intake or traction motor blower effects, pneumatic motor relay noises, 315-835 RPM range), one for the 567D3 (with inertial intake and traction blower effects, electronic motor relay noises, 315-835 RPM range), and 567D3A (same as 567D3, but with a maximum RPM of 900). I reasoned that I could set the maximum RPM in all locomotives to 900 RPM, but use the throttle RPM tab to restrict the maximum RPM to 835 on the 567D2 and 567D3. I tried this, and it worked as expected - the test GP20 and GP30 locomotives ran at 835 RPM in run 8, with the audio matching appropriately. From this, I drew more conclusions:
4. The "100 percent" point used by variable2-controlled curves is set by the maximum RPM defined in the engine tables.
5. The actual maximum RPM is determined by the diesel throttle tab.
6. Therefore, the SMS will respect the 100 percent point and engine pitch will be lower than the maximum defined in the SMS file as appropriate.
Using this reasoning, I came to a final conclusion:
7. So long as the frequency curves are set up to match the maximum and minimum RPM values defined in the engine tables, you can specify any RPM range between those two values using the throttle RPM tab, and the engine audio will behave exactly as it should for engines running in completely different RPM ranges!
I gleefully deleted the 567D3 SMS files and used a single set of SMS files for the 567D3 and D3A. I set the maximum RPM at 900 for all locomotives and used the throttle RPM tab to limit it to 835 RPM on the GP30 I was using to test the 567D3 parameters. Then I got distracted by other things and never finished what I was working on.
This brings me to the 70-Tonner I have been working on. Since I was building a new FWL-6T sound set from the ground up, I decided to try out a final hypothesis: I wondered if I could set idle RPM to 0, maximum RPM to the maximum RPM, and then use the throttle tab to set idle. This would hypothetically allow me to model the RPM range below idle. So I tested this hypothesis. I discovered that setting idle RPM to 0 created issues with the engine not wanting to come out of idle. Setting it to an arbitrary small number, however, worked fine. So I set it to 5 and based all of my frequency curve calculations on a minimum RPM of 5 and a maximum of 1000. And, sure enough, it worked!
A while back there was a proposal for an additional variable for engine sounds below idle. My testing has determined that this is not necessary. Simply set idle to a low RPM, around 5, and then set the maximum as normal. Then set the idle RPM with the throttle RPM tab. Here's the engine code from the 70-tonner:
ORTSDieselEngines ( 1 Diesel ( IdleRPM ( 5 ) MaxRPM ( 1000 ) StartingRPM ( 75 ) StartingConfirmRPM ( 200 ) ChangeUpRPMpS ( 50 ) ChangeDownRPMpS ( 80 ) RateOfChangeUpRPMpSS ( 50 ) RateOfChangeDownRPMpSS ( 10 ) MaximalPower ( 660hp ) IdleExhaust ( 0.05 ) MaxExhaust ( 12.50 ) ExhaustDynamics ( 3 ) ExhaustDynamicsDown (1.2) ExhaustColor ( 33665D4A ) ExhaustTransientColor( FF665D4A ) Comment ( Estimates of FWL-6T gross HP based on EMD 645E-3 power curve. 700 HP gross estimated based on EMD 567B data of gross v. traction HP ) DieselPowerTab ( 000 0.0hp 450 46.7hp 540 101.9hp 633 194.5hp 725 292.3hp 816 394.3hp 908 532.4hp 1000 700.0hp ) Comment ( This chart is gallons per hour x 3.79. Estimates scaled down from EMD 645E3 fuel consumption curve. ) DieselConsumptionTab ( 000 000.000 450 006.544 540 024.143 633 041.210 725 060.223 816 087.033 908 123.299 1000 148.303 ) ThrottleRPMTab ( 000.0 450.0 014.3 451.0 028.6 540.0 042.9 633.0 057.1 725.0 071.4 816.0 085.7 908.0 100.0 1000.0 ) Comment ( I had no idea what I was doing here; thankfully, neither does anyone else ) DieselTorqueTab ( 0 0 275 2718 835 11007 ) MinOilPressure ( 20 ) MaxOilPressure ( 75 ) IdleTemperature ( 71 ) OptTemperature ( 77 ) MaxTemperature ( 89 ) Cooling ( 3 ) TempTimeConstant ( 720 ) ) )
Here's the idle stream:
Stream ( Skip( 450 RPM ) Volume ( 1.0 ) Priority ( 6 ) Triggers ( 1 Initial_Trigger ( StartLoop ( 4 File ( "../../NAVS_AUDIO/GE_FWL-6T/engine/x_GE_FWL-6T_450-1.wav" -1 ) File ( "../../NAVS_AUDIO/GE_FWL-6T/engine/x_GE_FWL-6T_450-2.wav" -1 ) File ( "../../NAVS_AUDIO/GE_FWL-6T/engine/x_GE_FWL-6T_450-3.wav" -1 ) File ( "../../NAVS_AUDIO/GE_FWL-6T/engine/x_GE_FWL-6T_450-4.wav" -1 ) SelectionMethod ( RandomSelection ) ) ) ) FrequencyCurve( Variable2Controlled CurvePoints ( 2 0.00 220.5 1.00 44100.0 ) Granularity ( .001 ) ) VolumeCurve( Variable2Controlled CurvePoints ( 4 0.000 0.00 0.100 0.40 0.450 1.00 1.000 0.10 ) Granularity ( 0.001 ) ) VolumeCurve( Variable2Controlled CurvePoints ( 3 0.450 0.11 0.725 0.30 1.000 0.53 ) Granularity ( 0.001 ) ) VolumeCurve( DistanceControlled CurvePoints ( 5 010 1.00 050 0.64 100 0.33 200 0.02 300 0.00 ) Granularity ( .001 ) ) )
Note that maximum volume is at 45% - this is because the engine idles at 450 RPM, which is 45% of 1000 RPM. My idle clip is at unity pitch at 450 RPM, but I sped it up to 1000 RPM to avoid phasing issues with the 1000 RPM clip that I encountered in testing (the reason this was occurring was that the two files were slightly out-of-sync at initial load-in, so I reasoned that they would sync better if they were transposed to the same length and speed). It's a 44K clip, so the frequency curve points were calculated as follows:
Minimum RPM: (5/1000)*44100=220.5
Maximum RPM: (1000/1000)*44100=44100
In general, when you have a clip at a known RPM, the formula for finding frequency curve points is:
(Desired RPM/Clip RPM)*(Sample rate)
Anyway, I hope some of you find this useful.