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.