Waveform generator

Dependencies:   4DGL-uLCD-SE AFG_project PinDetect RPG mbed

Committer:
carsonbrown27
Date:
Thu Dec 08 05:06:29 2022 +0000
Revision:
0:7e122b3c7928
Final Version

Who changed what in which revision?

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