Dynamic Oversampling up to 128x or more
-
@Frankbeat @fastermaster In fact one of the most important things in oversampling is the quality of the stop band filter.
a 16x OS with a good rejection has nothing to be ashamed of when compared to a 64x with a lesser rejection quality.
Unfortunately, the Juce filter doesn't appear to be that good, so I can understand the limitation to 16x might be problematic in some situations (though I haven't checked against another one) -
@ustk there are multiple filter options available in the JUCE sampler and I just picked one without giving it too much thought, so if you find parameters that sound better I'm happy to add those as options.
-
thanks guys, I'm working on a distortion emulation, so avoiding aliasing is a must, I want to offer the option of 4x 8x and 16x. I'll just need to figure what's the best filter to use in this case.
Did someone experimented with the filters? The reaper And aliasing seem to be quite good, I wonder what they're using.
-
I've been playing around with the filterHalfBandFIREquiripple in my hise projects and its really nice. You have to compensate for a but more latency compared to the current oversampling filter but this one is linear phase.
-
@pluginboi That is good to know
My knowledge of the topic stops there. But from what I know about filters, linear phase isn't better than conventional filters, they are just different tools. Since they cause pre-ringing as a result of phase compensation, they are generally bad on fast transient material because of the smoothing they create.I think having a filter selector in the oversample node would be great for selecting the one that better suits the needs.
-
@ustk said in Dynamic Oversampling up to 128x or more:
I think having a filter selector in the oversample node would be great for selecting the one that better suits the needs.
@Christoph-Hart Do you think adding a selectable oversampling type could be implemented? I'm getting a lot of requests for this and figured I'd hit you before I attempt to hack something together.
-
@orange How is oversampling useful in ScriptNode if other parts of your plugin do not?
-
@clevername27 said in Dynamic Oversampling up to 128x or more:
@orange How is oversampling useful in ScriptNode if other parts of your plugin do not?
removes aliasing and some intermodulations...
-
@Dan-Korneff if you want I have a source code tweak I can send you for a linear phase oversample mode in script node. I just don't have it built to be switchable between linear and minimum
-
Is there a use case for making this dynamically switchable? Otherwise I could make it a preprocessor that you can set in your extra definitions.
-
@Christoph-Hart For general applications, users are looking for linear phase filters, and for transient material, minimum phase is desirable. Having it be selectable would be super awesome if you're able.
-
@clevername27 If you use saturation or distortion (in some cases for the convolution too) in the plugin, you have to do oversampling in these parts, otherwise there will be Aliasing.
Apart from this, if there is no saturation or harmonic distortion in the other modules you use, you do not have to oversample; in fact, you should not do it so that you can ensure optimum CPU usage.
-
@orange Thanks - makes sense.
-
@Christoph-Hart Just a friendly little bump to see if this is on your radar.
-
-
@Dan-Korneff What happens if you wrap a 16x OS node into another 16x node?
-
@aaronventure Alright you get an error.
But using
Engine.setMinimumSampleRate(384000)
along with the 16x oversampling node seems to work, though. That should give you 128x in non polyphonic scriptnode. -
@aaronventure I was asking for switchable linear/minimum phase in the oversampling node.
I'll hack away at it this week. -
@Christoph-Hart Could you give me a hint on what you would do to achieve this?
switchable linear/minimum phase in the oversampling node
I don't want to fill you up with too many requests and would at least like to start with your suggested approach.
-
@Dan-Korneff you could probably do this in Faust using si.rev