Usare il #define con gli array

... si può tranquillamente usare un Arduino AVR ... come per gli STM cambia solo l'ambiente di sviluppo, ovviamente NON si usa l'IDE ma altri embienti (es. MPLAB X di Microchip) e veri debugger che si collegano sul connettore ICSP :wink:

Se poi uno usa schede che montano le MCU ARM SAM credo che il debug si possa fare anche dall'IDE Arduino 2.0 (... ancora in beta) che lo prevede solo per alcune famiglie di schede :slight_smile:

Guglielmo

Si suggerivo STM32 perché è piuttosto semplice configurare un ambiente di debug (con platformio).

Per quanto riguarda AVR, ho anche preso la scheda di sviluppo Microchip, ma è ancora nel cassetto. Devo decidermi a spenderci un po' di tempo.

... si può fare anche con i classici Arduino, tanto usi il connettore ICSP per collegare il programmatore/debugge :wink:

Guglielmo

Eh... ma infatti è MPLAB X lo "scoglio" più grosso :sweat_smile:

Ehi ehi ehi, ma perché mi devo complicate la vita?
Se proprio non devo usare l'idea di Arduino, uso ardublock o minibloq così sto più nel mio ambiente di programmazione grafica :rofl::rofl:

Tornando a noi quindi devo usare la definizione con l'asterisco che inizializza,se ho capito bene, il puntatore ad un Array? O posso usare direttamente un Array? :grin:
Alla fine io da quell'array dovrò prendere i singoli valori (che saranno poi modificati, quelli si con dei define) e darli in pasto a tre funzioni tone()

Delle due funzionanti che hai scritto (la terza, come ti è stato detto, ha una sintassi errata), devi usare la prima ...

const char* CH_G4[]={"G4","B4","D5"};

La seconda fa uso di una "classe", la classe String ...

String CH_G4[]={"G4","B4","D5"};

che, su piccole MCU come Arduino è ... il male assoluto :grin: :grin: :grin:

Guglielmo

Ottimo, quindi, considerando di avere questi (valori a caso) in un file .h:

#define G4 64
#define B4 128
#define D5 192

per richiamare le frequenze poi nelle funzione tone posso mettere:

tone(mioPin1,CH_G4[0]);
tone(mioPin2,CH_G4[1]);
tone(mioPin3,CH_G4[2]);

??

No, aspetta, ora non seguo più ...

Tu qui:

const char* CH_G4[]={"G4","B4","D5"};

... stai dichiarando un array di stringhe classiche del 'C' per cui:

CH_G4[0] assumerà il valore "G4", CH_G4[1] il valore "B4" ed infine CH_G4[2] il valore "D5", ma, come vedi, sono valori racchiusi tra doppi apici, quindi NON numeri ma strighe di caratteri !!!

Tu invece cosa vorresti? Che alla fine CH_G4[0] contenesse il valore numerico 64, CH_G4[1] il valore 128 e CH_G4[2] il valore 192? ... perché, così come hai scritto, NON ottieni questo eh ... :roll_eyes:

Guglielmo

Esatto.. Vorrei quello :sweat:
Però mi sembra di capire che la stringa non si sostituisce al nome della variabile
Ma magari posso ottenerlo piu semplicemente con un Array di questo tipo allora?

int CH_G4 {G4,B4,D5}

I vari G4,B4 e D5 verrebbero sostituiti dal define?
O darebbe errore di compilazione?

Avevo immaginato, infatti io non capisco perché ti stai incaponendo con 'sti array di stringe quando per riprodurre una nota hai bisogno di un numero intero.

Alla fine, per quanto riguarda il calcolo del picth di una nota si tratta di matematica spicciola.

Prendiamo ad esempio l'ottava 4 ovvero quella che contiene il La a 440Hz, potresti ottenere tutte le altre note ad esempio con un qualcosa tipo questo:

Potresti anche fare una cosa molto più semplice: usare solo dei valori numerici per esprimere le note musicali, ad esempio:

54=Sol4
74=Si4
25=Re5

I diesis puoi indicarli con un 1 iniziale, ad esempio:

 24=Re4
144=Fa#4
 64=La4

Ci vuole poco, poi, a risalire alla nota:
dividi per 100 e determini se è diesis;
il resto diviso 10 ti da la nota;
il resto di quest'ultima divisione è l'ottava.
:slight_smile:

Certo, però, che i #define che sostituiscono direttamente la frequenza al nome sono una soluzione semplicissima e non rubano spazio in memoria!

Per me è palese il perchè. :slight_smile:
E' una questione di leggibilità del codice.
Se io devo comporre degli accordi e ci metto dentro dei numeri, non sapro' mai se quel numero che ho messo dentro è la nota corretta che deve suonare in quell'accordo.
Io ho tanti define come nell'esempio che hai postato per avere le frequenze di ogni nota (in int pero' , perchè avevo letto che il tone accetta solo interi)
Poi ho 3 buzzer.
Ognuno di essi riproduce una nota diversa che forma un accordo.
Se io ho un accordo di DO, dovro' suonare DO, MI e SOL sui 3 buzzer.
Quindi voglio che ci sia un array col nome DO che contenga le 3 note che compongono l'accordo. Certo che potrei mettere direttamente i numeri, ma io voglio essere sicuro di aver inserito le note giuste da suonare.
Per questo pensavo di fare:
int CH_DO4 = {DO4,MI4,SOL4} e aspettarmi che i 3 define corrispondenti mi sostituiscano i nomi delle note con i valori numerici.
poi nella parte di riproduzione metterei i tre tone, uno per ogni frequenza.

Ma la leggibilità la ottieni già con l'uso del #define

#define C4  262
#define CS4 277
#define D4  294
#define DS4 311
#define E4  330
#define F4  349
#define FS4 370
#define G4  392
#define GS4 415
#define A4  440
#define AS4 466
#define B4  494

int C4mag[] = {C4, E4, G4 };  // Non servono le stringhe "C4", "E4" e "G4
int C4min[] = {C4, DS4, G4 };  

Quello che vorrei fare è una cosa cosi':

In questo esempio manca il sensore che permetterà di scegliere quale accordo suonare quindi metto sempre il G4.
Non so se è un problema del simulatore che non puo' suonare piu' note insieme o se c'e' un errore nel mio software...

Questa è l'idea di cosa vorrei fare, ma mi da errore nell'assegnazione dell'array accordo

Qui ti da errore: accordo = CH_G4;

perchè in C/C++ NON puoi copiare un intero array con una assegnazione.
Devi usare un ciclo for
for(int i=0;i<=2;i++) accordo[i] = CH_G4[i];
oppure una funzione tipo memcpy()
oppure a manina
accordo[0] = CH_G4[0]; accordo[1] = CH_G4[1]; accordo[2] = CH_G4[2];

1 Like

Tutto chiaro.... Mannaggia al C ... :grin:

emmm ... vorrei solo ricordarti che LabView™, a tua insaputa e dietro le quinte, genera codice 'C' e compila detto codice :smiling_imp:

Se lo fa, e non so se lo fa anche nelle ultime versioni, lo fa intelligentemente senza chiedermi niente :slight_smile:
Se gli chiedo di copiare un array, mi copia un array e muuuuto :slight_smile: