4180 Final Project

Dependencies:   mbed uLCD_4D_Picaso mbed-rtos PinDetect

Committer:
NotAnExpert
Date:
Thu Dec 05 17:27:10 2019 +0000
Revision:
0:a45fd26bd87b
Published

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NotAnExpert 0:a45fd26bd87b 1 #include "mbed.h"
NotAnExpert 0:a45fd26bd87b 2 // new class to play a note on Speaker based on PwmOut class
NotAnExpert 0:a45fd26bd87b 3 class SongPlayer
NotAnExpert 0:a45fd26bd87b 4 {
NotAnExpert 0:a45fd26bd87b 5 public:
NotAnExpert 0:a45fd26bd87b 6 SongPlayer(PinName pin) : _pin(pin) {
NotAnExpert 0:a45fd26bd87b 7 // _pin(pin) means pass pin to the constructor
NotAnExpert 0:a45fd26bd87b 8 }
NotAnExpert 0:a45fd26bd87b 9 // class method to play a note based on PwmOut class
NotAnExpert 0:a45fd26bd87b 10 void PlaySong(float frequency[], float duration[], float volume=1.0) {
NotAnExpert 0:a45fd26bd87b 11 vol = volume;
NotAnExpert 0:a45fd26bd87b 12 notecount = 0;
NotAnExpert 0:a45fd26bd87b 13 _pin.period(1.0/frequency[notecount]);
NotAnExpert 0:a45fd26bd87b 14 _pin = volume/2.0;
NotAnExpert 0:a45fd26bd87b 15 noteduration.attach(this,&SongPlayer::nextnote, duration[notecount]);
NotAnExpert 0:a45fd26bd87b 16 // setup timer to interrupt for next note to play
NotAnExpert 0:a45fd26bd87b 17 frequencyptr = frequency;
NotAnExpert 0:a45fd26bd87b 18 durationptr = duration;
NotAnExpert 0:a45fd26bd87b 19 //returns after first note starts to play
NotAnExpert 0:a45fd26bd87b 20 }
NotAnExpert 0:a45fd26bd87b 21 void nextnote();
NotAnExpert 0:a45fd26bd87b 22 private:
NotAnExpert 0:a45fd26bd87b 23 Timeout noteduration;
NotAnExpert 0:a45fd26bd87b 24 PwmOut _pin;
NotAnExpert 0:a45fd26bd87b 25 int notecount;
NotAnExpert 0:a45fd26bd87b 26 float vol;
NotAnExpert 0:a45fd26bd87b 27 float * frequencyptr;
NotAnExpert 0:a45fd26bd87b 28 float * durationptr;
NotAnExpert 0:a45fd26bd87b 29 };
NotAnExpert 0:a45fd26bd87b 30 //Interrupt Routine to play next note
NotAnExpert 0:a45fd26bd87b 31 void SongPlayer::nextnote()
NotAnExpert 0:a45fd26bd87b 32 {
NotAnExpert 0:a45fd26bd87b 33 _pin = 0.0;
NotAnExpert 0:a45fd26bd87b 34 notecount++; //setup next note in song
NotAnExpert 0:a45fd26bd87b 35 if (durationptr[notecount]!=0.0) {
NotAnExpert 0:a45fd26bd87b 36 _pin.period(1.0/frequencyptr[notecount]);
NotAnExpert 0:a45fd26bd87b 37 noteduration.attach(this,&SongPlayer::nextnote, durationptr[notecount]);
NotAnExpert 0:a45fd26bd87b 38 _pin = vol/2.0;
NotAnExpert 0:a45fd26bd87b 39 } else
NotAnExpert 0:a45fd26bd87b 40 _pin = 0.0; //turn off on last note
NotAnExpert 0:a45fd26bd87b 41 }