[RISOLTO] Riproduzione di note musicali da un array

Salve,
sto cercando di riprodurre un paio di canzoni utilizzando il piezo di Arduino, utilizzando degli array che contengono le note da riprodurre, tuttavia incontro questo errore:"16:219: error: invalid conversion from 'const char*' to 'int' [-fpermissive]" e non capisco che significhi e come correggerlo, anche perché la struttura del codice l'ho ripresa dal libro "Arduino progetti e soluzioni", quindi dovrebbe essere giusto, no?
Comunque, gli array sono questi:

const int piezo = 13;
int noteNomi[]={'A', 'a', 'B', 'C', 'D', 'E', 'F', 'G', 'b', 'e', 'f'};
unsigned int frequenze[]={262, 277, 294, 330, 349, 370, 392, 440, 494, 311, 415, 466};
const word noteConto = sizeof(noteNomi);
int wonderw[]={"GFEFEFEF FEFEFEFGE GFEFFFF FEFFEFGE GBGBBCBGF EFEFGE CCdE  FEFEFEFGE GFEFEFEF FEFEFEFGE GBGBBCBGE EFEFGE CCdE  FGAFFGAFGAF GAFFGAFGAF GAFFGAF FCBCA AABCBAF  aaF EFEFEFFaF aBCF aaBaa  CCA FAFAFAACA CD  "};
const word wonderwL = sizeof(wonderw);
int allofme[]={"fAAAAAAe AAAAfAAfeF AAaAeaAe eFAFD AAAAfAAfee AAAbaAAfeF AAaAeeaaAe efAfa eFbaAf eEDbD DDbaAAfef AbAD AfeA AAfffefe AAfffefe AAbAF AeEDbA AAfffefe AAfffefe AAabeEDbaA beAfAAabeEFbaAbeff fAAAAfAfee AAAAbaAAfef AAAaAea AeffAfAD bAfebAA ebAAffAfAD AAAaA AeaAefAfaa DbaeEDbaAf DbaeEDbaAf DbaeEDb AAabeEeDbaA beAfAAabeEeDbaAAf  "};
const word allofmeL = sizeof(allofme);

Questi vengono riprodotti in cicli di questo tipo:

for(int i=0; i<allofmeL; i++){
      int durata=333;
      playNote(allofme[i], durata);
      delay(2);
      }//esegue l'array con All of me

La riproduzione avviene con questa funzione:

void playNote(int note, int durata){
   for(int i=0; i<noteConto; i++){
     if(noteNomi[i]==note){
       tone(piezo, frequenze[i], durata);
       }
   }
   delay(durata);
 }

Grazie in anticipo a chiunque possa darmi una mano.

una frase (stringa delimitata da ") è un insieme di caratteri delimitato da '
prova quindi usando char e NON int

char noteNomi []={'A', 'a', 'B', 'C', 'D', 'E', 'F', 'G', 'b', 'e', 'f'};
char wonderw[] ={"GFEFEFEF FEFEFEFGE GFEFFFF FEFFEFGE GBGBBCBGF EFEFGE CCdE  FEFEFEFGE GFEFEFEF FEFEFEFGE GBGBBCBGE EFEFGE CCdE  FGAFFGAFGAF GAFFGAFGAF GAFFGAF FCBCA AABCBAF  aaF EFEFEFFaF aBCF aaBaa  CCA FAFAFAACA CD  "};
// meglio ancora senza graffe
char wonderw[] ="GFEFEFEF FEFEFEFGE GFEFFFF FEFFEFGE GBGBBCBGF EFEFGE CCdE  FEFEFEFGE GFEFEFEF FEFEFEFGE GBGBBCBGE EFEFGE CCdE  FGAFFGAFGAF GAFFGAFGAF GAFFGAF FCBCA AABCBAF  aaF EFEFEFFaF aBCF aaBaa  CCA FAFAFAACA CD  ";

Come scritto chiaramente sul libro, pagina 331/332 (io ho versione inglese)
e l'uscita è su pin 9, visto che il 13 ha già anche il led, che potrebbe interferire.

Ma li hai ricopiati a mano ? Sai che il codice lo puoi scaricare dal sito del libro ?

nid69ita:
una frase (stringa delimitata da ") è un insieme di caratteri delimitato da '
prova quindi usando char e NON int

char noteNomi []={'A', 'a', 'B', 'C', 'D', 'E', 'F', 'G', 'b', 'e', 'f'};

char wonderw[] ={"GFEFEFEF FEFEFEFGE GFEFFFF FEFFEFGE GBGBBCBGF EFEFGE CCdE  FEFEFEFGE GFEFEFEF FEFEFEFGE GBGBBCBGE EFEFGE CCdE  FGAFFGAFGAF GAFFGAFGAF GAFFGAF FCBCA AABCBAF  aaF EFEFEFFaF aBCF aaBaa  CCA FAFAFAACA CD  "};




Come scritto chiaramente sul libro, pagina 331/332 (io ho versione inglese)
e l'uscita è su pin 9, visto che il 13 ha già anche il led, che potrebbe interferire.

Ma li hai ricopiati a mano ? Sai che il codice lo puoi scaricare dal sito del libro ?

Ci avevo pensato, ma la variabile char non ha abbastanza spazio; come posso fare? Se avessi il pin 9 occupato, posso usare un pin senza PWM?
Sì sì, so che posso scaricare il codice, ma preferisco riscriverlo a mano, che così me lo studio ahaha :smiley:

David_Inginiar:
Ci avevo pensato, ma la variabile char non ha abbastanza spazio; come posso fare?

Stai confondendo la dimensione singola cella con dimensione dell'intero array.
Questa wonderwL si l'hai dovuta aumentare se le singole lettere superano i 255 perchè nell'esempio del libro hai frasi piccole e bastava const byte (0-255)
const word wonderwL = sizeof(wonderw);
Per un vettore la prima parola indica il tipo di singolo elemento, se la frase è 10 char o 1000 char sempre ogni cella 1 char è !!
Quello che cambia è l'indice tra quadre. char vet[10] oppure char vet[1000]

P.S. ma le note in wonderwL alla fine sono 201 mica superi i 255 !! Solo allofmeL ha 323 note
P.S.2 : se usi arduino uno, hai presente che gli array/vettori stanno in SRAM e sono solo 2K quindi 2048 byte/char ??

Per il pin, si, basta che non usi pin 0 o 1 (Sono TX e RX della Usb).
Magari nessun problema con il 13 ma ha collegato anche il led della board e "potrebbe" dare fastidio.

Io farei così:

char noteNomi[]={'A', 'a', 'B', 'C', 'D', 'E', 'F', 'G', 'b', 'e', 'f'};
char wonderw[]="GFEFEFEF FEFEFEFGE GFEFFFF FEFFEFGE GBGBBCBGF EFEFGE CCdE  FEFEFEFGE GFEFEFEF FEFEFEFGE GBGBBCBGE EFEFGE CCdE  FGAFFGAFGAF GAFFGAFGAF GAFFGAF FCBCA AABCBAF  aaF EFEFEFFaF aBCF aaBaa  CCA FAFAFAACA CD  ";

Insomma: intanto tutto char, e poi nella definizione della "canzone" toglierei le graffe, una semplice stringa è più che sufficiente.

Altra cosa, la sizeof() ti da quanto occupa una variabile/array in memoria, NON la dimensione dell'array/vettore.
Sembra la stessa cosa ma NON lo è.

se il vettore è di char ogni cella contiene un byte. Quindi la sizeof() alla fine è la dimensione del vettore.
char vet[]="0123456789"; sizeof(vet) = 10
ma se ogni cella del vettore è più di un byte, esempio int che occupa 2 byte, la sizeof() ti da la dimensione (quante celle) x 2 !!
int vet[10]; sizeof(vet) = 20 !!!

Quindi la dimensione (quante celle) ci sono in un vettore è meglio calcolarlo così: sizeof(vet)/sizeof(vet[0])
ovvero quanto occupa tutto il vettore diviso la dimensione della prima cella. Se byte fa diviso 1 se int diviso 2

SukkoPera:
Io farei così:

char noteNomi[]={'A', 'a', 'B', 'C', 'D', 'E', 'F', 'G', 'b', 'e', 'f'};

char wonderw[]="GFEFEFEF FEFEFEFGE GFEFFFF FEFFEFGE GBGBBCBGF EFEFGE CCdE  FEFEFEFGE GFEFEFEF FEFEFEFGE GBGBBCBGE EFEFGE CCdE  FGAFFGAFGAF GAFFGAFGAF GAFFGAF FCBCA AABCBAF  aaF EFEFEFFaF aBCF aaBaa  CCA FAFAFAACA CD  ";




Insomma: intanto tutto char, e poi nella definizione della "canzone" toglierei le graffe, una semplice stringa è più che sufficiente.

Ma io infatti all'inizio avevo scritto proprio così, solo che mi da errore sul fatto che un array dovrebbe essere racchiuso in due graffe e non mi permetteva di andare avanti :confused: Quindi ho cambiato e alla fine l'ho scritto così:

 int wonderw[]={'G','F','E',...,'C','D'}

E in questo modo mi dice che il codice è corretto e le riproduce anche le note, sebbene verso la fine inizi a fare strani suoni.

nid69ita:
Stai confondendo la dimensione singola cella con dimensione dell'intero array.
Questa wonderwL si l'hai dovuta aumentare se le singole lettere superano i 255 perchè nell'esempio del libro hai frasi piccole e bastava const byte (0-255)
const word wonderwL = sizeof(wonderw);
Per un vettore la prima parola indica il tipo di singolo elemento, se la frase è 10 char o 1000 char sempre ogni cella 1 char è !!
Quello che cambia è l'indice tra quadre. char vet[10] oppure char vet[1000]

P.S. ma le note in wonderwL alla fine sono 201 mica superi i 255 !! Solo allofmeL ha 323 note
P.S.2 : se usi arduino uno, hai presente che gli array/vettori stanno in SRAM e sono solo 2K quindi 2048 byte/char ??

Ok, ho capito che mi stai dicendo, ma è lo stesso IDE che mi dice che char non può contenere tutti quei valori, per questo sono confuso :confused: Per quanto riguarda la dimensione dell'array, ho capito e correggerò!

Grazie per l'aiuto e la pazienza :smiley:

Ho risolto il problema!
Ho cambiato la stringa di wonderw[], togliendo le graffe ed usando le virgolette e me l'ha accettato eheheh, non so cosa stavo sbagliando prima ahaha
Inoltre, ho aggiunto il comando per calcolare la dimensione come suggerito da nid69ita.

Grazie per le spiegazioni!

Giusto per la cronaca, ora che quella è una stringa, il numero di caratteri che contiene lo puoi ottenere banalmente con strlen(), oppure puoi andare avanti finché non trovi '\0', ovvero il terminatore di stringa.