Nice! if you later decide to use portamento or pitch modulation of the carrier osc, you can always replace the clip~ object with max~ and send the signal version of the carrier frequency to one side, and the modulation to the other. this will act identically as it will either send mod values higher than the carrier or the straight carrier.
I could be wrong, but I think the bob~ object has a clipping/saturating component that is more elegant and less likely to alias than a straight clip~. is this true? I think it can also accept startup messages to specify oversampling for better performance in this way. I think you could scale input to bob~ even to clip at the carrier frequency. But it would be nice to know if bob~ is actually good for this job before patching it up.
I am worried about the aliasing you will get with more complex waveforms than sine. I am interested in some methods like polyBLEP to smooth out discontinuities and wonder if they could be used downstream from an audio rate modulated oscillator and still function correctly. I've avoided this in my own oscillators by doing silly and expensive things with short delay lines. I'll forward my findings if i make any headway on this.
it's totally my pleasure to mess around with oscillator/synth component
stuff in pure data! But beware my advice because my stuff is pretty
scrappy.