Oh man, what a question.
The short answer is: Yes it's a multiplier, but not really directly. The scale is cents (the audio one, not the money one).
I am pretty sure the part of code that handles this way down in the engine is as follows:
/*---------------------------------------------------------------------
Function: PITCH_GetScale
Returns a fixed-point value to scale number the specified amount.
---------------------------------------------------------------------*/
uint32_t PITCH_GetScale(int const pitchoffset)
{
static bool bInitialized;
if (!bInitialized)
{
PITCH_Init();
bInitialized = true;
}
if (pitchoffset == 0)
return PitchTable[0][0];
int noteshift = pitchoffset % 1200;
if (noteshift < 0)
noteshift += 1200;
int const note = noteshift / 100;
int const detune = (noteshift % 100) / (100 / MAXDETUNE);
int const oshift = (pitchoffset - noteshift) / 1200;
auto const &scale = PitchTable[note][detune];
return (oshift < 0) ? (scale >> -oshift) : (scale << oshift);
}
To determine the pitch multiplier, you calculate 2^(pitch/1200). The game simply picks a value randomly between the min and max ranges. However, because of how the pitch offset value here is modulus'd and clamped to the note and detune, there are actually fixed amount of "steps", which is the PitchTable. This is apparently precomputed at runtime. In other words - the pitch output of 510 is unique, but the output of 511, 512, and 513 is the same, then 514 is unique, and so on. The pattern is basically 1, 3, 1, 3, so on.
I think. Maybe. I've never looked at this code before, I just learned what "cents" are, and as I've been told, the sound engine is, in technical terms, "fucked". Hope this helps tho.