Geração de acorde

eu já tinha visto esses gráficos e fico sempre com a mesma duvida...

o que significa o estado do meio? tu tens pwm on, pwm off e a linha para no meio... como defines isso? e como adaptas isso a um sistema que só tem dois estados?

mas faz assim, encontra um denominador comum nas notas todas que queres, tipo 100 ms ou 20 ms. divide o periodo da onda por esse valor.
cria uma interrupção temporizada com os tais ms, e vai gerando as notas e o resultado assim.

eu meto já um exemplo.

ISR(timer1 ou 2) {


}

//também podes fazer

#define DO 0
#define RE 1
#define MI 2
//...


const unsigned char periodos [] = {10,20,30,40,50,60,70, 80};//na realidade, meios períodos... isto terias de fazer a matemática. É só um exemplo. 
unsigned char onda[8];
unsigned char saidas = 0;
unsigned int tempo = 0;

ISR(timer) { //imaginemos de 10 em 10 ms
unsigned char i;
tempo++; //incrementa o tempo

for (i=0; i<=7; i++ ){ //para as oito notas
    if (tempo % periodos[i] == 0) {
    togBit(saidas, i); // depois o bit i da variavel saidas corresponde à nota com indice i    tens de usar aquelas macros uqe postei para isto. 
    }
}
//isto vai-te dar o estado das várias notas actualizado de x em x tempo (depende de como activares o timer)

loop() {

//imagina que queres do + mi

if ( testBit(saidas, DO) + testBit(saidas, MI))  //podes e deves trocar o mais por || ("ou" lógico, mas fica mais simples de compreender assim talvez. )
    SetBit (PORTO, PINO_DO_PWM);
else
    ClrBit(PORTO, PINO_DO_PWM);
}

}

O problema é que 1/440 dá uns 2 milissegundos... e o arduino talvez não seja tão potente assim. É caso de ver se consegues gerar uma nota com este método.