FMOp - Oversampling only on feedback?


i’m new to the community. i’m using a lot the fmop by bogaudio, which i found pretty good.

looking at the code, i see the module does oversampling only on feedback:

any reasons of this? why not oversampling when doing “normal” fm input/depth? pretty curious about this.

@matt? can you help me to understanding this behaviour?


FYI, my kitchen sink FM VCO is quite similar, and does oversample all the fm. For some reason my feedback doesn’t sound as good as FMOP. Kitchen sink also sues more cpu. But it has a ton of useful trixks.

i think its really a matter of quality on oversampling.

i’m able to replicate the same feedback of fmop using its oversampling method. if i remove oversampling, it just play bad. the same if i use a not-so-good oversampling method, like the one within Rack:

static constexpr int oversample = 8;
float buffer[oversample];
rack::dsp::Upsampler<oversample, oversample> upsampler;
rack::dsp::Decimator<oversample, oversample> decimator;

upsampler.process(output, buffer);
output = decimator.process(buffer);

not sure about other methods though, should i try some new ones.

what i still don’t get is the reason why he doesn’t oversample when using fm input directly :slight_smile:

Well, my oversampling quality gets few complaints. First started doing it in my Fundamental VCO-1 in vcv .0.6. Since then the same thing in Shaper, Stairway, Saws, and kitchen sink. You might want to try it or look at it.

All I have to say is that if @matt takes your suggestion, it should be possible to get switch to the existing behavior. The way I’ve used FM-Op sounds good with the existing sound engine.

1 Like

@chaircrusher mine is not a suggestion :slight_smile: i’d just to know the reasons about this choice.

just curiosity, talking with the master, thats all… try to learn some more. sorry if has been read like an offense :frowning:

I wasn’t upset.

Frankly, it’s probably an oversight to not oversample with external FM…I say probably because it’s been a while and I don’t remember for sure. But probably. That said, to @chaircrusher’s point, I’m fairly loathe to mess with FM-OP at this point, because people like it, and some of that is an accident.

The big difference with my oversampling vs the code from Rack is that, rather than upsample, I generate the signal at a higher sample rate (oversample * SR), then decimate those samples. Aliasing is present as soon as the signal is generated, but doing so at the higher effective rate moves the wraparound point out to oversample * nyquist, and so the aliasing is mostly removed by the decimator, which among other things is an LPF at nyquist. I use a CIC decimator, which works pretty well.


I don’t think anyone upsamples in a VCO, do they? In any case generating at the higher internal rate and then downsampling is what I would think everyone does. It’s what I do in Saws, Kitchen Sink, and Functional VCO-1.

Thanks for the answer @matt :+1: its how I thought :slight_smile:

Just saw this: “Anti-aliasing techniques are applied when feedback or external FM are in use. Either condition for anti-aliasing can be disabled on the context menu. Prior to version 1.1.36, due to a long-standing bug, there was no anti-aliasing for external FM, unless feedback was also on. To get that behavior back, the true vintage FM-OP sound , disable “Anti-alias external FM” on the menu.”.

Nice, you fix it! Thanks @matt

1 Like