Avoid the modulated output tap for late reverb

And fix the output filtering. The modulation code is still there since it's
(probably) technically correct, but the interaction with the feedback loop and
filtering on the output caused improper behavior which needs to be sorted out.
This commit is contained in:
Chris Robinson
2018-01-04 19:17:16 -08:00
parent fd8143fea0
commit e00ef16893
+14 -28
View File
@@ -1162,7 +1162,7 @@ static ALvoid UpdateLateLines(const ALfloat density, const ALfloat diffusion, co
length = lerp(LATE_LINE_LENGTHS[i] * multiplier, echoTime, echoDepth);
/* Calculate the delay offset for each delay line. */
State->Late.Offset[i][1] = fastf2i(length*frequency*FRACTIONONE + 0.5f);
State->Late.Offset[i][1] = fastf2i(length*frequency + 0.5f);
/* Approximate the absorption that the vector all-pass would exhibit
* given the current diffusion so we don't have to process a full T60
@@ -1438,6 +1438,8 @@ static void CalcModulationDelays(ALreverbState *State,
for(c = 0;c < 4;c++)
{
ALsizei offset0 = offsets[c][0] << FRACTIONBITS;
ALsizei offset1 = offsets[c][1] << FRACTIONBITS;
index = State->Mod.Index + phase_offset*c;
for(i = 0;i < todo;i++)
{
@@ -1448,8 +1450,8 @@ static void CalcModulationDelays(ALreverbState *State,
index = (index+1) % State->Mod.Range;
/* Calculate the read offset. */
delays[c][i][0] = fastf2i(sinus*State->Mod.Depth[0]) + offsets[c][0];
delays[c][i][1] = fastf2i(sinus*State->Mod.Depth[1]) + offsets[c][1];
delays[c][i][0] = fastf2i(sinus*State->Mod.Depth[0]) + offset0;
delays[c][i][1] = fastf2i(sinus*State->Mod.Depth[1]) + offset1;
}
}
State->Mod.Index = (State->Mod.Index+todo) % State->Mod.Range;
@@ -1679,23 +1681,10 @@ static ALvoid LateReverb_Faded(ALreverbState *State, const ALsizei todo, ALfloat
offset-State->LateDelayTap[j][1], j, fade
) * State->Late.DensityGain;
for(j = 0;j < 4;j++)
{
ALsizei delay0 = offset - (moddelay[j][i][0]>>FRACTIONBITS);
ALfloat modmu0 = (moddelay[j][i][0]&FRACTIONBITS) * (1.0f/FRACTIONONE);
ALsizei delay1 = offset - (moddelay[j][i][1]>>FRACTIONBITS);
ALfloat modmu1 = (moddelay[j][i][1]&FRACTIONBITS) * (1.0f/FRACTIONONE);
ALfloat r = DelayLineOut(&State->Late.Delay, delay0 , j)*(1.0f-modmu0)*(1.0f-fade) +
DelayLineOut(&State->Late.Delay, delay0-1, j)*( modmu0)*(1.0f-fade) +
DelayLineOut(&State->Late.Delay, delay1 , j)*(1.0f-modmu1)*( fade) +
DelayLineOut(&State->Late.Delay, delay1-1, j)*( modmu1)*( fade);
out[j][i] = f[j] + r;
}
for(j = 0;j < 4;j++)
f[j] += FadedDelayLineOut(&State->Late.Delay,
offset - (State->Late.Offset[j][0]>>FRACTIONBITS),
offset - (State->Late.Offset[j][1]>>FRACTIONBITS), j, fade
offset - State->Late.Offset[j][0],
offset - State->Late.Offset[j][1], j, fade
);
for(j = 0;j < 4;j++)
@@ -1704,6 +1693,9 @@ static ALvoid LateReverb_Faded(ALreverbState *State, const ALsizei todo, ALfloat
VectorAllpass_Faded(f, offset, apFeedCoeff, mixX, mixY, fade,
&State->Late.VecAp);
for(j = 0;j < 4;j++)
out[j][i] = f[j];
VectorReverse(f);
VectorPartialScatter(f, mixX, mixY);
@@ -1735,18 +1727,9 @@ static ALvoid LateReverb_Unfaded(ALreverbState *State, const ALsizei todo, ALflo
f[j] = DelayLineOut(&State->Delay, offset-State->LateDelayTap[j][0], j) *
State->Late.DensityGain;
for(j = 0;j < 4;j++)
{
ALsizei delay = offset - (moddelay[j][i][0]>>FRACTIONBITS);
ALfloat modmu = (moddelay[j][i][0]&FRACTIONBITS) * (1.0f/FRACTIONONE);
ALfloat r = DelayLineOut(&State->Late.Delay, delay, j)*(1.0f-modmu) +
DelayLineOut(&State->Late.Delay, delay-1, j)*( modmu);
out[j][i] = f[j] + r;
}
for(j = 0;j < 4;j++)
f[j] += DelayLineOut(&State->Late.Delay,
offset - (State->Late.Offset[j][0]>>FRACTIONBITS), j);
offset - State->Late.Offset[j][0], j);
for(j = 0;j < 4;j++)
f[j] = LateT60Filter(j, f[j], State);
@@ -1754,6 +1737,9 @@ static ALvoid LateReverb_Unfaded(ALreverbState *State, const ALsizei todo, ALflo
VectorAllpass_Unfaded(f, offset, apFeedCoeff, mixX, mixY, fade,
&State->Late.VecAp);
for(j = 0;j < 4;j++)
out[j][i] = f[j];
VectorReverse(f);
VectorPartialScatter(f, mixX, mixY);