the maths wasnt bad at all in the end, i just needed to think harder

here is how to do a cross over with 3 (easy to put more in ) samples

[pascal] // sample 1
if iEngineRPM <= iSample1RPM then
sSample1Volume := iEngineRPM;// iSample1RPM + (iEngineRPM - iSample1RPM);

if iEngineRPM > iSample1RPM then
sSample1Volume := iSample1RPM - (iEngineRPM - iSample1RPM);


// sample 2
if (iEngineRPM <= iSample2RPM)
and (iEngineRPM - iSample2RPM < (iSample2RPM shr 1))
and (iEngineRPM - (iSample1RPM shr 1) > 0) then
sSample2Volume := (iSample2RPM + (iEngineRPM - iSample2RPM) - (iSample1RPM shr 1));

if (iEngineRPM > iSample2RPM) and (iEngineRPM - (iSample1RPM shr 1) > 0) then
sSample2Volume := (iSample2RPM - (iEngineRPM - iSample2RPM) - (iSample1RPM shr 1));


// sample 3
if (iEngineRPM <= iSample3RPM)
and (iEngineRPM - iSample3RPM < (iSample3RPM shr 1))
and (iEngineRPM - (iSample2RPM shr 1) > 0) then
sSample3Volume := (iSample3RPM + (iEngineRPM - iSample3RPM) - (iSample2RPM shr 1));

if (iEngineRPM > iSample3RPM) and (iEngineRPM - (iSample2RPM shr 1) > 0) then
sSample3Volume := (iSample3RPM - (iEngineRPM - iSample3RPM) - (iSample2RPM shr 1));


// updating
AlSourcef(source1, AL_GAIN, sSample1Volume / (iMaxRPM shr 1));
AlSourcef(source2, AL_GAIN, sSample2Volume / (iMaxRPM shr 1));
AlSourcef(source3, AL_GAIN, sSample3Volume / (iMaxRPM shr 1));

AlSourcef ( source1, AL_PITCH, iEngineRPM / (iMaxRPM shr 1));
AlSourcef ( source2, AL_PITCH, iEngineRPM / (iMaxRPM shr 1));
AlSourcef ( source3, AL_PITCH, iEngineRPM / (iMaxRPM shr 1));[/pascal]

that sounds much much better then the last method i was using