Impariamo ad utilizzare le funzioni audio di Arduino per trasformarlo in uno strumento musicale.
Dietro ogni mente brillante si nasconde un artista. Dietro ogni brano musicale si riconosce la matematica.
Archimede lo aveva percepito, mentre Johann Sebastian Bach aveva messo in pratica il concetto. Dietro ad un passaggio musicale eufonico si nasconde una espressione matematica elegante.
In questo modo, chiunque sia attratto da elettronica e musica non può fare a meno di apprezzare l’edificio matematico ad essi sotteso. Il problema dell’elettronica (e in genere dell’Ingegneria tout-court) è una certa qual mancanza di flessibilità nello sviluppo dei progetti, che apparentemente confligge con l’arte ad ampio respiro. E tuttavia…
Theremin… Chi era costui?
Lev Sergeyevich Termen (15 o 28 August 1896 – 3 November 1993), o Léon Theremin negli Stati Uniti, fu un inventore russo divenuto famoso per l’invenzione del theremin, uno dei primi strumenti musicali elettronici ed il primo sviluppato per la produzione di massa. Tra le altre invenzioni, sviluppò anche le prime tecniche di interlacciamento, migliorando la qualita di un segnale video.
Il theremin o eterofono, è uno strumento musicale elettronico controllato a distanza, senza il bisogno di contattto fisico dell’esecutore, La sua sezione di controllo consiste solitamente in due antenne metalliche che riconoscono la posizione relativa delle mani del thereminista. Una mano controlla gli oscillatori della frequenza, mentre l’altra si occupa dell’ampiezza (volume di esecuzione). I segnali elettrici del theremin vengono poi amplificati e inviati agli altoparlanti.
Il concetto è lineare, e il risultato finale sicuramente d’effetto.
Arduino e il suono
Chi ci segue da qualche tempo sul blog o sul nostro canale YouTube, sa benissimo che Arduino è perfettamente in grado di gestire i suoni attraverso la opportuna programmazione di un buzzer passivo. In tal modo è possibile trascrivere interi spartiti (monofonici) nel programma e farli eseguire al nostro eroe.
Si tratta però di un utilizzo come sequencer elettronico, che riproduce pedissequamente quanto l’artista aveva previsto di suonare, ma senza alcuna emotività doguta a tensioni e pause dinamiche. Tutto questo non aiuta di certo il tentativo di rendere “artistica” l’esecuzione, e il n-ostro ingegnere si trova nuovamente con le mani legate. Ma solo temporaneamente,
Arduino dispone infatti di una serie di pin analogici che consentono di variare i parametri di elaborazione in modo dinamico: basterà associare il valore del pin A0 in ingresso mappandolo sulla frequenza desiderata, per ottenere l’ottava o le ottave necessarie per suonare.
Progetti in musica
Occorre quindi trovare un modo diretto e semplice per interagire con il controllo della frequenza (pre il volume occorre una sezione di amplificazione audio che Arduino non può sfruttare in questi progetti). Presenteremo di seguito tre semplici progetti per risolvere il problema e rendere più dinamico e personalizzabile l’utilizzo di Arduino come sintetizzatore musicale.
Come creare una tastiera musicale
In questo esempio estendiamo il concetto di pilotaggio audio attraverso i pin A0, A1 e A2, ciascuno relativo ad una ben definita frequenza audio.
Appare evidente la possibilità di estendere la tastiera utilizzando gli ulteriori ingressi analogici presenti sulla scheda. Arduino 2560MEGA offre 16 input analogici, consentendo di creare una ottava e mezza completa su 16 semitoni. Il suono è rappresentato da un’onda quadra, ma è ora possibile eseguire melodie complete, magari con un secondo arduino da utilizzare come sequencer in background.
Nota: se si utilizza un buzzer passivo, il resistore da 100 Ω non è necessario.
Elenco componenti:
- 1 x Arduino Uno R3
- 1 x Resistore100 Ω
- 1 x Buzzer piezo o altoparlante 8 Ω
- 3 x Pulsante
- 3 x Resistore 10 kΩ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* Tastiera Suona una nota definita in base al circuito di input: * 3 pulsanti collegati a +5V e i pin analogici in A0 - A3 * 3 resistori 10K tra i pin analogici in A0 - A3 e ground * buzzer passivo sul digital pin 8 */ int pos = 0; void setup() { pinMode(A0, INPUT); pinMode(8, OUTPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); } void loop() { // pressione del pulsante su A0 if (digitalRead(A0) == HIGH) { tone(8, 440, 100); // suona un LA (A4 = 440 Hz) } // pressione del pulsante su A1 if (digitalRead(A1) == HIGH) { tone(8, 494, 100); // Suona un SI (B4 = 494 Hz) } // pressione del pulsante su A2 if (digitalRead(A2) == HIGH) { tone(8, 523, 100); // Suona un DO (C5 = 523 Hz) } delay(10); // Delay a little bit to improve simulation performance } |
Come creare un minimoog
Questo progetto sostituisce alla tastiera del precedente, definita da una serie di resistenze fisse, ed una frequenza selezionata dalla pressione di un tasto, con un potenziometro, ovvero un resistore variabile, collegato al piedino A0 (input analogico) di Arduino. Con questo progetto è possibile eseguire uno sweep di frequenze audio senza soluzione di continuità, e giocare con i parametri descritti nei commenti per modificare l’estensione musicale dello strumento. Teoricamente si potrebbero creare toni da 32 Hz in poi, sino a 8 MHz, secondo Brett Hagman. In realtà l’utilzzo di interi con segno limita drastcamente la frequenza raggiungibile a 32 kHz a causa dell’implementazione della funzione utilizzata. Si tratta comunque di una bella estensione, che potrebbe rendere interessante l’utilizzo di un potenziometro logaritmico mutigiri per una intonazione più fine.
Elenco componenti:
- 1 x Arduino Uno R3
- 1 x Resistore100 Ω
- 1 x Buzzer piezo o altoparlante 8 Ω
- 1 x Resistore variabile o trimmer da 10 kΩ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* Pitch follower Plays a pitch that changes based on a changing analog input circuit: * 8-ohm speaker on digital pin 8 * photoresistor on analog 0 to 5V * 4.7K resistor on analog 0 to ground created 21 Jan 2010 modified 9 Apr 2012 by Tom Igoe modified 13 Apr 2020 by Luigi Morelli This example code is in the public domain. http://arduino.cc/en/Tutorial/Tone2 */ void setup() { // inizializziamo la seriale (ci tornerà utile in fase di debugging del suono): Serial.begin(9600); } void loop() { // lettura del fotoresistore: int sensorReading = analogRead(A0); // stampa opzionale del valore ottenuto, per una calibrazione migliore Serial.println(sensorReading); // mappatura del valore ottenuto sulla nota richiesta. // Le prime due cifre dipendono dalla sensibilità del potenziometro utilizzato // Le ultime due cifre determinano il range di frequenze riprodotte (max. 32Hx-8MHz): int thisPitch = map(sensorReading, 400, 1000, 400, 1000); // Il terzo valore determina la lunghezza dell'impulso // suona la nota con valori tra 1 e 500 per la calibrazione. tone(8, thisPitch, 200); //ritardo per consentire al sistema di riallinearsi dopo ogni ciclo di suono // Può assumere valori tra 1 e 50 delay(20); } |
Come creare un mini theremin
Ed eccoci finalmente al nostro mini-Theremin! Con questo circuito non avremo più bisogno di tastiere o manopole per comporre la nostra musica spaziale. Utilizzeremo invece un fotoresistore posto in serie ad un resistore classico da 4.7 kΩ. Il partitore consentirà al segnale di restare comunque all’interno dei parametri di utilizzo sicuri, offrendo una maggiore estensione allo strumento.
Sarà sufficiente coprire parte della luce che raggiunge il fotoresistore per ottenere diverse note senza soluzione di continuità.
Analizzando il listato sarà possibile evidenziare i tre parametri che ci consentiranno di modificare ulteriormente il suono del nostro theremin.
Elenco componenti:
- 1 x Arduino Uno R3
- 1 x Resistore100 Ω
- 1 x Buzzer piezo o altoparlante 8 Ω
- 1 x Resistore 4.7 kΩ
- 1 Fotoresistore
Il codice è identico a quello utilizzato nell’esempio precedente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* Pitch follower Plays a pitch that changes based on a changing analog input circuit: * 8-ohm speaker on digital pin 8 * photoresistor on analog 0 to 5V * 4.7K resistor on analog 0 to ground created 21 Jan 2010 modified 9 Apr 2012 by Tom Igoe modified 13 Apr 2020 by Luigi Morelli This example code is in the public domain. http://arduino.cc/en/Tutorial/Tone2 */ void setup() { // inizializziamo la seriale (ci tornerà utile in fase di debugging del suono): Serial.begin(9600); } void loop() { // lettura del fotoresistore: int sensorReading = analogRead(A0); // stampa opzionale del valore ottenuto, per una calibrazione migliore Serial.println(sensorReading); // mappatura del valore ottenuto sulla nota richiesta. // Le prime due cifre dipendono dalla sensibilità del partitore utilizzato // Le ultime due cifre determinano il range di frequenze riprodotte (max. 32Hx-8MHz): int thisPitch = map(sensorReading, 400, 1000, 100, 1000); // Il terzo valore [10] determina la lunghezza dell'impulso // suona la nota con valori tra 1 e 500 per la calibrazione. tone(8, thisPitch, 10); //ritardo per consentire al sistema di riallinearsi dopo ogni ciclo di suono // Può assumere valori tra 1 e 50 delay(1); } |
E anche per oggi abbiamo terminato. Siamo riusciti ad approfondire le funzioni audio di Arduino per renderlo simile ad uno strumento musicale
Nel prossimo articolo spiegheremo come applicare le nozioni apprese per costruirci un MiniMoog basato su Arduino.