Sound update

Dependencies:   4DGL-uLCD-SE Physac-MBED PinDetect SDFileSystem mbed-rtos mbed

Committer:
jaybalar
Date:
Fri Dec 09 21:28:32 2022 +0000
Revision:
31:b08cc3c126d6
Parent:
27:a09981ebd532
update

Who changed what in which revision?

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