Steam engine sound effects using data from flash. Hitting a pushbutton adds a whistle sound to the engine noise. A speaker with a driver plays audio.

Dependencies:   mbed

https://os.mbed.com/users/4180_1/notebook/using-flash-to-play-audio-clips/ has additional details

Revision:
0:0b19409c9805
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jan 17 13:18:11 2020 +0000
@@ -0,0 +1,49 @@
+#include "mbed.h"
+#include "steam-train.h" //setup recorded sound data in flash
+#include "steam-whistle.h"
+//Mixes two sounds, steam engine and whistle,
+//using flash audio player
+//pushbutton on p12 blows whistle
+//Speaker with amp on p18 DAC to play audio
+
+AnalogOut speaker(p18);//output to audio amp to drive speaker
+DigitalOut led(LED1);
+DigitalOut led2(LED2);
+DigitalIn whistle(p12,PullUp);//pushbutton to ground for whistle
+Ticker audio_tick; //audio sample rate interrupt
+int i=0;
+int j=0;
+
+//interrupt routine to play next audio sample from array in flash
+void audio_sample ()
+{
+    unsigned short data;
+    data = steam_train_data[i]>>1;
+    //add whistle sound if button hit
+    //since two audio signals are added, scaling down using >>1
+    //(i.e., shift is faster than /2) avoids overflow (i.e., audio distortion)
+    //As an alternative, data could also be scaled down
+    //in the .h flash data files using the audio tools
+    if (!whistle) {
+        data = data+(steam_whistle_data[j]>>1);
+        j++;
+        if (j>NUM_ELEMENTS_WHISTLE) j=0;
+    } else j=0;
+    //scale down by 2 to avoid amp saturation and audio distortion
+    speaker.write_u16(data);
+    i++;
+    if (i>NUM_ELEMENTS_TRAIN) i = 0;
+}
+
+int main()
+{
+    //enable audio interrupt using timer - 8Khz sample rate
+    audio_tick.attach(&audio_sample, 1.0 / 8000.0);
+    while(1) {
+        //LED blink
+        led = !led;
+        //Whistle pb status
+        led2 = !whistle;
+        wait(0.5);
+    }
+}