/* *@author James McKenzie *@lang C89 Based *@contact lunarised@outlook.com */ int mode; void setup() { 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){ mode = 0; }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; } digitalWrite(13, HIGH); 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 echoTime; float calculatedDistance; digitalWrite(11, HIGH); delayMicroseconds(20); digitalWrite(11, LOW); echoTime = pulseIn(12, HIGH); 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 return 523.75; } if (toTune> 493.88){ //B4 return 493.88; } if (toTune> 440){ //A4 return 440; } if (toTune> 392){ //G4 return 392; } if (toTune> 349.23){ //F4 return 349.23; } if (toTune> 329.63){ //E5 return 329.63; } if (toTune> 293.66){ //D4 return 293.66; } if (toTune> 261.63){ //C4 return 261.63; } if (toTune> 246.94){ //B3 return 246.94; } if (toTune> 220){ //A3 return 220; } if (toTune> 196){ //G3 return 196; } if (toTune> 174.61){ //F3 return 174.61; } }