xypad theremin for LPC1768

Dependencies:   MODDMA mbed

Committer:
exopiped
Date:
Mon Mar 14 23:43:44 2016 +0000
Revision:
2:c5eeaf1c8e69
Parent:
1:aa184d2eb2e3
touch screen driver glitches removed; debug statements commented out

Who changed what in which revision?

UserRevisionLine numberNew contents of line
exopiped 0:8ee38453bad9 1 /*
exopiped 0:8ee38453bad9 2 * wave.cpp -- wave templates for use in Digital
exopiped 0:8ee38453bad9 3 * Theremin demo program
exopiped 0:8ee38453bad9 4 */
exopiped 0:8ee38453bad9 5 #include "mbed.h"
exopiped 0:8ee38453bad9 6 #include "dma.h"
exopiped 0:8ee38453bad9 7 #include "jswitch.h"
exopiped 0:8ee38453bad9 8 #include "wave.h"
exopiped 0:8ee38453bad9 9
exopiped 0:8ee38453bad9 10 // Default wave type is the SAW
exopiped 0:8ee38453bad9 11 static int wavetype = WAVE_TYPE_DEFAULT;
exopiped 0:8ee38453bad9 12 // Next wave type requested
exopiped 0:8ee38453bad9 13 static bool next_wavetype=false;
exopiped 0:8ee38453bad9 14 // The wave template buffer size is DMA_BUFSIZE
exopiped 0:8ee38453bad9 15 static int waveform[1+WAVE_TYPE_LAST - WAVE_TYPE_FIRST][DMA_BUFSIZE];
exopiped 0:8ee38453bad9 16 // Accumulated phase
exopiped 0:8ee38453bad9 17 static unsigned accum_phi = 0;
exopiped 0:8ee38453bad9 18
exopiped 0:8ee38453bad9 19 /*
exopiped 0:8ee38453bad9 20 * the phase accumulator ranges between 0 and 99999.
exopiped 0:8ee38453bad9 21 * corresponding to 0 and 2*pi radians. The frequency
exopiped 0:8ee38453bad9 22 * supplied to the wave_nextval() function determines the
exopiped 0:8ee38453bad9 23 * magnitude of the change in the phase accumulator value,
exopiped 0:8ee38453bad9 24 * according to the formula:
exopiped 0:8ee38453bad9 25 * delta-phase = 100000*frequency/WAVE_SAMPLE_RATE
exopiped 0:8ee38453bad9 26 * The next value of phase_accumulator is:
exopiped 0:8ee38453bad9 27 * (phase_accumulator + delta-phase) % 100000
exopiped 0:8ee38453bad9 28 * phase_accumulator is converted to wave table index using
exopiped 0:8ee38453bad9 29 * the formula:
exopiped 0:8ee38453bad9 30 * index = (DMA_BUFSIZE - 1)*phase_accumulator/0xFFFF
exopiped 0:8ee38453bad9 31 */
exopiped 0:8ee38453bad9 32
exopiped 0:8ee38453bad9 33 void wave_init(void)
exopiped 0:8ee38453bad9 34 {
exopiped 0:8ee38453bad9 35 int j;
exopiped 0:8ee38453bad9 36
exopiped 0:8ee38453bad9 37 accum_phi = 0;
exopiped 0:8ee38453bad9 38 wavetype = WAVE_TYPE_DEFAULT;
exopiped 0:8ee38453bad9 39
exopiped 0:8ee38453bad9 40 for (j=0;j<DMA_BUFSIZE;j++) {
exopiped 0:8ee38453bad9 41 waveform[WAVE_TYPE_SAW][j] = j;
exopiped 0:8ee38453bad9 42 }
exopiped 0:8ee38453bad9 43
exopiped 0:8ee38453bad9 44 for (j=0;j<DMA_BUFSIZE;j++) {
exopiped 0:8ee38453bad9 45 if (j<DMA_BUFSIZE/2) {
exopiped 0:8ee38453bad9 46 waveform[WAVE_TYPE_SQUARE][j] = DMA_BUFSIZE;
exopiped 0:8ee38453bad9 47 } else {
exopiped 0:8ee38453bad9 48 waveform[WAVE_TYPE_SQUARE][j] = 0;
exopiped 0:8ee38453bad9 49 }
exopiped 0:8ee38453bad9 50 }
exopiped 0:8ee38453bad9 51
exopiped 0:8ee38453bad9 52 for (j=0;j<DMA_BUFSIZE;j++) {
exopiped 0:8ee38453bad9 53 if (j<DMA_BUFSIZE/2) {
exopiped 0:8ee38453bad9 54 waveform[WAVE_TYPE_TRIANGLE][j] = 2*j;
exopiped 0:8ee38453bad9 55 } else {
exopiped 0:8ee38453bad9 56 waveform[WAVE_TYPE_TRIANGLE][j]
exopiped 0:8ee38453bad9 57 =DMA_BUFSIZE-2*(j-DMA_BUFSIZE/2);
exopiped 0:8ee38453bad9 58 }
exopiped 0:8ee38453bad9 59 }
exopiped 0:8ee38453bad9 60 }
exopiped 0:8ee38453bad9 61
exopiped 0:8ee38453bad9 62 void wave_reset(void)
exopiped 0:8ee38453bad9 63 {
exopiped 0:8ee38453bad9 64 accum_phi=0;
exopiped 0:8ee38453bad9 65 }
exopiped 0:8ee38453bad9 66 /*
exopiped 0:8ee38453bad9 67 * wave_nextval
exopiped 0:8ee38453bad9 68 * delta-phase = 100000*frequency/WAVE_SAMPLE_RATE
exopiped 0:8ee38453bad9 69 * The next value of phase_accumulator is:
exopiped 0:8ee38453bad9 70 * (phase_accumulator + delta-phase) % 100000
exopiped 0:8ee38453bad9 71 * phase_accumulator is converted to wave table index using
exopiped 0:8ee38453bad9 72 * the formula:
exopiped 0:8ee38453bad9 73 * index = DMA_BUFSIZE * phase_accumulator / 100000
exopiped 0:8ee38453bad9 74 */
exopiped 0:8ee38453bad9 75 int wave_nextval(unsigned freq)
exopiped 0:8ee38453bad9 76 {
exopiped 0:8ee38453bad9 77 unsigned delta_phi,index;
exopiped 0:8ee38453bad9 78
exopiped 0:8ee38453bad9 79 delta_phi= 100000*freq/WAVE_SAMPLE_RATE;
exopiped 0:8ee38453bad9 80 accum_phi = (accum_phi + delta_phi)%100000;
exopiped 1:aa184d2eb2e3 81 index = (DMA_BUFSIZE * accum_phi)/100000;
exopiped 0:8ee38453bad9 82 return waveform[wavetype][index];
exopiped 0:8ee38453bad9 83 }
exopiped 0:8ee38453bad9 84
exopiped 0:8ee38453bad9 85 void wave_update(void)
exopiped 0:8ee38453bad9 86 {
exopiped 0:8ee38453bad9 87 unsigned char js_val;
exopiped 0:8ee38453bad9 88
exopiped 0:8ee38453bad9 89 js_val = js_read(JS_CENTER);
exopiped 0:8ee38453bad9 90 if ((js_val & JS_CENTER)==JS_CENTER) {
exopiped 0:8ee38453bad9 91 next_wavetype = true;
exopiped 0:8ee38453bad9 92 }
exopiped 0:8ee38453bad9 93 }
exopiped 0:8ee38453bad9 94
exopiped 0:8ee38453bad9 95 bool wave_type_changed(void)
exopiped 0:8ee38453bad9 96 {
exopiped 0:8ee38453bad9 97 return next_wavetype;
exopiped 0:8ee38453bad9 98 }
exopiped 0:8ee38453bad9 99
exopiped 0:8ee38453bad9 100 void wave_type_incr(void)
exopiped 0:8ee38453bad9 101 {
exopiped 0:8ee38453bad9 102 next_wavetype = false;
exopiped 0:8ee38453bad9 103 wavetype = 1+wavetype;
exopiped 0:8ee38453bad9 104 if (wavetype > WAVE_TYPE_LAST) {
exopiped 0:8ee38453bad9 105 wavetype = WAVE_TYPE_FIRST;
exopiped 0:8ee38453bad9 106 }
exopiped 0:8ee38453bad9 107 }
exopiped 0:8ee38453bad9 108