ECE 2036 Project

Dependencies:   mbed wave_player 4DGL-uLCD-SE

Committer:
abraha2d
Date:
Thu Nov 21 16:10:57 2019 +0000
Revision:
2:2042f29de6b7
Because other peeps is wanting dis...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abraha2d 2:2042f29de6b7 1 class Speaker
abraha2d 2:2042f29de6b7 2 {
abraha2d 2:2042f29de6b7 3 public:
abraha2d 2:2042f29de6b7 4 Speaker(PinName pin) : _pin(pin) {
abraha2d 2:2042f29de6b7 5 // _pin(pin) means pass pin to the Speaker Constructor
abraha2d 2:2042f29de6b7 6 // precompute 32 sample points on one sine wave cycle
abraha2d 2:2042f29de6b7 7 // used for continuous sine wave output later
abraha2d 2:2042f29de6b7 8 for(int k=0; k<32; k++) {
abraha2d 2:2042f29de6b7 9 Analog_out_data[k] = int (65536.0 * ((1.0 + sin((float(k)/32.0*6.28318530717959)))/2.0));
abraha2d 2:2042f29de6b7 10 // scale the sine wave to 16-bits - as needed for AnalogOut write_u16 arg
abraha2d 2:2042f29de6b7 11 }
abraha2d 2:2042f29de6b7 12
abraha2d 2:2042f29de6b7 13 }
abraha2d 2:2042f29de6b7 14 // class method to play a note based on AnalogOut class
abraha2d 2:2042f29de6b7 15 void PlayNote(float frequency, float duration, float volume) {
abraha2d 2:2042f29de6b7 16 // scale samples using current volume level arg
abraha2d 2:2042f29de6b7 17 for(int k=0; k<32; k++) {
abraha2d 2:2042f29de6b7 18 Analog_scaled_data[k] = Analog_out_data[k] * volume;
abraha2d 2:2042f29de6b7 19 }
abraha2d 2:2042f29de6b7 20 // reset to start of sample array
abraha2d 2:2042f29de6b7 21 i=0;
abraha2d 2:2042f29de6b7 22 // turn on timer interrupts to start sine wave output
abraha2d 2:2042f29de6b7 23 Sample_Period.attach(this, &Speaker::Sample_timer_interrupt, 1.0/(frequency*32.0));
abraha2d 2:2042f29de6b7 24 // play note for specified time
abraha2d 2:2042f29de6b7 25 wait(duration);
abraha2d 2:2042f29de6b7 26 // turns off timer interrupts
abraha2d 2:2042f29de6b7 27 Sample_Period.detach();
abraha2d 2:2042f29de6b7 28 // sets output to mid range - analog zero
abraha2d 2:2042f29de6b7 29 this->_pin.write_u16(32768);
abraha2d 2:2042f29de6b7 30
abraha2d 2:2042f29de6b7 31 }
abraha2d 2:2042f29de6b7 32 private:
abraha2d 2:2042f29de6b7 33 // sets up specified pin for analog using AnalogOut class
abraha2d 2:2042f29de6b7 34 AnalogOut _pin;
abraha2d 2:2042f29de6b7 35 // set up a timer to be used for sample rate interrupts
abraha2d 2:2042f29de6b7 36 Ticker Sample_Period;
abraha2d 2:2042f29de6b7 37
abraha2d 2:2042f29de6b7 38 //variables used by interrupt routine and PlayNote
abraha2d 2:2042f29de6b7 39 volatile int i;
abraha2d 2:2042f29de6b7 40 short unsigned Analog_out_data[32];
abraha2d 2:2042f29de6b7 41 short unsigned Analog_scaled_data[32];
abraha2d 2:2042f29de6b7 42
abraha2d 2:2042f29de6b7 43 // Interrupt routine
abraha2d 2:2042f29de6b7 44 // used to output next analog sample whenever a timer interrupt occurs
abraha2d 2:2042f29de6b7 45 void Sample_timer_interrupt(void) {
abraha2d 2:2042f29de6b7 46 // send next analog sample out to D to A
abraha2d 2:2042f29de6b7 47 this->_pin.write_u16(Analog_scaled_data[i]);
abraha2d 2:2042f29de6b7 48 // increment pointer and wrap around back to 0 at 32
abraha2d 2:2042f29de6b7 49 i = (i+1) & 0x01F;
abraha2d 2:2042f29de6b7 50 }
abraha2d 2:2042f29de6b7 51 };
abraha2d 2:2042f29de6b7 52