| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
The secondary reflections are spatially reflected and scaled by time already, so an
average of the primary and secondary doesn't make sense.
|
| |
|
| |
|
|
|
|
| |
To nake EffectProps a variant instead of a union, and avoid manual vtables.
|
| |
|
| |
|
|
|
|
|
| |
C++17 provides alignment-aware allocators for us, so we don't need to use our
own to make sure classes/structs are properly aligned.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This reduces the delay to provide a direct (no delay) line from the early
reflections to the late reverb delay buffer.
This also reduces the early reflection output gain by half. The reasoning here
is that EFX seems to expect only one set of initial reflections, while we use
two. And being close enough in time, nearly doubles the amount of output
energy.
This does seem to improve the "harshness" of certain reverbs, smoothing the
difference between reverbs, and makes it more like other implementations (still
some work to do on late reverb, though).
|
| |
|
| |
|
|
|
|
|
|
| |
Instead of "bouncing" the lines by indexing backwards for a not-quite-spatial-
opposite, do a proper mix that moves each line response to its true spatial
opposite position.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
It doesn't make much sense to include both early reflections to feed the late
reverb, since it increases the total energy in the reverb decay. This better
fits with the design described in papers for this type of reverb, and seems to
better match volume levels of hardware EAX/EFX reverb (though there are still
some apparent differences).
Note that this adds a bit more delay to the late reverb, specifically
EARLY_LINE_LENGTHS[0] * density_mult. This can be compensated for somewhat by
reducing the late reverb delay by that amount (clamping to a minimum of 0).
Alternatively, adjust the delay lines for the second early tap to have a zero-
delay pass-through line with 3 delay lines (as opposed to the current 4 delay
lines), as suggested by the paper "ADAPTING ARTIFICIAL REVERBERATION
ARCHITECTURES FOR B-FORMAT SIGNAL PROCESSING". Although doing so may require
additional adjustments to the delay lengths and gains to avoid the 0-length
lines accumulating unattenuated copies of the signal for the early reflection
output.
|
| |
|
| |
|
|
|
|
|
|
|
| |
Reverb needs to prioritize efficiency since it's expected that an app may use
multiple reverb effects simultaneously, and each individual effect may process
twice during a pipeline transition. Approximating sin helps by replacing a per-
sample libc call that we don't need to be perfectly accurate.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
And clean up some parameters
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
When non-simple properties are changed, the active reverb pipeline is switched
and the new parameters set on that one. The main process function will then be
set to fade out input on the old pipeline, fade in input on the new pipeline,
then process and mix both pipelines. After some number of samples (calculated
from its decay time), the old pipeline will stop processing.
This should improve the transition from a highly reverberant environment by not
harshly interpolating to the new environment, as well as better handle changes
to the all-pass and T60 filters.
|
| |
|
| |
|
|
|
|
| |
And use it to select the proper HF scales
|
|
|
|
|
| |
Not actually used yet, the device needs to track whether it's using 2D or 3D
mixing.
|
| |
|
|
|
|
| |
This reverts commit bf3f63fb4c5faa45784d7433d68b7013e29ee2c1.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Not sure if this is best, but it fixes the issue of upsampling lower orders to
higher orders multiple times (mixing lower order to higher order, cutting back
to lower order by dropping the extra channels, then upsampling again, applying
the HF scale multiple times and messing up the high frequencies/energy vector),
as well as having too-strong high frequencies of upsampled content in general.
As it is, with the new upsampling method, the lower order signal contributes to
some higher order channels, which helps offset the high frequency scaling
difference (except first- to second-order, which adds nothing).
|
| |
|
|
|
|
|
|
|
|
|
| |
These were actually missing from the current check for fading. But the EFX
documentation suggests these (along with the early/late gain and panning) can
be adjusted often without invoking a full change, as dynamically modeling an
environment would continually change these properties as the listener moves
around (changing the direction and distance to the reflective surfaces). So
ensuring they're kept up-to-date would be the way to go.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Separate the core delay line into early and late input delay lines. This will
be necessary to allow a second late reverb processing loop to decay after a
change.
Also ensure the early reflection delay line is long enough to write in
MAX_UPDATE_SAMPLES first without interfering with the subsequent read. And
ensure the modulation delay doesn't cause an underflow on the feedback offset.
Finally, move the loop inside the processing functions to minimize loop
iterations.
|
| |
|
| |
|
| |
|
| |
|
| |
|