Initial Release

Dependencies:   MCP23S17 Motor SDFileSystem mbed-rtos mbed wave_player

Committer:
EngineerGuy1GT
Date:
Wed Dec 06 16:34:32 2017 +0000
Revision:
0:5be0a1cce3f6
Initial Release

Who changed what in which revision?

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