Per creare un Theremin semplice e intuitivo utlizzando gli strumenti di arduino è importante possedere alcune conoscenze di base del linguaggio C, ma non c'è da spaventarsi. Quello che ci serve non è difficile: ecco qui presentato, infatti, il codice che ci permetterà di suonare canzoni “economicamente”, con l'utilizzo del solito arduino.LOL

/*
	http://www.dreamsincode.com/blog/2010/10/19/arduino-basicspiezo-sounder/	
*/ 
 
#define CICALINO 11 
#define DURATA 5000 //durata della li in millesecondi
#define PAUSA	100
#define TRIGGER 2 
#define ECHO 3
 
//char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; // nomi inglesi delle note
/*
		http://www.autistici.org/2000-maniax/texts/Le%20frequenze%20delle%20note%20musicali%20%E2%80%94%20Ulisse.htm
 		le frequenze riportate sono moltiplicate per 10, per evitare l'uso di numeri in lizione floating point
*/
String note[] = { "do", "do#" , "re" , "re#" , "mi", "fa", "fa#" , "sol", "sol#" , "la", "la#" , "si", "DO" };
unsigned int freq[] = {2616,2772,2937,3111,3296,3492,3700,3920,4153,4400,4662,4939,5233};
 
int suona(int i, unsigned long durata ){                          //funzione che permette al “piezo” (amplificatore per arduino) di produrre il suono richiesto
Serial.print("suono la nota: ");
		Serial.println(note[i]);
		unsigned long int li=5000000/freq[i];
		//unsigned int rip=freq[i]*durata/10000;
 
 
			digitalWrite(CICALINO,HIGH);
			delayMicroseconds(li);
			digitalWrite(CICALINO,LOW);
			delayMicroseconds(li);
 
		}
 
void setup() {
	pinMode(CICALINO,OUTPUT);
	pinMode(TRIGGER,OUTPUT);
	pinMode(ECHO,INPUT);
	Serial.begin(115200);
	Serial.begin(115200);
}
 
void loop() {
 
  unsigned long ritardo, distanza;
	digitalWrite(TRIGGER, LOW);									//Il processo qui illustrato permette di calcolare la distanza della nostra
	delay(1);											//mano in ogni istante
	digitalWrite(TRIGGER, HIGH);									
	delayMicroseconds(1);
	digitalWrite(TRIGGER, LOW);
	ritardo = pulseIn(ECHO, HIGH);
	Serial.print("ritardo: ");
	Serial.println(ritardo);
	//distanza = (ritardo/2)/29.1; sconsigliabile: usa un'operazione in floating point.
	//distanza = (ritardo/2)*10/291;
	distanza = (ritardo>>1)*10/340;
	Serial.print("distanza: ");
	Serial.println(distanza);
 
 
 
	//unsigned long time;
	unsigned long durata=DURATA;
	//unsigned long int li; // larghezza impulso
	//unsigned int rip; // numero di ripetizioni
//	unsigned long int i,j;
							//ogni 5 cm si produce una nota diversa
	if (distanza>0 && distanza<=5) {            	//produce il “DO”
	  suona(12, durata);
	}
 
	if (distanza>5 && distanza<=10) {            	//produce il “si”
	  suona(11, durata);
	}
 
	if (distanza>10 && distanza<=15) {		//produce il “la”
	 suona(9, durata);
	}
 
	if (distanza>15 && distanza<=20) {		//produce il “sol”
	  suona(7, durata);
	}
 
	if (distanza>20 && distanza<=25) {		//produce il “fa”
	  suona(5, durata);
	}
 
	if (distanza>25 && distanza<=30) {		//produce il “mi”
	  suona(4, durata);
	}
 
	if (distanza>30 && distanza<=35) {		//produce il “re”
	  suona(2, durata);
	}
 
 
	if (distanza>35 && distanza<=40){		//produce il “do”
	  suona(0, durata);
	}
 
 
}