VCO, LFO, DCO, DDS notes
VCO - Voltage-Controlled Oscillator
LFO - Low-Frequency Oscillator
DCO - Digitally Controlled Oscillator
DDS - Direct Digital Synthesis
DDS (Direct Digital Synthesis) (a.k.a. numerically controlled oscillator) is a way of digitally generating waveforms - which happens to be capable of a wide frequency range.
DDS ICs - which are dedicated to the task- are typically aimed at Mhz-rate function generation,
and care more about the range of frequencies, than about the waveforms it accesses, which is often fixed, sometimes just sinusouds.
Both reasons why most DDS ICs aren't a very obvious choice for musical design.
(...some are - in which case you can conside them precise, wide-range VCO in its own tiny little sound card, and you can have a microcontroller feed it arbitrary waveforms -- or indeed samples. DDS has been used by various samplers, and by some synthesizers that can sample.) (TODO: examples)
Yet the process is simple enough that you can do the same in a microcontroller at a reasonable rate,
and fairly comfortably if you only care about audio-rate speeds.
Whether a DAC, PWM, or digital out-and-resistor-ladder is your best output, and how regular you can get the output, and whether you need to add a lowpass because some of those are sample-and-hold style output (a.k.a. 'how to do a DAC wrong and actually introduce the stairstep that never existed'), is up to context.
In fact, DDS isn't an output method worked out to the lowest levels, it's more an angle on how to use a clock source to go about it.
The question of how you would play on such simple hardware can be a good introduction on DDS's view.
Say you wanted to play a sample at arbitrary rates, or three at once each at their own rate, how would you?
You would need three regular clock signals, each run at their own speed to go to the next sample on each clock, right? Even if your hardware gives you multiple clocks/timers, those usually come from clock division, so you cannot make one go at arbitrary rates.
What if you had one clock, considerably faster, and did a much larger, faster count, moving onto the next sample every many counts?
Why does that help? Well, in a fixed-point integer-like trick, you forget(/divide/shift away) some amount of lowest bits; the more of those lower bits you throw away, the finer the granularity you get to the sample rates you can play at. You don't need to control that main clock precisely - or even at all.
You just need to be able to increment, and bitshift. Those are cheap operations.
DDS would call that counter a phase accumulator (there are good reasons that you'll understand when reading up on the details), which indexes a waveform in 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)