speaker - not mine.

Dependents:   EE3023DistanceSensor EE3023DistanceSensor3 EE3023CarSafetySystem EE3023CarSafetySystem

Committer:
fiachra
Date:
Wed Dec 16 17:17:57 2020 +0000
Revision:
0:20c2337179bc
libraries created;

Who changed what in which revision?

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