Site icon Meccanismo Complesso

Generare toni musicali a 440Hz e 432Hz con Arduino

Si fa un grande parlare di scale musicali, di musica a 440Hz e a 432Hz senza a volta comprenderne bene il senso. In questo articolo vedremo come generare le scale musicali, la teoria che vi sta dietro, e come creare della musica a 440Hz o a 432Hz. Il tutto lo faremo utilizzando una scheda Arduino, e un piccolo speaker (o un buzzer).

La scala musicale e le frequenze corrispondenti

La musica occidentale si basa su particolari scale musicali, chiamate ottave, composte da 12 note, o per essere precisi, da 7 note intervallate (DO, RE, MI, FA, SOL, LA, SI) da 5 semitoni di passaggio (DO# o REb, RE# o MIb, FA# o SOLb, SOL# o LAb, LA# o SIb).

O nel sistema anglosassone le note vengono invece indicate con le prime 7 lettere dell’alfabeto, partendo però dalla nota LA (A). Si avranno quindi le note A (LA), B (SI) ,C (DO), D (RE) ,E (MI) , F (FA) e G (SOL).

E’ interessante che la notazione anglosassone parta con la nota LA. Non a caso, per convenzione, tutti gli strumenti musicali vengono accordati tenendo come frequenza di riferimento la nota LA presente sulla quarta ottava (LA4 o A4) di tutta la scala musicale. Oggi tutti gli strumenti musicali vengono accordati facendo in modo che alla nota LA4 corrisponda la frequenza 440Hz.

L’intera scala musicale è stata suddivisa in 8 scale di 12 note chiamate appunto ottave. A queste corrispondono precisi intervalli di frequenze. Per esempio l’ottava che va da LA4 a LA5 copre un intervallo di ben 440Hz, che non a caso è proprio anche la frequenza di riferimento di LA4. Quindi avremo LA4 a 440 Hz e LA5 a 880 Hz.

Ogni LA nell’ottava inferiore corrisponderà a metà frequenza del LA nella scala superiore, e così via per tutta la scala musicale. Quindi avremo gli intervalli di frequenze (ottave) che raddoppieranno al crescere delle ottave.

Musica a 440Hz o 432Hz?

Ma non è sempre stato così. Infatti fino a pochi decenni fa, il valore di riferimento era stato quello di 432Hz (in realtà non era l’unico). Quindi una musica a 432 Hz, non è altro che una melodia suonata con strumenti accordati su un LA4 a tale frequenza. Quindi tutti i valori delle frequenze cambieranno, ma le regole sono sempre le stesse.

Riguardo alle motivazioni di questo cambiamento della frequenza di riferimento si fa un gran parlare sul web. Le spiegazioni disponibili non sono ben chiare, alcune delle quali risultano completamente diverse o quasi discordanti. Per poter avere una certezza su tale argomento sarebbe necessario fare una ricerca su documentazione scritta originale ed evitare assolutamente la confusione generata su web.

OttavaScala a 440 HzScala a 432 Hz
A027.5 Hz27 Hz
A155 Hz54 Hz
A2108 Hz110 Hz
A3220 Hz216 Hz
A4440 Hz432 Hz
A5880 Hz864 Hz
A61760 Hz1728 Hz
A73520 Hz5456 Hz

Indipendentemente dalle motivazioni, per quanto fantasiose o corrette che siano, in questo articolo forniremo tutti gli strumenti necessari per costruire una base musicale su queste due scale (Scala a 440Hz e 432Hz), o anche su altre scale alternative, lasciando a voi il compito di sperimentare le differenze riguardo le emozioni o sensazioni suscitate.

Calcolo delle frequenze delle note

Adesso che abbiamo compreso come sono basate le scale musicali a 440Hz e 432 Hz facciamo un passo ulteriore. Una volta stabilito con quale frequenza lavorare su LA4, abbiamo visto come è facile calcolare le varie frequenze corrispondenti a tutte le altre note LA presenti sulla scala musicale. Ma all’interno di ogni ottava ci sono ben 12 note da calcolare. Come si fa?

Per il calcolo delle frequenze corrispondenti alle 12 note presenti all’interno di un’ottava esiste una particolare procedura matematica, che si basa sulla moltiplicazione della frequenza base (cioè quella del LA) per un determinato valore βn compreso tra 1 e 2, e dove n è il numero della nota corrispondente (da 0 a 12).

Quindi ci calcoliamo i 12 valori di β elevati alle diverse potenze con l’uso di una calcolatrice scientifica. Otterremo i seguenti valori.

β01.0000
β11.0595
β21.1225
β31.1893
β41.2601
β51.3351
β61.4145
β71.4986
β81.5878
β91.6823
β101.7824
β111.8884
β122.0000

Adesso per avere le frequenze delle note comprese tra LA4 e LA5, è sufficiente moltiplicare questi valori βn per la frequenza di riferimento.

LA4β0 x 440 Hz1.0000 x 440 Hz440 Hz
LA#4β1 x 440 Hz1.0595 x 440 Hz466 Hz
SI4β2 x 440 Hz1.1225 x 440 Hz494 Hz
DO5β3 x 440 Hz1.1893 x 440 Hz523 Hz
DO#5β4 x 440 Hz1.2601 x 440 Hz554 Hz
REβ5 x 440 Hz1.3351 x 440 Hz587 Hz
RE#5β6 x 440 Hz1.4145 x 440 Hz622 Hz
MI5β7 x 440 Hz1.4986 x 440 Hz659 Hz
FA5β8 x 440 Hz1.5878 x 440 Hz698 Hz
FA#5β9 x 440 Hz1.6823 x 440 Hz740 Hz
SOL5β10 x 440 Hz1.7824 x 440 Hz784 Hz
SOL#5β11 x 440 Hz1.8884 x 440 Hz831 Hz
LA5β12 x 440 Hz2.0000 x 440 Hz880 Hz

La stessa cosa la possiamo valutare per la scala musica a base 432 Hz.

LA4β0 x 432 Hz1.0000 x 432 Hz432 Hz
LA#4β1 x 432 Hz1.0595 x 432 Hz458 Hz
SI4β2 x 432 Hz1.1225 x 432 Hz484 Hz
DO5β3 x 432 Hz1.1893 x 432 Hz514 Hz
DO#5β4 x 432 Hz1.2601 x 432 Hz544 Hz
REβ5 x 432 Hz1.3351 x 432 Hz577 Hz
RE#5β6 x 432 Hz1.4145 x 432 Hz611 Hz
MI5β7 x 432 Hz1.4986 x 432 Hz647 Hz
FA5β8 x 432 Hz1.5878 x 432 Hz686 Hz
FA#5β9 x 432 Hz1.6823 x 432 Hz727 Hz
SOL5β10 x 432 Hz1.7824 x 432 Hz770 Hz
SOL#5β11 x 432 Hz1.8884 x 432 Hz816 Hz
LA5β12 x 432 Hz2.0000 x 432 Hz864 Hz

Arduino e la generazione di onde sonore

Ma come fanno gli apparecchi elettronici a generare onde sonore attraverso delle casse? Apparecchi elettronici come per esempio Arduino? Bene, in realtà è molto semplice. Si collega alla nostra scheda di controllo, in questo caso Arduino, un qualsiasi dispositivo sonoro come può essere un altoparlante o un semplice buzzer. Poi attraverso dei particolari comandi lo si farà vibrare alla frequenza delle note corrispondenti.

Arduino è una scheda che permette di effettuare questa operazione in maniera davvero molto semplice. Una volta collegato il dispositivo sonoro ad una delle porte di Arduino, si comanderà a quest’ultimo di attivare e disattivare (ON e OFF) la porta in uscita alla frequenza desiderata.

Quindi dalla porta si produrrà un treno di impulsi ad onda quadra, con duty cycle del 50%.

La lunghezza in durata di tempo degli impulsi equivale alla lunghezza d’onda λ, che equivale all’inverso della frequenza 1/f. Quindi per riprodurre la nota LA4, corrispondente a 440 Hz, occorre generare un treno di impulsi con lunghezza d’onda t = 1/f = 2.2727 ms.

Il dispositivo sonoro sottoposto a questo treno di impulsi emetterà un perfetto LA anche se un po’ sporco, dato che l’onda generante è un’onda quadra e non un’onda sinusoidale.

Ma adesso passiamo alla programmazione, per generare l’onda quadra di cui abbiamo appena parlato sulle schede Arduino, si sceglie una porta su cui generarla, come per esempio il PIN 9, e lo impostiamo come OUTPUT

void setup() {
pinCode (3, OUTPUT)
}

E poi generiamo l’onda quadra, impostando il PIN 3 sullo stato HIGH e mantenendolo per 1136 microsecondi (la metà della lunghezza d’onda), utilizzando la funzione delayMicroseconds().

Poi imposto il PIN 3 sullo stato LOW e mantenendolo ancora per 1136 microsecondi. E poi ripetendo il tutto in un loop, non si fa altro che generare un treno di impulsi, cioè l’onda quadra che abbiamo descritto sopra.

void loop() {
    digitalWrite(3, HIGH)
    delayMicroseconds(1136)
    digitalWrite(3, LOW)
    delayMicroseconds(1136)
}

In questo modo otterremo la nota LA4 dal dispositivo sonoro.

Il materiale necessario

Per quanto riguarda questo articolo ho utilizzato il modello Arduino Nano della Seeeds ed il suo speaker (Grove).

Ma potete utilizzare qualsiasi modello di Arduino e collegarlo con un qualsiasi dispositivo sonoro. I principi rimarranno fondamentalmente gli stessi.

Seeeduino Nano

Seeeduino Nano è una scheda compatta completamente compatibile con Arduino Nano conservando completamente le sue stesse dimensioni e schema dei pin. Ma ci sono alcune differenze tra i due modelli.

La prima tra tutte è il prezzo, infatti Seeeduino Nano offre tutte le stesse caratteristiche di Arduino Nano, ma ad un prezzo che è all’incirca la metà. Inoltre ha alcune migliorie da non sottovalutare come per esempio la porta Mini-USB al posto della porta Type-C. Inoltre monta un connettore I2C che facilita le connessioni con molti altri componenti, e va a formare il sistema Grove dove vengono resi disponibili moltissimi sensori e attuatori che montano questo tipo di porta, facilitando le connessioni e disconnessioni senza far uso di saldature o altri formati.  

Una volta scelto il sistema Grove della Seeeduino ho preso anche il particolare shield adattatore che mi permette di effettuare le connessioni con gli altri elementi del sistema Grove in maniera semplice e veloce (funziona anche con Arduino Nano).

Ed infine ho utilizzato lo Speaker del sistema Grove

Quindi, una volta a disposizione tutti i componenti non ci resta che collegarli insieme. Operazione semplicissima da eseguire con il sistema Grove.

Adesso si connette la scheda Seeeduino al computer tramite la USB e si apre l’editor Arduino IDE per poter implementare il codice, compilarlo e poi eseguirlo.

Suonare una melodia su Arduino

Una volta effettuate tutte le connessioni necessarie, si può programmare una vera e propria melodia da eseguire su Arduino. Per questo esempio ho scelto un piccolo jingle tratto dalla famosa “Per Elisa” di Beethoven, nota a tutti, anche ai profani!!!

Per prima cosa è importante definire tutte le note musicali, specificando tutte le lunghezze d’onda divise a metà per ogni nota corrispondente alla quinta e quarta ottava della scala musicale (quelle generalmente utilizzate per tutte le melodie).

#define C4 1915
#define CS4 1805
#define D4 1700
#define DS4 1607
#define E4 1519
#define F4 1432
#define FS4 1351
#define G4 1275
#define GS4 1204
#define A4 1136
#define AS4 1073
#define B4 1012
#define C5 955
#define CS5 901
#define D5 851
#define DS5 803
#define E5 758
#define F5 715
#define FS5 675
#define G5 637
#define GS5 601
#define A5 568
#define AS5 536
#define B5 506
#define 12
#define 13
#define 14

L’elenco delle note musicali potrete utilizzarlo anche in un altro file che poi importerete ogni volta che ne avrete bisogno. Poi si specifica il PIN a cui collegheremo il dispositivo sonoro.

#define SPEAKER 3

Poi è il momento di specificare la sequenza delle note che compongono le prime note di “Per Elisa” e la durata di ciascuna nota, attraverso due diversi array.

int BassTab[]={E5,DS5,E5,DS5,E5,B4,D5,C5,A4,C4,E4,A4,B4,E4,A4,B4,C5,E5,DS5,E5,DS5,E5,B4,D5,C5,A4,C4,E4,A4,B4,E4,C5,B4,A4};

int timeTab[]={1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,3 ,1 ,1 ,1 ,2 ,1 ,1 ,1 ,2 , 1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,3 ,1 ,1 ,1 ,2 ,1 ,1 ,1 ,4};

Ed infine si passa allo sketch vero e proprio, in cui si implementano i comandi necessari per eseguire ciascuna nota rappresentata nell’array attraverso un’onda quadra con la lunghezza d’onda corrispondente a quella nota. La singola nota verrà espressa attraverso l’implementazione della funzione sound(), mentre l’esecuzione dell’intera melodia viene fatta dal ciclo for presente nel loop().

void setup()
{
  pinInit();
}
void loop()
{
  for(int note_index=0;note_index<34;note_index++)
  {
    sound(note_index);
    delay(50*timeTab[note_index]);
  }
}
void pinInit()
{
    pinMode(SPEAKER,OUTPUT);
    digitalWrite(SPEAKER,LOW);
}
void sound(uint8_t note_index)
{
 for(int i=0;i<100;i++){
     digitalWrite(SPEAKER,HIGH);
     delayMicroseconds(BassTab[note_index]);
     digitalWrite(SPEAKER,LOW);
     delayMicroseconds(BassTab[note_index]);
  }
}

Eseguendo l’intero codice avrete l’esecuzione della melodia Per Elisa in modo continuo.

Se volete eseguire la stessa melodia su una scala musicale basata sui 432 Hz, non dovete far altro che calcolarvi le lunghezze d’onda delle note della quarta e quinta ottava e poi sostituirle allo sketch dell’articolo e provare di persona se ci sono delle differenze.

Eccovi le due ottave in 432 Hz da sostituire al codice precedente.

define C4 1946
define CS4 1838
define D4 1736
define DS4 1639
define E4 1543
define F4 1458
define FS4 1377
define G4 1299
define GS4 1225
define A4 1157
define AS4 1092
define B4 1033
define C5 973
define CS5 919
define D5 867
define DS5 818
define E5 773
define F5 729
define FS5 688
define G5 649
define GS5 613
define A5 579
define AS5 546
define B5 515
Exit mobile version