RJHollins wrote:The 'bit crusher' section is a little confusing. Fully Clock-wise sounds strange, but backing off a bit it snaps in to a better sound.
Yes, that has a very simple explanation/excuse. After releasing the initial version, the crowd demanded BLOOD!!! -
wanting to see what this oversampler is capable of... So I hastily put together the first effect with notorious aliasing issues that came to my mind, which was a bitcrusher. I didn't really bothered to properly scale the controls in any sensible way.
RJHollins wrote:Butterworth filters. Wonder how these are influencing the UP/Down sampling.
They are there to remove low-pass the signal and remove aliasing. The upsampling actually does no interpolation, so the upsampled signal contains a lot of crap in frequencies above the original nyquist. Low-pass filter simply removes that -> interpolates the signal. In Downsampling the same thing happens in reverse - > the upsampled schematic creates frequencies that end up above the original nyquist frequences, so you need to low-pass them before down-sampling the signal to original sample rate.
I choose Butterworth filters, semi-randomly, because they have flat-ish phase response in the pass-band, which I thought was a desireable property. It doesn't really matter that much, what kind of low-pass filter you use.
Also, there is one thing I forgot to mention about this entire contraption: IT ONLY WORKS IF YOUR CODE CONTAINS ONLY STAGE(0) AND STAGE(2) CODE! If you include code that relies on stage1 or 3 code (like some stock delays do) it will not produce desirable results. Unfortunately, there is really no way to fix this. Stages get executed for the entire schematic. First all stage(0) get executed in the entire schematic, then stage(1) etc. per each sample. Most code relies on them being executed once per sample. If stage(2) gets looped N times and after that stage(3) gets looped N times, it would be massive inconsistency.
FlowStoner wrote:I wondered if this would also work in poly-section, because if it has to be,
filter optimization must guarantee all four process channels,
ok experiment day ....
Yes, it should also work in poly section, though I haven't confirmed it yet. Poly-section sometimes clears the channels in SSE variables, when voice is inactive, but that should be an easy issue to overcome (shufps to the rescue).
It also reminds me... sometimes we do not want to truly "oversample" some inputs, but still pass them to the oversampled section (things like voiceID, pitch or indexes for waveArray). I will have to include instructions on how to pass them in w/o messing with their values.