Arduino Forum

International => Italiano => Software => Topic started by: matt-korban on Mar 21, 2013, 01:27 pm

Title: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 21, 2013, 01:27 pm
ciao ragazzi... ci sto provando già da un po' ma non riesco a risolvere il problema... vi spiego riassumendo:

il mio programma deve riprodurre una melodia da suspance (quella di fringe :) e fino a quì tutto ok... il punto è che la melodia dura un po', quindi prima che finisca passano alcuni secondi, durante i quali il programma rimane bloccato...

quello che vorrei fare è fermare immediatamente la riproduzione dela melodia al cambio di stato di un pulsante... come cappero faccio? cioè mentre la melodia suona, non riesco a leggere il cambio di stato del pulsante, e quindi non riesco a far "accendere il mio ipotetico led", se non alla fine della stessa... qualche idea? ho provato con while, e for, ma niente...

Code: [Select]

#include "pitches.h"

int ledRosso = 4;
int ledBlu = 5;
int pulsanteRosso = 2;
int pulsanteBlu = 3;
int sirena = 6;
int statoRosso = 0;
int statoBlu = 0;
int melody[] = {
  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
int noteDurations[] = {
  4, 8, 8, 4,4,4,4,4 };




void setup(){
  pinMode (ledRosso, OUTPUT);
  pinMode (ledBlu, OUTPUT);
  pinMode (pulsanteRosso, INPUT);
  pinMode (pulsanteBlu, INPUT);
  pinMode (sirena, OUTPUT);
}



void loop() {
  statoRosso=digitalRead(pulsanteRosso);
  if (statoRosso==HIGH){
    digitalWrite(ledRosso, HIGH);
    for (int i=0; i<=5; i++){
    noTone(sirena);
    tone(sirena, 880, 200);
    delay(50);
    noTone(sirena);
    tone(sirena, 1000, 200);
    delay(50);
    noTone(sirena); 
    tone(sirena, 1400, 200);
    delay(50);
    }
    delay(1000);
    digitalWrite(ledRosso, LOW);
  }
  else if(statoRosso==LOW){
    melodia();
  }
}

void melodia(){
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/noteDurations[thisNote];
    tone(sirena, melody[thisNote],noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(sirena);
  }
}
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 02:02 pm
Utilizza millis() invece dei delay()...
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 21, 2013, 02:52 pm
fatto... non funziona comunque... grazie lo stesso :)
qualche idea del perchè non funzioni?
Title: Re: uscita immediata da un loop o un ciclo
Post by: pablos71 on Mar 21, 2013, 02:56 pm

Utilizza millis() invece dei delay()...


cosa centra il delay con l'intercettare un evento durante il ciclo?

Prendi un pin che abbia l'interrupt, lo attivi, questo resterà in attesa di un cambio anche durante l'esecuzione di una funzione diversa dal loop.  

http://gonium.net/md/2006/12/20/handling-external-interrupts-with-arduino/
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 03:16 pm
@Pablos
C'entra eccome. Il micro si blocca, fa esattamente quello che gli dici di fare. Il problema è: perché non riesci a leggere lo stato di un pin? Probabilmente perché sei bloccato dentro un delay a non fare niente, ovvero il micro sta li ad aspettare per un secondo.

@matt
Allora perché dentro il loop vedo alcuni delay(50) e un bel delay(1000)?
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 21, 2013, 03:31 pm
@janos

be, quello li sopra è sempre il vecchio codice... ho fatto la prova che mi hai detto e ho cambiato tutti i delay con i millis, ma non funziona...
ma poi scusa, millis non inizia a contare da quando la scheda inizia ad eseguire il programma? a me non serve quello, mi servono i delay per creare quel tipo di suono che voglio io... grazie dell'interessamento comunque! :)
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 21, 2013, 03:33 pm
@Pablos
ho visto il link che mi hai mandato, sembra buono... mi da un errore il codice che ha postato il tipo però... ho anche aggiunto la libreria che mi dice di aggiungere, ma non mi riconosce    GICR |= ( 1 < < INT0);   
forse perchè lui usa un atmega8... bo...
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 03:43 pm
Mica li devi sostituire e basta... Sennò quale sarebbe la differenza?
Vedo di buttare giù una bozza, poi la smussi te...
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 04:02 pm
Ti consiglio di leggere qui: http://arduino.cc/en/Tutorial/BlinkWithoutDelay (http://arduino.cc/en/Tutorial/BlinkWithoutDelay)

Scusami se il codice è diventato "largo" ma mi sta troppo sulle scatole che il programma di Arduino usi due spazi per le indentazioni, quindi ne uso uno esterno per scrivere il codice e uso i TAB, ma quando incolli il codice qui poi è un macello.... Ti consiglio di installarti Notepad++ (è gratuito) e incollare li il codice.

Code: [Select]
#include "pitches.h"

int ledRosso = 4;
int ledBlu = 5;
int pulsanteRosso = 2;
int pulsanteBlu = 3;
int sirena = 6;
int statoRosso = 0;
int statoBlu = 0;
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
int noteDurations[] = {
4, 8, 8, 4,4,4,4,4 };




void setup(){
pinMode (ledRosso, OUTPUT);
pinMode (ledBlu, OUTPUT);
pinMode (pulsanteRosso, INPUT);
pinMode (pulsanteBlu, INPUT);
pinMode (sirena, OUTPUT);
}


unsigned long int inizioTimer;
byte stato;
bool toneImpostato;
byte contatore;
bool fineCiclo;

void loop() {
statoRosso=digitalRead(pulsanteRosso);
if (statoRosso==HIGH){
if (!fineCiclo) {
digitalWrite(ledRosso, HIGH);
if (contatore < 5) {
switch (stato) {
case 0:
if (!toneImpostato) {
tone(sirena, 880, 200);
toneImpostato = true;
inizioTimer = millis();
};
if (millis() - inizioTimer >= 50) {
stato++;
toneImpostato = false;
};
break;

case 1;
if (!toneImpostato) {
tone(sirena, 1000, 200);
toneImpostato = true;
inizioTimer = millis();
};
if (millis() - inizioTimer >= 50) {
stato++;
toneImpostato = false;
};
break;

case 2:
if (!toneImpostato) {
tone(sirena, 1400, 200);
toneImpostato = true;
inizioTimer = millis();
};
if (millis() - inizioTimer >= 50) {
stato = 0;
contatore++;
toneImpostato = false;
};
break;

default:
stato = 0;
contatore = 0;
toneImpostato = false;
break;

}
}
else {
if (!toneImpostato) { //Ho riciclato una variabile che in questa parte del codice non serve
inizioTimer = millis(); //Qui ne ho riciclata un'altra
toneImpostato = true;
}
if (toneImpostato && (millis() - inizioTimer >= 1000)) {
digitalWrite(ledRosso, LOW);
fineCiclo = true;
};
};
}
//Se non metti questa riga lui ti esegue a diritto
//Così invece fa un ciclo e prima di fare il successivo aspetta che tu alzi il tasto
else (!digitalWrite(ledRosso, HIGH)) fineCiclo = false; //Se non metti questa riga lui ti esegue a diritto
}
else {
melodia();
}
}

void melodia(){
 for (int thisNote = 0; thisNote < 8; thisNote++) {

   // to calculate the note duration, take one second
   // divided by the note type.
   //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
   int noteDuration = 1000/noteDurations[thisNote];
   tone(sirena, melody[thisNote],noteDuration);

   // to distinguish the notes, set a minimum time between them.
   // the note's duration + 30% seems to work well:
   int pauseBetweenNotes = noteDuration * 1.30;
   delay(pauseBetweenNotes);
   // stop the tone playing:
   noTone(sirena);
 }
}
Title: Re: uscita immediata da un loop o un ciclo
Post by: pablos71 on Mar 21, 2013, 04:13 pm
non centra perchè lui è dentro a una funzione quando ha bisogno di leggere la pressione del bottone che impegna il suo tempo, non ha  mica un delay da 10 minuti

loop()

Vai alla funzione 1()
Vai alla funzione 2()
Vai alla funzione 3()
Vai alla funzione 4()
leggi il pulsante

il pulsante lo legge solo quando ha terminato le 4 funzioni, ci vuole qualcosa che intercetti il pulsante interrompendo per un istante tutto quello che il micro sta facendo, questo lo fa solo attivando un interrupt
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 04:14 pm
P.S. Per usare gli interrupt leggi qui:
http://arduino.cc/en/Reference/AttachInterrupt (http://arduino.cc/en/Reference/AttachInterrupt)
http://arduino.cc/en/Reference/DetachInterrupt (http://arduino.cc/en/Reference/DetachInterrupt)

@Pablos
Prima di dare suggerimenti agli altri ti consiglio di approfondire tu stesso le tue conoscenze in materia, visto che non sai la differenza fra delay() e millis() e che suggerisci improbabili esempi sulla gestione degli interrupt quando ci sono le apposite funzioni... Inoltre qui, anche usando l'interrupt, se sei bloccato in un dealy non ne esci.
P.S. Leggi per bene il mio codice e poi parla... Inoltre consiglio anche a te di leggere http://arduino.cc/en/Tutorial/BlinkWithoutDelay (http://arduino.cc/en/Tutorial/BlinkWithoutDelay)
Title: Re: uscita immediata da un loop o un ciclo
Post by: pablos71 on Mar 21, 2013, 04:23 pm
Si janos vado a studiare, intanto tu fagli usare un millis() per 50ms
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 04:28 pm
Per te sono un'inezia 50ms ma nella realtà dell'elettronica 50ms sono un tempo abissale. Pensa che il processore esegue un'istruzione ogni 62ns, quindi con un delay(50) fai stare fermo il processore per ben 806.000 operazioni. Inoltre quello che conta di più è imparare il metodo, quando sai come usarlo poi decidi tu se e quando usarlo...
Title: Re: uscita immediata da un loop o un ciclo
Post by: Madwriter on Mar 21, 2013, 04:36 pm

Si janos vado a studiare, intanto tu fagli usare un millis() per 50ms

ai fini pratici ha ragione pablos ai fini teorici ha ragione janos  :smiley-mr-green: ora non litigate o vi mando al quizzettone  ;)
Title: Re: uscita immediata da un loop o un ciclo
Post by: lestofante on Mar 21, 2013, 04:38 pm
ehm i delay NON bloccano gli interrupt, altrimentio non usciresti mai dalla delay visto che è basata su un interrupt del timer1 :)
Quote
Si janos vado a studiare, intanto tu fagli usare un millis() per 50ms

Quote
Per te sono un'inezia 50ms ma nella realtà dell'elettronica 50ms


ma un pulsante premuto (da un essere umano) per meno di 50ms è abbastanza impossibile nella realtà..

Il problema è che quei delay(50) sono in loop e seguiti anche da delay(1000), il che rende il tempo della funzione troppo alto.

Io sono d'accordo con janos di usare la millis() come per l'esempio blinkWithoutDelay;
in particolare , mio caro matt-korban, se non lo fai, finchè l'arduino suona NON legge i pulsanti.

il sistema consigliato da pablos non è errato, ma un'alternativa assai valida: l'uso della millis costringe a riscirvere buona parte del codice, con memorizzazione dello stato tra un loop e l'altro (macchina a stati), e permette di interrompere a metà l'esecuzione di una canzoncina per effettuarne un altra.
l'interrupt permette di sostituire la digitalRead con una variabile booleana settata dall'interrupt e azzerata dopo il suo uso nel loop(l'interrupt conterrà al suo interno un algoritmo anti-bounce, o un anti-bounce HardWare), ma essa non verrà usata finchè il loop corrente è finito, quindi la canzincina deve finire.

kiss
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 04:48 pm

ehm i delay NON bloccano gli interrupt, altrimentio non usciresti mai dalla delay visto che è basata su un interrupt del timer1 :)


Sono d'accordo con te, ma se lanci un delay(1000) e avviene un interrupt tu vai a eseguire l'interrupt. Il problema è che da interrupt non puoi fare niente perché una volta uscito torni a finire quanto ti resta del delay...

Diciamo che una soluzione intelligente, vista l'applicazione, sarebbe stata di lasciare i delay(50) e sostituire il delay(1000) con millis()...
Title: Re: uscita immediata da un loop o un ciclo
Post by: lestofante on Mar 21, 2013, 04:48 pm
approvo su tutta la linea  :smiley-mr-green:
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 21, 2013, 05:16 pm
cioè ma io posso scatenare un casino epocale per un quizzone di m____a?
quindi in parole povere mio caro lesto, quello che dovrei fare è???
usare gli interrupt oppure sostituire i delay con dei millis?

da quello che ho capito non basta sostituire le voci delay con millis, devo pure modificare il programma, giusto?
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 21, 2013, 05:24 pm
ma poi ragazzi il delay 1000 non mi da nessun fastidio in quanto tiene il led acceso per un secondo dopo la sirena, e questo mi sta bene... quello che blocca il programma è l'esecuzione della canzoncina prima che venga premuto il pulsante... una volta premuto il pulsante infatti, la canzoncina si ferma e parte una "sirena" che dura qualcosa come un secondo, e si accende un led...
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 21, 2013, 06:47 pm
Mi sono preso la briga di prendere il tuo codice e modificarlo, ti ho dato tutti i link per documentarti, che vuoi di più?
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 22, 2013, 11:01 am
un lucano! hahahaha ma si, ho caricato il tuo codice, ma non esce comunque dalla canzoncina quando premo il pulsante... magari riprovo un altro po e provo a smanettarci su, vediamo che succede...
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 22, 2013, 11:23 am
@janos
sto sistemando il tuo codice sull'ide e sembra tutto ok, però quando vado a caricare mi da questo errore:

could not convert 'digitalWrite(((uint8_t)ledRosso), 1u)' to 'bool'

su questa riga:
Code: [Select]

else (!digitalWrite(ledRosso, HIGH)) fineCiclo = false; //Se non metti questa riga lui ti esegue a diritto


qualche idea?
Title: Re: uscita immediata da un loop o un ciclo
Post by: lestofante on Mar 22, 2013, 11:47 am
digitalòWrite ritorna HIGH o LOW (int), non true/false (boolean), janos ha confuso questo particolare.

Sistema l'if di conseguenza.
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 22, 2013, 11:52 am
No, l'errore non è li. La condizione dell'if può essere applicata anche ai numeri (in questo caso un int) e viene considerato falso lo zero e vero un qualsiasi numero diverso da zero. Il problema è che mi sono confuso, prova a sostiruire la riga con questo:

Code: [Select]
else (!statoRosso) fineCiclo = false; //Se non metti questa riga lui ti esegue a diritto
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 22, 2013, 12:22 pm
hahahaha sembra la storia infinita... mi da un altro errore...

expected ';' before 'fineCiclo'

comunque ho provato a risolvere cambiando l'else con else if, oppure modificando la punteggiatura e carica bene... il problema però rimane sempre... mentre suona non legge il pulsante... devo tenerlo premuto per farglielo leggere alla fine della musichetta...
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 22, 2013, 12:56 pm
Allora, vediamo un attimo di fare il punto perché probabilente non ho capito bene cose deve fare... Me lo spieghi nel dettaglio?
Title: Re: uscita immediata da un loop o un ciclo
Post by: Maurotec on Mar 22, 2013, 12:58 pm
Non vorrei risultare noiso o di difficile comprensione.

Code: [Select]

int melody[] = {
 NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

Se ci fosse un nota END_NOTE, si potrebbe usare un while, anzi meglio una funzione con indice static.
Invece dell'array si può usare una array di struct, dove struct note contiene i campi, "note", "durata" e "pausa"

Ora una funzione processa solo una nota ed esce, grazie ad una variabile indice static, posso chiamare un numero di volte infinito questa funzione, e ad ogni chiamata l'indice viene incrementato, quando leggendo struct note trovo che "note" è uguale a 255 (cioè END_NOTE), azzero il contatore static index e alla prossima chiamata si ricomincia da dove si era interrotto.

La funzione viene processata nel loop e ritorna dopo aver suonato una nota la durata e la pausa, ma se dentro la funzione controllo una variabile di stato ricavata con la gestione dei PIN_CHANGED, posso bloccare il codice. Se il tempo per processare una nota la durata e la pausa non è molto alto
posso gestire il pulsante in pooling.

Mi rendo conto, sono poco comprensibile, ma è una buona soluzione.

Ciao.
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 22, 2013, 01:14 pm
Taparia tapioco come fosse antani a destra, che ne dici?  :smiley-yell: :smiley-yell: :smiley-yell:

http://www.youtube.com/watch?v=JU-QZ7yoyd4 (http://www.youtube.com/watch?v=JU-QZ7yoyd4)
Title: Re: uscita immediata da un loop o un ciclo
Post by: lestofante on Mar 22, 2013, 01:23 pm

No, l'errore non è li. La condizione dell'if può essere applicata anche ai numeri (in questo caso un int) e viene considerato falso lo zero e vero un qualsiasi numero diverso da zero. Il problema è che mi sono confuso, prova a sostiruire la riga con questo:

Code: [Select]
else (!statoRosso) fineCiclo = false; //Se non metti questa riga lui ti esegue a diritto


hai ragione, dal "wiring.h"

Code: [Select]
#define HIGH 0x1
#define LOW  0x0
Title: Re: uscita immediata da un loop o un ciclo
Post by: matt-korban on Mar 22, 2013, 03:44 pm
aaaaaaaaallora... sto costruendo un quizzone... praticamente squadra rossa e squadra blu si contenderanno la vittoria a suon di risposte giuste o sbagliate... ho 2 pulsanti, uno rosso ed uno blu, 2 led uno rosso ed uno blu, e una sirena (semplice altoparlante)...
deve funzionare in questa maniera:

appena viene fatta la domanda dal "conduttore" 2 rispettivi membri delle squadre si alzeranno e andranno al pulsante correndo... il primo che lo preme deve rispondere... in base alla risposta aggiudica il punto alla squadra...

quindi, nel mio programma fino a quì non c'è niente di complesso; ho solo 2 pulsanti con 2 led ed una sirena... se viene premuto il pulsante rosso si accende il led rosso e suona la sirena, idem per il blu, cambia solo il led che si accende (blu al posto del rosso)...

per fare il tutto più carino però, volevo che il mio quizzone, riproducesse una musica in loop mentre il conduttore fa la domanda, fino a quando non viene premuto uno dei 2 pulsanti... ecco perchè alla pressione del pulsante IMMEDIATAMENTE deve smettere la musica, suonare la sirena e accendere il rispettivo led di squadra... se arduino fosse multitasking non ci sarebbero problemi, ma dal momento che non lo è, come cappero posso fare???
Title: Re: uscita immediata da un loop o un ciclo
Post by: Madwriter on Mar 22, 2013, 03:47 pm
vuoi per caso dare anche una scossa elettrica al concorrente che sbaglia la domanda? :smiley-mr-green:
la fine di questo topic sarà tragica  :.
Title: Re: uscita immediata da un loop o un ciclo
Post by: leo72 on Mar 22, 2013, 03:57 pm

se arduino fosse multitasking non ci sarebbero problemi, ma dal momento che non lo è, come cappero posso fare???

facendo lavorare le meningi  ;)
http://www.arduino.cc/en/Tutorial/PlayMelody

Qui vedi, nel secondo sketch di esempio, che fanno un controllo su un ingresso analogico e modificano un parametro (il volume).
Basta che tu sostituisca quello alla lettura dei pulsanti digitali.
Title: Re: uscita immediata da un loop o un ciclo
Post by: Maurotec on Mar 22, 2013, 06:45 pm
Come vedi leo ti ha dato il software completo a cui apportare solo qualche modifica, comunque ora che ho un po di tempo, spiego almeno la cosa imprensibile di prima.

Quando vogliamo processare un array siamo abituati ad usare un cicli while o for, ma è possibile anche creare un iteratore, una cosa simile a questo pseudo code:

foreach (note, notes) {
   processa note;
   grab key
   switch (key)
      case()
      .....
}

Tradotto, cicla per ogni "note" in "notes".

Se processa note è una funzione la possiamo dare in pasto a leOS, o qualcosa di simile magari creato apposta, in questo caso processa note, ritorna subito, perchè quello che fa è registrarsi nello scheduler, che suona note ogni millesimo di secondo, e abbiamo il tanto cercato multitasking.

Più semplicemente, invece per processare una array si può scrivere una funzione simile a questa:
Code: [Select]

int array[100];

void processData() // lavora con variabili globali
{
   static byte idx = 0;   // questa inizializzazione viene fatta a tempo di compilazione e quindi solo una volta
                                    // idx conserva il valore anche al termine della funzione.

   if (array[idx] == -1)   // se array[idx] contiene il valore sentinella -1 sono arrivato in coda all'array
       idx = 0;   // azzero il contatore statico così' alla prossima chiamata ricomincia tutto
   else {
       Serial.write(array[idx]);
        idx++;
    }
}


Ora se nel loop chiamo la funzione processaData(), processero tutti i dati nell'array uno per volta e ritorno al loop, per fare altro.
Quindi sto processando un array di 100 elementi ma tra un elemento e l'atro controllo la tastiera o altro, se il processamento di un solo
elemento prende un tempo troppo alto bisogna se possibile ridurre questo tempo ad una unità processabile a richiesta.

Ora è più comprensibile, no.

Ciao.

Su segnalazione di Janos, aggiunto l'incremento di idx.
Title: Re: uscita immediata da un loop o un ciclo
Post by: Janos on Mar 22, 2013, 08:33 pm
Decisamente, non male come idea... Solo che ti sei dimenticato di incrementare idx...  ;)
Title: Re: uscita immediata da un loop o un ciclo
Post by: leo72 on Mar 22, 2013, 11:21 pm
Per il natale 2011 avevo fatto delle luci per il presepe con dei led RGB che simulavano alba-giorno-tramonto-notte oppure potevano fare altri tipi di fading e, premendo un pulsantino, si poteva far riprodurre una musichetta natalizia (Jingle Bells) mentre lo sketch continuava a fare il fading dei led. Non usavo scheduler (all'epoca non l'avevo ancora realizzato) ed alla fine era venuta una cosa un po' lunghetta.

Mi ricordo però che avevo adottato un semplice metodo. Avevo messo 2 array, uno con le note da suonare, ed uno con la durata delle stesse. Ogni ciclo, controllavo se la nota era finita e quindi se dovevo suonare la successiva, fino alla fine della melodia. Si trattava insomma di un po' di if e di while annidati.