convertitore Digitale-Analogico per suono

inizio ad avere le idee più chiare comunque smiley

Io credo di no, almeno non a sufficienza.

Gli interruttori nello schema B1-B4 non fanno altro che fornire Vmax o Vmin, che nel caso in figura sono rispettivamente +15V e 0V.

Come ti ha suggerito Astrobeed, se al posto degli interruttori/deviatori usi i pin di arduino ottieni lo stesso risultato. Quindi 4 pin per convertire un numero digitale in una grandezza analogica. Nota che con quattro bit ha solo 16 livelli di tensione differenti, cioè solo da 0 a 15 puoi contare. Quattro bit sono davvero pochi e fai fatica anche a ricreare una sinusoide. Io fossi in te partirei con due tensioni continue A=5 e B=3, A+B=8, A-B=2 il risultato delle operazioni le applichi ad una porta di arduino.

Il problema con le sinusoidi è che ti serviranno delle funzioni che sommano, sottraggono campioni di frequenza diversa, quindi stiamo parlando di tipi non conosciuti dal C/C++. Credo ti serva una classe per rappresentare una grandezza numerica che varia nel tempo e poi ti servono delle funzioni che operano somma e addizione.

Davvero questa è roba tosta, almeno per me che con la matematica faccio a botte da sempre e vince sempre lei.

Dopo l'esperimento con tensioni continue, mappi dei valori di una sinusoide approssimata in un array è applichi un valore di un elemento alla porta di arduino, il tempo tra una scrittura è l'altra determina la frequenza.

Se vuoi scrivere solo i primi 4 bit di una porta devi usare le maschere, più o meno così:
Supponiamo che PORTB vale 160 (valore che conivolge solo i bit alti del byte) e tu vuoi impostare i 4 bit bassi a 6 dovrai scrivere così
PORTB = (PORTB & 240) | 6

240 è la maschera per aggire solo sui 4 bit bassi, mentre se vuoi agire su quelli alti la maschera è 15, ovviamente dovrai fornire valori da 0 a 15 nel primo caso e da 16 a 255 nel secondo caso.

oppure se vuoi i 4 bit alti del byte fai lo shift di 4 a sinistra, però prima salva il valore da shiftare in una variabile temporanea e poi shit di 4 e poi assegni con PORTB = (PORTB & 240) | tmp_var.

Ciao.