diff --git a/Theremin/Theremin.ino b/Theremin/Theremin.ino index c4ee885..ea3d306 100644 --- a/Theremin/Theremin.ino +++ b/Theremin/Theremin.ino @@ -3,103 +3,106 @@ *@lang C89 Based *@contact lunarised@outlook.com */ - int mode; +int mode; void setup() { - pinMode(6, INPUT_PULLUP); - pinMode (13, OUTPUT); - pinMode(8, OUTPUT); - pinMode (7, INPUT_PULLUP); - - pinMode(5, INPUT_PULLUP); - Serial.begin (9600); //set up a serial connection with the computer - - pinMode(11, OUTPUT); //the trigger pin - pinMode(12, INPUT); //echo pin + pinMode(6, INPUT_PULLUP); //Mode Select Pin + pinMode (13, OUTPUT); //LED Indicator Pin + pinMode(8, OUTPUT); //Speaker Pin + pinMode (7, INPUT_PULLUP); //Play Pin + pinMode(5, INPUT_PULLUP); //+Octave Play Pin + Serial.begin (9600); //Set up a Serial Connection + pinMode(11, OUTPUT); //Trigger pin + pinMode(12, INPUT); //Echo pin } void loop() { - if (digitalRead(6) ==HIGH){ + if (digitalRead(6) ==HIGH){ mode = 0; - }else{ + }else{ mode = 1; } float note = 0; if (digitalRead(7) == LOW || digitalRead(5) == LOW){ - if (mode == 0){ - note = tune(getNote()); - } - else{ - note = getNote(); - } - if (digitalRead(5)==LOW){ //if the octave button is pressed - note *= 2; - } + if (mode == 0){ + note = tune(getNote()); + } + else{ + note = getNote(); + } + if (digitalRead(5)==LOW){ //if the octave button is pressed + note *= 2; + } digitalWrite(13, HIGH); - Serial.print(note); //print frequency - Serial.println(" hz"); //print units after frequency + Serial.print(note); //print frequency + Serial.println(" hz"); //print units after frequency tone(8, note); - } else{ noTone(8); } } +/* + * Method that uses an UltraSonic sensor to calculate a frequency + * @return A Frequency generated by a sensor + */ +float getNote(){ - -float getNote() -{ float echoTime; float calculatedDistance; digitalWrite(11, HIGH); delayMicroseconds(20); digitalWrite(11, LOW); - echoTime = pulseIn(12, HIGH); - calculatedDistance = echoTime / 8; - calculatedDistance += 110; - if (calculatedDistance > 1760){ //git - - calculatedDistance = 1760; + calculatedDistance = echoTime / 8; //Change this value to decrease + //the playing physical range + calculatedDistance += 110; //Minimum value + if (calculatedDistance > 1760){ //Prevent high pitched sounds + calculatedDistance = 1760; //Maximum Value } - return calculatedDistance; } + +/* + * Method which takes a note, and brings the note down to a correct pitch + * @param toTune The Note in which you are autotuning + * @return The Note that has now been autotuned + */ float tune(float toTune){ - if (toTune> 523.75){ //C5 + if (toTune> 523.75){ //C5 return 523.75; } - if (toTune> 493.88){ //B4 + if (toTune> 493.88){ //B4 return 493.88; } - if (toTune> 440){ //A4 + if (toTune> 440){ //A4 return 440; } - if (toTune> 392){ //G4 + if (toTune> 392){ //G4 return 392; } - if (toTune> 349.23){ //F4 + if (toTune> 349.23){ //F4 return 349.23; } - if (toTune> 329.63){ //E5 + if (toTune> 329.63){ //E5 return 329.63; } - if (toTune> 293.66){ //D4 + if (toTune> 293.66){ //D4 return 293.66; } - if (toTune> 261.63){ //C4 + if (toTune> 261.63){ //C4 return 261.63; } - if (toTune> 246.94){ //B3 + if (toTune> 246.94){ //B3 return 246.94; } - if (toTune> 220){ //A3 + if (toTune> 220){ //A3 return 220; } - if (toTune> 196){ //G3 + if (toTune> 196){ //G3 return 196; } - if (toTune> 174.61){ //F3 + if (toTune> 174.61){ //F3 return 174.61; } }