Yep, that is all it takes to play multiple notes at once. Just add up all the sine waves and output the new weird looking wave.
However, the calculator can only output a 1 or a 0, so how do you pull off all the intermediate steps of the new wave? That is where the real trouble comes in to play. For this, you would have to make your own version of freq() whereby using Pulse Width Modulation, (turning the link port on and off really fast), you simulate say, 32 different voltage steps. (That might be the most grammatically strange sentence I've written on Omni)
It's exactly as thepenguin77 said: use Pulse Width Modulation. To explain PWM a bit better, why don't I give an example of some basic PWM.
An nice, simple example would be something like having an LED fade on and off. LEDs have two states: ON and OFF. So how do you fade it? The idea is the same as grayscale on a monochrome calculator screen: some of the time it's turned on, and some of the time it's turned off. But the switch is done very quickly. You can think of it as
pulsing on and off.
Pulse Width Modulation means changing the width (length) of the on/off pulses.
In this case, thepenguin77 mentioned simulating 32 voltage steps. Basically, that means that every 32 1's or 0's you send represents one pulse. You then change how much of that time you're sending a 1 or sending a 0 to change the pulse frequency. So for fading an LED, the pulses would look something like:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 00000000000000000000000000000000 (Lowest possible step); 10000000000000000000000000000000 11000000000000000000000000000000 ... 11111111111111110000000000000000 11111111111111111000000000000000 11111111111111111100000000000000 ... all the way up to ... 11111111111111111111111111111100 11111111111111111111111111111110 11111111111111111111111111111111 (Highest possible step) |
That would fade it from being completely off, to completely on. The same idea goes for varying the frequencies that you are playing, though it's obviously a lot less linear.