Per far suonare una scheda tramite le librerie di base dell’Arduino IDE noi utiliziamo il comando tone(pin, frequency, duration) al quale passiamo i parametri che gli indicano su quale piedino abbiamo collegato il buzzer, che frequenza vogliamo che sia generata e la durata del suono.
Generalmente il buzzer (o l’uscita audio) è solo una per cui, il piedino risulta essere sempre lo stesso per tutte le note.
La frequenza e la durata , sono espressi da numeri interi che indicano la frequenza in Herz e la durata in millisecondi.
Per eseguire un brano, data la quantità di note e di durate corrispondenti, questi dati sono caricati in un’array, questa soluzione ci permette di eseguire la sequenza con un ciclo di programma che scorre l’array leggendone il contenuto e utilizzandolo per eseguire il comando tone() in maniera adeguata.
Il codice che scarichiamo tramite il sito Dragao sem chama funziona su questo principio per cui, ad un certo punto del nostro codice troveremo qualcosa del genere
……….
int melody[] =
{
// Dart Vader theme (Imperial March) – Star wars
// Score available at https://musescore.com/user/202909/scores/1141521
// The tenor saxophone part was used
NOTE_AS4,8, NOTE_AS4,8, NOTE_AS4,8,//1
NOTE_F5,2, NOTE_C6,2,
NOTE_AS5,8, NOTE_A5,8, NOTE_G5,8, NOTE_F6,2, NOTE_C6,4,
NOTE_AS5,8, NOTE_A5,8, NOTE_G5,8, NOTE_F6,2, NOTE_C6,4,
NOTE_AS5,8, NOTE_A5,8, NOTE_AS5,8, NOTE_G5,2, NOTE_C5,8,
NOTE_C5,8,NOTE_C5,8,
NOTE_F5,2, NOTE_C6,2,
NOTE_AS5,8, NOTE_A5,8, NOTE_G5,8, NOTE_F6,2, NOTE_C6,4,
………
Se osservate il codice noterete che nell’array melody[], vengono caricati coppie di valori composte da una costante “NOTE_xn” e da un numero intero. La costante fa riferimento alla tabella delle frequenze per ogni nota mentre il numero serve al programma per calcolare la lunghezza della nota ovvero il tempo per il quale il suono dovrà essere emesso.
Per associare ad ogni suono l’accensione di un LED, dobbiamo aggiungere ad ogni nota questa informazione per cui, nella soluzione che ho attuato, il caricamento dell’array è cambiato come segue
……….
int melody[] =
{
// Dart Vader theme (Imperial March) – Star wars
// Score available at https://musescore.com/user/202909/scores/1141521
// The tenor saxophone part was used
//A -> 13
//B -> 12
//C -> 11
//D -> 10
//E -> 9
//F -> 7
//G -> 6
//REST -> 5
NOTE_AS4,8, 13, NOTE_AS4,8, 13, NOTE_AS4,8, 13,//1
NOTE_F5,2, 7, NOTE_C6,2, 11,
NOTE_AS5,8, 13, NOTE_A5,8, 13, NOTE_G5,8, 6, NOTE_F6,2, 7, NOTE_C6,4, 11,
……
Come potete vedere, oltre ad una tabella che aiuta a ricordare quale piedino (LED) è abbinato ad ogni nota, nei valori con cui viene inizializzato l’array è stato aggiunto un nuovo valore (nell’esempio in grassetto) che associa ad ogni nota il pin del LED che vogliamo far accendere durante il tempo in cui la nota suona.
Questa modifica altera l’originale struttura dell’arry e dunque, richiede un intervento in tutte quelle parti di codice che ne predispongono la lettura e successivamente, l’introduzione di una routines che gestisca l’accensione e lo spegnimento dei LED.
Approfondimenti:
a) Facciamo musica con il comando tone()
b) Il comando tone()
Lascia un commento