It’s been a while that this question was posted, but I’m a bit surprised no-one has responded to this as this is actually a pretty good critique/question…
By self-modulating, you’ll speed up and slow down the positive and negative parts of the waveform differently, causing a frequency offset as the waveform spends more time in one part than the other, which on it’s part creats a dc-offset. If the input would be ac-coupled, this dc-offset would be automatically removed and the waveform should retain it’s original root frequency, no matter the modulation depth, something that is pretty important if you’re trying to play in a musical scale instead of percusive sounds.
An option to fix this is to use a dc-offset remover, which basically is just a simple 6dB highpass filter at a low frequency. It’s important here to not use a filter that has some non-linearities from itself as this can force it’s own dc-offset (the simple 2HP filter seems to not really work well for this, but my self creative passive highpass works a lot better) though resonance might be useful in some cases, in the end the simplest 6dB highpass filter using a capacitor and resistor worked best for me.
A nice idea is to put a distortion, fully rectifier waveshaper in the feedback path before the dc-offset-remover/highpass filter using a mixer/crossfader to mix between the original waveform and the distorted waveform. If you use the right highpass filter, any DC-offset should be removed and root-frequency should be kept at all modulation depths.
For cutoff frequency of this highpass filter, it’s nice to have a potentiometer for this as the phase-relations of the feedback modulation effect changes according to this cutoff frequency. Remember to add quite a bit of gain at very high cutoff frequency, as the output of the filter can get pretty attenuated, losing quite a bit of the range you can use to modulate your frequency.
Taken together with the above (rectifier+crossfader in feedback path), the sine itself can be smoothly morved between saw, triangle, pulse, square, peak while retaining it’s base frequency.
At least… that’s how it should work… when I do this digitally using code it works as expected, but when trying this with the rubicon, it doesn’t always “follow the rules”, probably/maybe because my self-made passive highpass filter doesn’t use an optimal resistor-capacitor pair, but I’m not sure of that.