Audio echo effect. See http://dev.frozeneskimo.com/embedded_projects/audio_echo_effect for more info!

Dependencies:   mbed

Committer:
vsergeev
Date:
Sun Mar 28 11:23:11 2010 +0000
Revision:
0:97643e5b2d5e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsergeev 0:97643e5b2d5e 1 #include "mbed.h"
vsergeev 0:97643e5b2d5e 2
vsergeev 0:97643e5b2d5e 3 #define MAX_DELAY 15000
vsergeev 0:97643e5b2d5e 4 #define MIN_DELAY 50
vsergeev 0:97643e5b2d5e 5
vsergeev 0:97643e5b2d5e 6 #define MAX_GAIN 25
vsergeev 0:97643e5b2d5e 7 #define MIN_GAIN 2
vsergeev 0:97643e5b2d5e 8
vsergeev 0:97643e5b2d5e 9 /* ADC for the microphone/input, DAC for the speaker/output */
vsergeev 0:97643e5b2d5e 10 AnalogIn mic(p19);
vsergeev 0:97643e5b2d5e 11 AnalogOut speaker(p18);
vsergeev 0:97643e5b2d5e 12 /* Two potentiometer voltage dividers for the delay/gain control knobs */
vsergeev 0:97643e5b2d5e 13 AnalogIn delay_knob(p15);
vsergeev 0:97643e5b2d5e 14 AnalogIn gain_knob(p16);
vsergeev 0:97643e5b2d5e 15
vsergeev 0:97643e5b2d5e 16 unsigned short buffer[MAX_DELAY];
vsergeev 0:97643e5b2d5e 17
vsergeev 0:97643e5b2d5e 18 /* inv_gain = 1 / gain; it's faster to avoid floating point during the main loop */
vsergeev 0:97643e5b2d5e 19 int inv_gain = 3;
vsergeev 0:97643e5b2d5e 20 int delay = MAX_DELAY;
vsergeev 0:97643e5b2d5e 21
vsergeev 0:97643e5b2d5e 22 void read_knobs(void) {
vsergeev 0:97643e5b2d5e 23 delay = delay_knob*MAX_DELAY;
vsergeev 0:97643e5b2d5e 24 //gain = gain_knob*MAX_GAIN;
vsergeev 0:97643e5b2d5e 25 if (delay < MIN_DELAY)
vsergeev 0:97643e5b2d5e 26 delay = MIN_DELAY;
vsergeev 0:97643e5b2d5e 27 /*if (gain < MIN_GAIN)
vsergeev 0:97643e5b2d5e 28 gain = MIN_GAIN;
vsergeev 0:97643e5b2d5e 29 if (gain == MAX_GAIN)
vsergeev 0:97643e5b2d5e 30 gain -= 1;*/
vsergeev 0:97643e5b2d5e 31 }
vsergeev 0:97643e5b2d5e 32
vsergeev 0:97643e5b2d5e 33 int main() {
vsergeev 0:97643e5b2d5e 34 int i;
vsergeev 0:97643e5b2d5e 35 /* Fill up the sample buffer first */
vsergeev 0:97643e5b2d5e 36 for (i = 0; i < delay; i++)
vsergeev 0:97643e5b2d5e 37 buffer[i] += mic.read_u16();
vsergeev 0:97643e5b2d5e 38
vsergeev 0:97643e5b2d5e 39 for (i = 0; ; ) {
vsergeev 0:97643e5b2d5e 40 /* Multiply old data by the gain, add new data */
vsergeev 0:97643e5b2d5e 41 buffer[i] = buffer[i]/inv_gain + mic.read_u16();
vsergeev 0:97643e5b2d5e 42 /* Write to speaker */
vsergeev 0:97643e5b2d5e 43 speaker.write_u16(buffer[i]);
vsergeev 0:97643e5b2d5e 44 /* Increment index and wrap around, effectively only using "delay" length of the buffer */
vsergeev 0:97643e5b2d5e 45 i = (i+1) % delay;
vsergeev 0:97643e5b2d5e 46 /* Occasionally read the knobs */
vsergeev 0:97643e5b2d5e 47 if (i == 0)
vsergeev 0:97643e5b2d5e 48 read_knobs();
vsergeev 0:97643e5b2d5e 49 }
vsergeev 0:97643e5b2d5e 50 }