I am so cool I did it all by myself lol (.)(.) Hello my name is guitar reverse me and it is karaoke time this version which bumps the size of the buffer up and maximizes the chunk size to use all of this buffer. I also added a wait_us(50); at the top of the for() loop to reduce the sampling to something less than 20kHz. thanks adam and everybody oh look is that Eve.

Dependencies:   mbed

Committer:
mbed2f
Date:
Mon May 30 15:31:21 2011 +0000
Revision:
0:8eeac881ada0

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed2f 0:8eeac881ada0 1 #include <mbed.h>
mbed2f 0:8eeac881ada0 2
mbed2f 0:8eeac881ada0 3 // Boolean types
mbed2f 0:8eeac881ada0 4 #define TRUE 1
mbed2f 0:8eeac881ada0 5 #define FALSE 0
mbed2f 0:8eeac881ada0 6
mbed2f 0:8eeac881ada0 7 /* ADC for the microphone/input, DAC for the speaker/output */
mbed2f 0:8eeac881ada0 8 AnalogIn mic(p19);
mbed2f 0:8eeac881ada0 9 AnalogOut speaker(p18);
mbed2f 0:8eeac881ada0 10
mbed2f 0:8eeac881ada0 11 // Allocate a buffer to be used for the audio recording
mbed2f 0:8eeac881ada0 12 static const size_t BufferSize = 15 * 1024;
mbed2f 0:8eeac881ada0 13 static unsigned short Buffer[BufferSize];
mbed2f 0:8eeac881ada0 14
mbed2f 0:8eeac881ada0 15
mbed2f 0:8eeac881ada0 16 int main(void)
mbed2f 0:8eeac881ada0 17 {
mbed2f 0:8eeac881ada0 18 unsigned short ReadSample = 0xFFFF;
mbed2f 0:8eeac881ada0 19 // Indices to track where the playback and recording should take place in the
mbed2f 0:8eeac881ada0 20 // audio buffer. The recording can occur one sample behind the current playback
mbed2f 0:8eeac881ada0 21 // index since it is no longer required.
mbed2f 0:8eeac881ada0 22 int Index = 0;
mbed2f 0:8eeac881ada0 23 // Reverse the direction the buffer is walked between each iteration to save memory
mbed2f 0:8eeac881ada0 24 int Direction = 1;
mbed2f 0:8eeac881ada0 25 // Have audio to playback
mbed2f 0:8eeac881ada0 26 int Playback = FALSE;
mbed2f 0:8eeac881ada0 27 // The amount of data to be recorded before starting reverse playback
mbed2f 0:8eeac881ada0 28 // NOTE: Probably want this to be configured at runtime via a knob, etc.
mbed2f 0:8eeac881ada0 29 int ChunkSize = BufferSize;
mbed2f 0:8eeac881ada0 30
mbed2f 0:8eeac881ada0 31 // Infinite loop of recording and reverse playback
mbed2f 0:8eeac881ada0 32 for (;;)
mbed2f 0:8eeac881ada0 33 {
mbed2f 0:8eeac881ada0 34 unsigned short PlaySample;
mbed2f 0:8eeac881ada0 35
mbed2f 0:8eeac881ada0 36 // Slow down the sampling rate so that it doesn't exceed 20kHz
mbed2f 0:8eeac881ada0 37 wait_us(50);
mbed2f 0:8eeac881ada0 38
mbed2f 0:8eeac881ada0 39 // Read out the sample from the buffer to be played back
mbed2f 0:8eeac881ada0 40 if (Playback)
mbed2f 0:8eeac881ada0 41 {
mbed2f 0:8eeac881ada0 42 PlaySample = Buffer[Index];
mbed2f 0:8eeac881ada0 43 speaker.write_u16(PlaySample);
mbed2f 0:8eeac881ada0 44 }
mbed2f 0:8eeac881ada0 45
mbed2f 0:8eeac881ada0 46 // Obtain current audio sample from the A/D converter.
mbed2f 0:8eeac881ada0 47 ReadSample = mic.read_u16();
mbed2f 0:8eeac881ada0 48
mbed2f 0:8eeac881ada0 49 // Record the sample into the buffer right where a space was freed up from the PlaySample read above
mbed2f 0:8eeac881ada0 50 Buffer[Index] = ReadSample;
mbed2f 0:8eeac881ada0 51
mbed2f 0:8eeac881ada0 52 // Increment the buffer pointer
mbed2f 0:8eeac881ada0 53 Index += Direction;
mbed2f 0:8eeac881ada0 54
mbed2f 0:8eeac881ada0 55 // Check to see if the chunk has been filled
mbed2f 0:8eeac881ada0 56 if (Index < 0)
mbed2f 0:8eeac881ada0 57 {
mbed2f 0:8eeac881ada0 58 // Now have a chunk to be played back
mbed2f 0:8eeac881ada0 59 Playback = TRUE;
mbed2f 0:8eeac881ada0 60 // Reverse the direction of playback and recording
mbed2f 0:8eeac881ada0 61 Direction *= -1;
mbed2f 0:8eeac881ada0 62 Index = 0;
mbed2f 0:8eeac881ada0 63 }
mbed2f 0:8eeac881ada0 64 else if (Index >= ChunkSize)
mbed2f 0:8eeac881ada0 65 {
mbed2f 0:8eeac881ada0 66 // Now have a chunk to be played back
mbed2f 0:8eeac881ada0 67 Playback = TRUE;
mbed2f 0:8eeac881ada0 68 // Reverse the direction of playback and recording
mbed2f 0:8eeac881ada0 69 Direction *= -1;
mbed2f 0:8eeac881ada0 70 Index = ChunkSize - 1;
mbed2f 0:8eeac881ada0 71 }
mbed2f 0:8eeac881ada0 72 }
mbed2f 0:8eeac881ada0 73 }