The algorithm you are using for your wavetable playback (returning to 0 if you exceed the wavetable length) means that you have only integer multiples of the sampling rate available as frequencies. The example you shared was 48000 / 14 as a frequency, and if you wanted to go higher, the next option is 48000 / 13, which takes you from 3428Hz to 3692Hz, which is just greater than a semitone.
Now to make the steps smaller, what would happen if you ran your synth at 96000Hz instead? Well, the original frequency would be 96000 / 28, which is again 3428Hz, but the next integer step up would be 96000 / 27 which is 3555Hz, so by doubling the sample rate, you have doubled the number of frequencies you can represent.
Obviously you’d then need to decimate to get back to your 48Khz output rate - you may find that doing this later on removes over aliasing aspects which is beneficial to your other algorithms in the signal chain, but of course this would mean you generate twice as many samples for each oversampling, and the CPU cost may be limiting what you can do.
Ok I’ll definitely look into this. One thing I get a bit confused about is you say if I ran my synth at 96Hz, are you saying to change the sample rate in “audio settings” of Juce Plug-in Host / DAW or something like running the SynthVoice renderloop twice as fast?
it’s the most awesome open source juce visualizer that i ever found and also better than any other visualizer. you can turn up the fft size of its spectrum analyzer to the complete sampleRate and your cpu will still not fuck up for some reason
it’s a secret weapon. i only told you about the spectrum analyzer but you’ll see there are so many options you can’t even try them all (but they make sense)
Here is a video briefly demonstrating some of the capabilities of the synthesizer I am developing, including waveform editing, creation, folding, shaping, and mixing.
I’m assuming the proposal is that you generate your audio at an oversampled rate relative to the actual sampling rate, then you filter/downsample… there is a utility class for this in the Juce DSP classes (dsp::Oversampling), although it appears aimed at upsampling an existing audio buffer, for processing and then downsampling. In my own synth implementation I do use it, but added an extra function to create a upsampled buffer without any extra upsample processing (just providing an empty buffer at the multiple size based on the value of the oversampling rate to be used).