|
- /*
- *@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;
- }
- }
|