Arduino Sound Demo | C

January 4th, 2022 02:20:43 AM

					
//Leif Messinger const int BUZZER_PIN = 8; const int BUTTON_PIN = 2; const int BUTTON_PINMODE = INPUT_PULLUP; #define DEBOUNCE_DELAY 50 class Button{ private: short buttonPin; bool buttonState; bool lastButtonState; int lastDebounceTime; public: Button(short buttonPin): buttonState(HIGH), lastButtonState(LOW), lastDebounceTime(millis()){ this->buttonPin = buttonPin; } bool checkForPress(const bool desiredState){ //Returns true if button pressed bool reading = (bool)digitalRead(buttonPin); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); }else if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == desiredState) { return true; } } } // save the reading. Next time through the loop, it'll be the lastButtonState: lastButtonState = reading; return false; } void waitForPress(const bool desiredState){ while(!checkForPress(desiredState)); } }; class Note{ public: short frequency; //Short max is ~ 30k, so way higher than you can hear short lag; //Also 30k ms is 30 seconds float sustainPercentage; }; const short normalBeatLength = 500; const short wholeNote = 4*normalBeatLength; const short halfNote = 2*normalBeatLength; const short dottedQuarterNote = normalBeatLength + (normalBeatLength / 2); const short quarterNote = normalBeatLength; const short dottedEighthNote = ((3 * normalBeatLength) / 4); const short eighthNote = normalBeatLength/ 2; const short sixteenthNote = normalBeatLength / 4; const float normalSustainLength = .25; void beep(const Note& note){ //It might go terribly wrong if you try to beep two tones at the same time. tone(BUZZER_PIN, note.frequency); delay(note.lag * note.sustainPercentage); noTone(BUZZER_PIN); delay(note.lag * (1.0 - note.sustainPercentage)); } Note song[] = { {(int)523.25, halfNote, normalSustainLength}, {(int)392, eighthNote, normalSustainLength}, {(int)523.25, quarterNote, normalSustainLength}, {(int)392, dottedEighthNote, normalSustainLength}, {(int)440.00, sixteenthNote, normalSustainLength}, {(int)493.88, quarterNote, normalSustainLength}, {(int)329.63, eighthNote, normalSustainLength}, {(int)329.63, eighthNote, normalSustainLength}, {(int)440.00, quarterNote, normalSustainLength}, {(int)392, dottedEighthNote, normalSustainLength}, {(int)349.23, sixteenthNote, normalSustainLength}, {(int)392, quarterNote, normalSustainLength}, {(int)261.63, dottedEighthNote, normalSustainLength}, {(int)261.63, sixteenthNote, normalSustainLength}, {(int)293.66, quarterNote, normalSustainLength}, {(int)293.66, dottedEighthNote, normalSustainLength}, {(int)329.63, sixteenthNote, normalSustainLength}, {(int)349.23, quarterNote, normalSustainLength}, {(int)349.23, dottedEighthNote, normalSustainLength}, {(int)392.00, sixteenthNote, normalSustainLength}, {(int)440.00, quarterNote, normalSustainLength}, {(int)493.88, eighthNote, normalSustainLength}, {(int)523.25, eighthNote, normalSustainLength}, {(int)587.33, dottedQuarterNote, normalSustainLength}, {(int)392, eighthNote, normalSustainLength}, {(int)659.25, quarterNote, normalSustainLength}, {(int)587.33, dottedEighthNote, normalSustainLength}, {(int)523.25, sixteenthNote, normalSustainLength}, {(int)587.33, quarterNote, normalSustainLength}, {(int)493.88, eighthNote, normalSustainLength}, {(int)392, eighthNote, normalSustainLength}, {(int)523.25, quarterNote, normalSustainLength}, {(int)493.88, dottedEighthNote, normalSustainLength}, {(int)440.00, sixteenthNote, normalSustainLength}, {(int)493.88, quarterNote, normalSustainLength}, {(int)329.63, eighthNote, normalSustainLength}, {(int)329.63, eighthNote, normalSustainLength}, {(int)440.00, quarterNote, normalSustainLength}, {(int)392, dottedEighthNote, normalSustainLength}, {(int)349.23, sixteenthNote, normalSustainLength}, {(int)392, quarterNote, normalSustainLength}, {(int)261.63, dottedEighthNote, normalSustainLength}, {(int)261.63, sixteenthNote, normalSustainLength}, {(int)523.25, quarterNote, normalSustainLength}, {(int)493.88, dottedEighthNote, normalSustainLength}, {(int)440.00, sixteenthNote, normalSustainLength}, {(int)392.00, halfNote, normalSustainLength * .5}, }; size_t songLength = (sizeof(song) / sizeof(Note)); void playSong(){ for(size_t pos = 0; pos < songLength; ++pos){ const Note& bruh = song[pos]; beep(bruh); } } void setup() { const int BUZZER_PIN = 8; pinMode(BUZZER_PIN, OUTPUT); pinMode(BUTTON_PIN, BUTTON_PINMODE); playSong(); } Button button(BUTTON_PIN); void loop() { button.waitForPress(LOW); // read the state of the switch into a local variable: playSong(); }

Featured Posts