VCO, LFO, DCO, DDS notes
VCO - Voltage-Controlled Oscillator
Ramp core
LFO - Low-Frequency Oscillator
DCO - Digitally Controlled Oscillator
DDS - Direct Digital Synthesis
DDS (Direct Digital Synthesis) (a.k.a. numerically controlled oscillator) indicates a particular way of digitally generating waveforms.
DDC ICs, versus DDS as a technique
DDS is capable of a fairly wide frequency range and not really tied to any rate.
...but DDC ICs are typically dedicated to the task of higher, MHz-rate function generation, and more for lab equipment function generators, and some telecom needs, where simpler signals at higher frequencies are most useful important.
When you have more musical uses,
there is value to finding or making audio-range DDS instead of using a tiny range of such a general IC.
The frequency range to focus on is just a design choice, so you can focus on audio range better.
And as a technique, DDS easily lends itself to arbitrary waveforms and even sample playback, and in fact has been used by various samplers, and by some synthesizers that can sample, because it's pretty good at dealing with varying target frequencies, and at audio frequency it is not at all opposed to feeding it more arbitrary waveform data from ROM, RAM, or something external.
DIY DDS (as a means of introducing the workings)
If you're DIYing this, there are some further implementation details.
DDS is more about how to use a clock source, and some of the 'how to use this to produce output' is still up to you and context.
Actually, trying to make this on a microcontroller can be a good introduction on how the core of DDS works.
Say you wanted to play one sample at an arbitrary rate.
Or perhaps three at once each at their own rate.
How would you do that?
If you've meddled with sample playback, you know you need some very regular output,
to the point that if you are doing this with a DAC, you might want one with a small buffer,
or spend much of your time making a buffer do regular output on the uC side.
And that's just, for one. But what about three?
It seems a mess to organize both the timing of three clocks, and the output events they dictate.
But even if your hardware gives you multiple clocks/timers, you can rarely make one go at arbitrary rates (because those usually come from clock division), so how do you get any flexibility on playback rates?
Yet what if you used just one had one clock (considerably faster than your sample rate), and did a much larger, faster count, that somehow moving onto the next sample only every many counts?
"Okay, but that sounds very similar. Why does that help?"
It is similar to clock division. And if done in software it is even less efficient, but it helps for other reasons.
One, you can easily keep increasing multiple counts at different rates (that need not be integer multiples of each other).
And in an fixed-point integer-like trick, you forget(/divide/shift away) some amount of lowest bits,
and then use that as an index into the waveform you want to put out.
If you can vary the amount of those lower bits you throw away, you can trade speed and precision.
Perhaps most usefully, this means you now don't need to control that main clock precisely - or even at all - to change the playback rate.
You just need a regular clock (which we needed anyway), a counter, and a bitshift.
Those are cheap operations even in software (and DDS is relatively east to implement in hardware, which is why fast DDS ICs exist).
DDS would call that counter a phase accumulator (for good reasons that you'll understand when reading up on the details).
The waveform can be anything from a simple table, to memory external to the generation part (possibly ROM) - and you would only need one cycle of it, so the phase essentially is the index (with some extra possible tricks for symmetric waveforms).
(This is technically just the simplest form of DDS, phase truncation DDS. There is also dithered DDS, which does much the same but suppresses some harmonic-frequency issues (up to 12dB(verify)), at the cost of a slightly higher noise floor)