Logo ODE

Facciamo suonare la Maker Uno – r01 (parte 3)

Nella parte 2 abbiamo arricchito l’array con le indicazioni per i LED e, facendo questa operazione abbiamo passato il numero di elementi per ogni nota da 2 a 3.
Questa operazione ha reso l’array non più utile per il programma che utiliziamo per cui adesso dobbiamo adeguare le parti di programma in cui l’array viene letto così che il terzo dato che abbiamo introdotto per ogni nota non impedisca al programma di suonare correttamente il brano.

Leggendo il listato del programma dall’inizio verso la fine, cerchiamo i punti in cui viene usato l’array melody[].
Ovviamente iniziamo la ricerca dalle righe successive a quelle dovo abbiamo provveduto a caricare (inizializzare) i valori al suo interno. Così facendo troveremo

……..
// sizeof gives the number of bytes, each int value is composed of two bytes (16 bits)
// there are two values per note (pitch and duration), so for each note there are four bytes
int notes = sizeof(melody) / sizeof(melody[0]) / 2;
………

In questa riga, la viene calcolata la variabile “notes” la quale assume il valore del numero di note da suonare. Come descritto nelle note del programmatore, si prende il numero totale dei bytes occupati dall’array, lo si divide per la lunghezza in bytes di un elemento (gli elementi sono tutti “int” in quanto l’array è stato dichiarato come “int”), il valore ottenuto corrisponde al numero di celle (valori) caricate nell’array. Dividendo il numero di celle per il numero di parametri inseriti per ogni nota (2 nella versione originale) si ottiene il numero delle note che sono state inserite nell’array.
Dopo il nostro intervento di arricchimento delle informazioni contenute nell’array il 2 va portato a 3 in quanto ora sono 3 i parametri per ogni nota dunque dobbiamo modificare il codice come segue

……..
// sizeof gives the number of bytes, each int value is composed of two bytes (16 bits)
// there are two values per note (pitch and duration), so for each note there are four bytes
int notes = sizeof(melody) / sizeof(melody[0]) / 3;
………

fatta questa prima modifica, passiamo oltre e, questa volta cerchiamo le righe dove viene calcolato il puntatore che verrà usato per leggere le note (l’array).
E’ all’inizio della loop() che troviamo l’inizializzazione del ciclo for() dove, nel calocolo per la generazione dell’indice di lettura dell’array (variabile int “thisNote”), possiamo vedere la costante 2 che prima definisce il fattore di moltiplicazione e poi il fattore di crescita per l’indice “thisNote”.

…….
void setup()
{
// iterate over the notes of the melody.
// Remember, the array is twice the number of notes (notes + durations)
for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2)
{
………

anche in questo caso dobbiamo intervenire modificando il valore da 2 a 3 ottenendo

…….
void setup()
{
// iterate over the notes of the melody.
// Remember, the array is twice the number of notes (notes + durations)
for (int thisNote = 0; thisNote < notes * 3; thisNote = thisNote + 3)
{
………

A questo punto, scorrendo il codice troveremo altre righe dove si fa riferimento all’array “melody[]” ma, se le osserviamo attentamente, scopriamo che l’array da questo momento in poi, l’array viene letto per ricavarne i valori necessari alla produzione della nota e non per gestirne l’indice e la lettura viene eseguita tramite l’indice “thisNote” per cui non è più necessaria nessun’altra modifica al programma.

Se abbiamo fatto bene il nostro lavoro a questo punto, dopo aver salvato le modifiche, dovremmo poter compilare senza errori ed eseguire il codice ottenendo l’esecuzione della melodia (senza alcuna azione da parte dei LED) senza errori o problemi di sorta.
Se funziona tutto, passiamo al punto successivo.


da

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.