vsergeev vsergeev
/
echo_effect
Audio echo effect. See http://dev.frozeneskimo.com/embedded_projects/audio_echo_effect for more info!
main.cpp@0:97643e5b2d5e, 2010-03-28 (annotated)
- Committer:
- vsergeev
- Date:
- Sun Mar 28 11:23:11 2010 +0000
- Revision:
- 0:97643e5b2d5e
Who changed what in which revision?
User | Revision | Line number | New 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 | } |