Al igual que ustedes siempre me salio la interrogante, solo que nunca me puse a hacer un ejercicio para resolverlo...
La solucion que se me ocurrio es generando una base de tiempos estandar usando el timer e interrupciones, Durante cada interrupcion se evalua cada tono y se prende o se apaga un bit de cada puerto por cada tono, es decir si habra 8 tonos a tocar necesitaran 8 pines para cada uno
Luego con un OPAMP configurado como sumador podemos sumar la salida de cada uno de los pines y asi mandar la resultante a una bocina
La otra seria evaluar numericamente cada tono por tiempos y con eso mandar la salida a un DAC solo que requiere mas trabajo matematico del micro..