Bluetooth Enabled Keyboard/Synthesizer for mbed

Dependencies:   mbed 4DGL-uLCD-SE SDFileSystem mbed-rtos

Committer:
jmpin
Date:
Thu Apr 28 23:44:55 2016 +0000
Revision:
10:085c49fe2509
Parent:
9:e4df1a31a098
Child:
11:c87f55a3b9e0
Got rid of lookup table nonsense.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmpin 0:48311ffdfa96 1 #include "mbed.h"
jmpin 3:3aba1d783730 2 #include "SDFileSystem.h"
jmpin 6:68c6a50e1437 3 #include "rtos.h"
jmpin 6:68c6a50e1437 4 #include <vector>
jmpin 6:68c6a50e1437 5 #include "uLCD_4DGL.h"
jmpin 3:3aba1d783730 6 #include "synthesizer.h"
jmpin 0:48311ffdfa96 7 Serial Blue(p28,p27);
jmpin 0:48311ffdfa96 8 Serial PC(USBTX,USBRX);
jmpin 0:48311ffdfa96 9 DigitalOut myled(LED1);
jmpin 0:48311ffdfa96 10 DigitalOut myled4(LED4);
jmpin 3:3aba1d783730 11
jmpin 3:3aba1d783730 12 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup
jmpin 3:3aba1d783730 13
jmpin 6:68c6a50e1437 14 Mutex mtx; //Mutex lock
jmpin 6:68c6a50e1437 15
jmpin 6:68c6a50e1437 16 uLCD_4DGL uLCD(p13,p14,p11); // serial tx, serial rx, reset pin;
jmpin 6:68c6a50e1437 17
jmpin 8:f6699fd30737 18 AnalogOut synthPin(p18); // p18 is the pin that will have the output voltages on it
jmpin 8:f6699fd30737 19
jmpin 6:68c6a50e1437 20
jmpin 0:48311ffdfa96 21 //global variables for main and interrupt routine
jmpin 0:48311ffdfa96 22 volatile bool readyFlag = true;
jmpin 0:48311ffdfa96 23 volatile char keyPress;
jmpin 3:3aba1d783730 24 WaveType myWave = sine; // default to sine wave
jmpin 3:3aba1d783730 25 volatile int currentOctave = 4; // default to 4 because thats where middle C is
jmpin 3:3aba1d783730 26 volatile int currentAttackVal = 3; // values will range from 1-5, default to 3
jmpin 6:68c6a50e1437 27 volatile int currentDecayVal = 3; // values will range from 1-5, default to 3
jmpin 3:3aba1d783730 28 volatile int currentSustainVal = 3; // values will range from 1-5, default to 3
jmpin 3:3aba1d783730 29 volatile int currentReleaseVal = 3; // values will range from 1-5, default to 3
jmpin 6:68c6a50e1437 30 int *currentLookupTable; // pointer to the correct lookup table of values
jmpin 9:e4df1a31a098 31 double *currentAttackTable; // pointer to the correct attack coefficient table
jmpin 9:e4df1a31a098 32 double *currentDecayTable; // pointer to the correct decay coefficient table
jmpin 9:e4df1a31a098 33 double *currentSustainTable; // pointer to the correct sustain coefficient table
jmpin 9:e4df1a31a098 34 double *currentReleaseTable; // pointer to the correct release coefficient table
jmpin 6:68c6a50e1437 35 vector<double> sampleBuffer; // vector to hold samples of generated waveform
jmpin 6:68c6a50e1437 36 volatile int lookupTableIndex; // index used to find values in the lookup table for the waveforms
jmpin 6:68c6a50e1437 37 volatile int phaseAccumulator; // stores phase accumulator which is used to index into the lookup table
jmpin 6:68c6a50e1437 38 int num_samples = 256; // number of samples
jmpin 6:68c6a50e1437 39 int shift_factor = 0x01000000; // shifting factor
jmpin 6:68c6a50e1437 40 int sampling_frequency = 40000; // sampling frequency is 40kHz
jmpin 6:68c6a50e1437 41 volatile int frequencyTuner; // the frequency tuner used to increment the accumulator which indexes values in the lookup table
jmpin 6:68c6a50e1437 42 volatile int noteFreq; // the current frequency of the note being played
jmpin 6:68c6a50e1437 43 volatile int sustainAmplitude; // the desired amplitude of the sustain level
jmpin 8:f6699fd30737 44 double timeIncrement = (2/256); // 2 seconds with 256 samples
jmpin 5:afd67e985df0 45
jmpin 5:afd67e985df0 46 /* Coefficient Matrices Corresponding to Different Attack Values
jmpin 5:afd67e985df0 47 each matrix is comprised of 32 elements (256/8). The first matrix corresponds
jmpin 5:afd67e985df0 48 to an attack value of 1.
jmpin 5:afd67e985df0 49 */
jmpin 5:afd67e985df0 50
jmpin 6:68c6a50e1437 51 double attackVals5[32] = { //Approaches the maximum amplitude the quickest - corresponds to an attackValue of 5
jmpin 5:afd67e985df0 52 0, 0.275 , 0.55 , 0.7 ,
jmpin 5:afd67e985df0 53 0.8 , 0.85 , 0.9 , 0.91 ,
jmpin 5:afd67e985df0 54 0.92 , 0.93 , 0.939 , 0.948 ,
jmpin 5:afd67e985df0 55 0.956 , 0.963 , 0.969 , 0.974 ,
jmpin 5:afd67e985df0 56 0.978 , 0.982 , 0.986 , 0.989 ,
jmpin 5:afd67e985df0 57 0.991 , 0.992 , 0.993 , 0.994 ,
jmpin 5:afd67e985df0 58 0.995 , 0.996 , 0.997 , 0.998 ,
jmpin 5:afd67e985df0 59 0.9985 , 0.999 , 0.9995 , 1
jmpin 5:afd67e985df0 60 };
jmpin 6:68c6a50e1437 61 double attackVals4[32] = { //Corresponds to an attackValue of 4
jmpin 5:afd67e985df0 62 0 , 0.18 , 0.38 , 0.58 ,
jmpin 5:afd67e985df0 63 0.66 , 0.69 , 0.72 , 0.74 ,
jmpin 5:afd67e985df0 64 0.76 , 0.78 , 0.795 , 0.81 ,
jmpin 5:afd67e985df0 65 0.825 , 0.84 , 0.85 , 0.86 ,
jmpin 5:afd67e985df0 66 0.87 , 0.88 , 0.89 , 0.9 ,
jmpin 5:afd67e985df0 67 0.91 , 0.92 , 0.93 , 0.94 ,
jmpin 5:afd67e985df0 68 0.95 , 0.96 , 0.97 , 0.98 ,
jmpin 5:afd67e985df0 69 0.985 , 0.99 , 0.995 , 1
jmpin 5:afd67e985df0 70 };
jmpin 6:68c6a50e1437 71 double attackVals3[32] = { //Corresponds to an attackValue of 3
jmpin 5:afd67e985df0 72 0 , 0.09 , 0.18 , 0.27 ,
jmpin 5:afd67e985df0 73 0.35 , 0.43 , 0.5 , 0.57 ,
jmpin 5:afd67e985df0 74 0.61 , 0.65 , 0.68 , 0.71 ,
jmpin 5:afd67e985df0 75 0.74 , 0.76 , 0.78 , 0.8 ,
jmpin 5:afd67e985df0 76 0.82 , 0.84 , 0.86 , 0.88 ,
jmpin 5:afd67e985df0 77 0.895 , 0.91 , 0.925 , 0.94 ,
jmpin 5:afd67e985df0 78 0.95 , 0.96 , 0.97 , 0.98 ,
jmpin 5:afd67e985df0 79 0.985 , 0.99 , 0.995 , 1
jmpin 5:afd67e985df0 80 };
jmpin 6:68c6a50e1437 81 double attackVals2[32] = { //Corresponds to an attackValue of 2
jmpin 5:afd67e985df0 82 0 , 0.06 , 0.12 , 0.18 ,
jmpin 5:afd67e985df0 83 0.23 , 0.28 , 0.32 , 0.36 ,
jmpin 5:afd67e985df0 84 0.4 , 0.44 , 0.48 , 0.52 ,
jmpin 5:afd67e985df0 85 0.55 , 0.58 , 0.61 , 0.64 ,
jmpin 5:afd67e985df0 86 0.67 , 0.695 , 0.72 , 0.745 ,
jmpin 5:afd67e985df0 87 0.77 , 0.795 , 0.82 , 0.845 ,
jmpin 5:afd67e985df0 88 0.87 , 0.895 , 0.92 , 0.945 ,
jmpin 5:afd67e985df0 89 0.965 , 0.985 , 0.995 , 1
jmpin 5:afd67e985df0 90 };
jmpin 6:68c6a50e1437 91 double attackVals1[32] = { //Approaches the mamimum amplitude the slowest, in a linear fashion - corresponds to an attackValue of 1
jmpin 5:afd67e985df0 92 0 , 0.032258065 , 0.064516129 , 0.096774194 ,
jmpin 5:afd67e985df0 93 0.129032258 , 0.161290323 , 0.193548387 , 0.225806452 ,
jmpin 5:afd67e985df0 94 0.258064516 , 0.290322581 , 0.322580645 , 0.35483871 ,
jmpin 5:afd67e985df0 95 0.387096774 , 0.419354839 , 0.451612903 , 0.483870968 ,
jmpin 5:afd67e985df0 96 0.516129032 , 0.548387097 , 0.580645161 , 0.612903226 ,
jmpin 5:afd67e985df0 97 0.64516129 , 0.677419355 , 0.709677419 , 0.741935484 ,
jmpin 5:afd67e985df0 98 0.774193548 , 0.806451613 , 0.838709677 , 0.870967742 ,
jmpin 5:afd67e985df0 99 0.903225806 , 0.935483871 , 0.967741935 , 1
jmpin 5:afd67e985df0 100 };
jmpin 5:afd67e985df0 101
jmpin 7:d4c3260cb092 102 double decayVals5[32] = { //Approaches the sustain amplitude the quickest - corresponds to a decay value of 5
jmpin 7:d4c3260cb092 103 1 , 0.8 , 0.75 , 0.71 ,
jmpin 7:d4c3260cb092 104 0.68 , 0.66 , 0.65 , 0.64 ,
jmpin 7:d4c3260cb092 105 0.635 , 0.63 , 0.625 , 0.62 ,
jmpin 7:d4c3260cb092 106 0.615 , 0.61 , 0.605 , 0.6 ,
jmpin 7:d4c3260cb092 107 0.6 , 0.6 , 0.6 , 0.6 ,
jmpin 7:d4c3260cb092 108 0.6 , 0.6 , 0.6 , 0.6 ,
jmpin 7:d4c3260cb092 109 0.6 , 0.6 , 0.6 , 0.6 ,
jmpin 7:d4c3260cb092 110 0.6 , 0.6 , 0.6 , 0.6
jmpin 7:d4c3260cb092 111 };
jmpin 6:68c6a50e1437 112 double decayVals4[32] = {
jmpin 7:d4c3260cb092 113 1 , 0.93 , 0.86 , 0.8 ,
jmpin 7:d4c3260cb092 114 0.75 , 0.71 , 0.69 , 0.68 ,
jmpin 7:d4c3260cb092 115 0.67 , 0.66 , 0.655 , 0.65 ,
jmpin 7:d4c3260cb092 116 0.645 , 0.64 , 0.635 , 0.63 ,
jmpin 7:d4c3260cb092 117 0.625 , 0.62 , 0.615 , 0.61 ,
jmpin 7:d4c3260cb092 118 0.605 , 0.6 , 0.6 , 0.6 ,
jmpin 7:d4c3260cb092 119 0.6 , 0.6 , 0.6 , 0.6 ,
jmpin 7:d4c3260cb092 120 0.6 , 0.6 , 0.6 , 0.6
jmpin 7:d4c3260cb092 121 };
jmpin 6:68c6a50e1437 122 double decayVals3[32] = {
jmpin 7:d4c3260cb092 123 1 , 0.96 , 0.92 , 0.88 ,
jmpin 7:d4c3260cb092 124 0.85 , 0.82 , 0.79 , 0.76 ,
jmpin 7:d4c3260cb092 125 0.74 , 0.72 , 0.705 , 0.69 ,
jmpin 7:d4c3260cb092 126 0.68 , 0.67 , 0.665 , 0.66 ,
jmpin 7:d4c3260cb092 127 0.655 , 0.65 , 0.645 , 0.64 ,
jmpin 7:d4c3260cb092 128 0.635 , 0.63 , 0.625 , 0.62 ,
jmpin 7:d4c3260cb092 129 0.615 , 0.61 , 0.605 , 0.6 ,
jmpin 7:d4c3260cb092 130 0.6 , 0.6 , 0.6 , 0.6
jmpin 7:d4c3260cb092 131 };
jmpin 6:68c6a50e1437 132 double decayVals2[32] = {
jmpin 7:d4c3260cb092 133 1 , 0.98 , 0.96 , 0.94 ,
jmpin 7:d4c3260cb092 134 0.92 , 0.9 , 0.88 , 0.86 ,
jmpin 7:d4c3260cb092 135 0.84 , 0.82 , 0.8 , 0.79 ,
jmpin 7:d4c3260cb092 136 0.78 , 0.77 , 0.76 , 0.75 ,
jmpin 7:d4c3260cb092 137 0.74 , 0.73 , 0.72 , 0.71 ,
jmpin 7:d4c3260cb092 138 0.7 , 0.69 , 0.68 , 0.67 ,
jmpin 7:d4c3260cb092 139 0.66 , 0.65 , 0.64 , 0.63 ,
jmpin 7:d4c3260cb092 140 0.62 , 0.61 , 0.6 , 0.6
jmpin 7:d4c3260cb092 141 };
jmpin 6:68c6a50e1437 142 double decayVals1[32] = {
jmpin 7:d4c3260cb092 143 1 , 0.987096774 , 0.974193548 , 0.961290323 ,
jmpin 7:d4c3260cb092 144 0.948387097 , 0.935483871 , 0.922580645 , 0.909677419 ,
jmpin 7:d4c3260cb092 145 0.896774194 , 0.883870968 , 0.870967742 , 0.858064516 ,
jmpin 7:d4c3260cb092 146 0.84516129 , 0.832258065 , 0.819354839 , 0.806451613 ,
jmpin 7:d4c3260cb092 147 0.793548387 , 0.780645161 , 0.767741935 , 0.75483871 ,
jmpin 7:d4c3260cb092 148 0.741935484 , 0.729032258 , 0.716129032 , 0.703225806 ,
jmpin 7:d4c3260cb092 149 0.690322581 , 0.677419355 , 0.664516129 , 0.651612903 ,
jmpin 7:d4c3260cb092 150 0.638709677 , 0.625806452 , 0.612903226 , 0.6
jmpin 7:d4c3260cb092 151 };
jmpin 8:f6699fd30737 152
jmpin 8:f6699fd30737 153 double sustainVals5[160];
jmpin 8:f6699fd30737 154 double sustainVals4[160];
jmpin 8:f6699fd30737 155 double sustainVals3[160];
jmpin 8:f6699fd30737 156 double sustainVals2[160];
jmpin 8:f6699fd30737 157 double sustainVals1[160];
jmpin 6:68c6a50e1437 158 double releaseVals5[32] = {
jmpin 9:e4df1a31a098 159 0.6 , 0.3 , 0.15 , 0.1 ,
jmpin 9:e4df1a31a098 160 0.09 , 0.08 , 0.07 , 0.06 ,
jmpin 9:e4df1a31a098 161 0.05 , 0.045 , 0.04 , 0.035 ,
jmpin 9:e4df1a31a098 162 0.03 , 0.025 , 0.02 , 0.015 ,
jmpin 9:e4df1a31a098 163 0.01 , 0.0075 , 0.005 , 0.0025 ,
jmpin 9:e4df1a31a098 164 0 , 0 , 0 , 0 ,
jmpin 9:e4df1a31a098 165 0 , 0 , 0 , 0 ,
jmpin 9:e4df1a31a098 166 0 , 0 , 0 , 0};
jmpin 6:68c6a50e1437 167 double releaseVals4[32] = {
jmpin 9:e4df1a31a098 168 0.6 , 0.45 , 0.3 , 0.2 ,
jmpin 9:e4df1a31a098 169 0.17 , 0.16 , 0.15 , 0.14 ,
jmpin 9:e4df1a31a098 170 0.13 , 0.125 , 0.12 , 0.115 ,
jmpin 9:e4df1a31a098 171 0.11 , 0.105 , 0.1 , 0.095 ,
jmpin 9:e4df1a31a098 172 0.09 , 0.085 , 0.08 , 0.075 ,
jmpin 9:e4df1a31a098 173 0.07 , 0.065 , 0.06 , 0.055 ,
jmpin 9:e4df1a31a098 174 0.05 , 0.045 , 0.04 , 0.035 ,
jmpin 9:e4df1a31a098 175 0.03 , 0.02 , 0.01 , 0};
jmpin 6:68c6a50e1437 176 double releaseVals3[32] = {
jmpin 9:e4df1a31a098 177 0.6 , 0.5 , 0.43 , 0.37 ,
jmpin 9:e4df1a31a098 178 0.32 , 0.28 , 0.26 , 0.24 ,
jmpin 9:e4df1a31a098 179 0.22 , 0.2 , 0.18 , 0.17 ,
jmpin 9:e4df1a31a098 180 0.16 , 0.15 , 0.14 , 0.13 ,
jmpin 9:e4df1a31a098 181 0.12 , 0.11 , 0.1 , 0.09 ,
jmpin 9:e4df1a31a098 182 0.08 , 0.07 , 0.06 , 0.05 ,
jmpin 9:e4df1a31a098 183 0.04 , 0.035 , 0.03 , 0.025 ,
jmpin 9:e4df1a31a098 184 0.02 , 0.015 , 0.01 , 0};
jmpin 6:68c6a50e1437 185 double releaseVals2[32] = {
jmpin 9:e4df1a31a098 186 0.6 , 0.55 , 0.5 , 0.46 ,
jmpin 9:e4df1a31a098 187 0.43 , 0.4 , 0.37 , 0.34 ,
jmpin 9:e4df1a31a098 188 0.32 , 0.3 , 0.28 , 0.26 ,
jmpin 9:e4df1a31a098 189 0.24 , 0.22 , 0.2 , 0.18 ,
jmpin 9:e4df1a31a098 190 0.16 , 0.15 , 0.14 , 0.13 ,
jmpin 9:e4df1a31a098 191 0.12 , 0.11 , 0.1 , 0.09 ,
jmpin 9:e4df1a31a098 192 0.08 , 0.07 , 0.06 , 0.05 ,
jmpin 9:e4df1a31a098 193 0.04 , 0.03 , 0.015 , 0};
jmpin 6:68c6a50e1437 194 double releaseVals1[32] = {
jmpin 9:e4df1a31a098 195 0.6 , 0.580645161 , 0.561290323 , 0.541935484 ,
jmpin 9:e4df1a31a098 196 0.522580645 , 0.503225806 , 0.483870968 , 0.464516129 ,
jmpin 9:e4df1a31a098 197 0.44516129 , 0.425806452 , 0.406451613 , 0.387096774 ,
jmpin 9:e4df1a31a098 198 0.367741935 , 0.348387097 , 0.329032258 , 0.309677419 ,
jmpin 9:e4df1a31a098 199 0.290322581 , 0.270967742 , 0.251612903 , 0.232258065 ,
jmpin 9:e4df1a31a098 200 0.212903226 , 0.193548387 , 0.174193548 , 0.15483871 ,
jmpin 9:e4df1a31a098 201 0.135483871 , 0.116129032 , 0.096774194 , 0.077419355 ,
jmpin 9:e4df1a31a098 202 0.058064516 , 0.038709677 , 0.019354839 , -1.38778E-16};
jmpin 5:afd67e985df0 203
jmpin 6:68c6a50e1437 204 int noteArray[7][7] = { // Array holding different note frequencies
jmpin 6:68c6a50e1437 205 C1 , D1 , E1 , F1 , G1 , A1 , B1 ,
jmpin 6:68c6a50e1437 206 C2 , D2 , E2 , F2 , G2 , A2 , B2,
jmpin 6:68c6a50e1437 207 C3 , D3 , E3 , F3 , G3 , A3 , B2 ,
jmpin 6:68c6a50e1437 208 C4 , D4 , E4 , F4 , G4 , A4 , B4 ,
jmpin 6:68c6a50e1437 209 C5 , D5 , E5 , F5 , G5 , A5 , B5 ,
jmpin 6:68c6a50e1437 210 C6 , D6 , E6 , F6 , G6 , A6 , B6 ,
jmpin 6:68c6a50e1437 211 C7 , D7 , E7 , F7 , G7 , A7 , B7
jmpin 6:68c6a50e1437 212 };
jmpin 5:afd67e985df0 213
jmpin 6:68c6a50e1437 214 void uLCD_Display_Thread(void const *args){
jmpin 6:68c6a50e1437 215 mtx.lock();
jmpin 6:68c6a50e1437 216 uLCD.locate(0,0);
jmpin 10:085c49fe2509 217 uLCD.printf("Shape: %s\r\n",myWave);
jmpin 10:085c49fe2509 218 uLCD.printf("Octave: %i\r\n",currentOctave);
jmpin 10:085c49fe2509 219 uLCD.printf("Attack: %i\r\n",currentAttackVal);
jmpin 10:085c49fe2509 220 uLCD.printf("Decay: %i\r\n",currentDecayVal);
jmpin 10:085c49fe2509 221 uLCD.printf("Sustain: %i\r\n",currentSustainVal);
jmpin 10:085c49fe2509 222 uLCD.printf("Release: %i\r\n",currentReleaseVal);
jmpin 6:68c6a50e1437 223 mtx.unlock();
jmpin 10:085c49fe2509 224 T1hread::wait(250);
jmpin 6:68c6a50e1437 225 }
jmpin 6:68c6a50e1437 226
jmpin 9:e4df1a31a098 227 void clear_Buffer(void){
jmpin 9:e4df1a31a098 228 sampleBuffer.clear();
jmpin 9:e4df1a31a098 229 }
jmpin 9:e4df1a31a098 230
jmpin 6:68c6a50e1437 231 void set_Note_Freq(int frequency){
jmpin 6:68c6a50e1437 232 accumulator_reset();
jmpin 6:68c6a50e1437 233 noteFreq = frequency;
jmpin 6:68c6a50e1437 234 set_Frequency_Tuner();
jmpin 9:e4df1a31a098 235 clear_Buffer();
jmpin 6:68c6a50e1437 236 }
jmpin 6:68c6a50e1437 237
jmpin 6:68c6a50e1437 238 void change_Wave(const WaveType currentWave) {
jmpin 6:68c6a50e1437 239 switch(currentWave) {
jmpin 6:68c6a50e1437 240 case sine:
jmpin 6:68c6a50e1437 241 currentLookupTable = sineTable;
jmpin 6:68c6a50e1437 242 break;
jmpin 6:68c6a50e1437 243 case square:
jmpin 6:68c6a50e1437 244 currentLookupTable = squareTable;
jmpin 6:68c6a50e1437 245 break;
jmpin 6:68c6a50e1437 246 case sawtooth:
jmpin 6:68c6a50e1437 247 currentLookupTable = sawtoothTable;
jmpin 6:68c6a50e1437 248 break;
jmpin 6:68c6a50e1437 249 default:
jmpin 6:68c6a50e1437 250 break;
jmpin 6:68c6a50e1437 251 }
jmpin 6:68c6a50e1437 252 }
jmpin 6:68c6a50e1437 253
jmpin 6:68c6a50e1437 254 void change_Attack_Table(int attackVal)
jmpin 6:68c6a50e1437 255 {
jmpin 6:68c6a50e1437 256 switch(attackVal){
jmpin 6:68c6a50e1437 257 case 5:
jmpin 6:68c6a50e1437 258 currentAttackTable = attackVals5;
jmpin 6:68c6a50e1437 259 break;
jmpin 6:68c6a50e1437 260 case 4:
jmpin 6:68c6a50e1437 261 currentAttackTable = attackVals4;
jmpin 6:68c6a50e1437 262 break;
jmpin 6:68c6a50e1437 263 case 3:
jmpin 6:68c6a50e1437 264 currentAttackTable = attackVals3;
jmpin 6:68c6a50e1437 265 break;
jmpin 6:68c6a50e1437 266 case 2:
jmpin 6:68c6a50e1437 267 currentAttackTable = attackVals2;
jmpin 6:68c6a50e1437 268 break;
jmpin 6:68c6a50e1437 269 case 1:
jmpin 6:68c6a50e1437 270 currentAttackTable = attackVals1;
jmpin 6:68c6a50e1437 271 break;
jmpin 6:68c6a50e1437 272 default:
jmpin 6:68c6a50e1437 273 break;
jmpin 6:68c6a50e1437 274 }
jmpin 6:68c6a50e1437 275 }
jmpin 5:afd67e985df0 276
jmpin 6:68c6a50e1437 277 void change_Decay_Table(int decayVal)
jmpin 6:68c6a50e1437 278 {
jmpin 6:68c6a50e1437 279 switch(decayVal){
jmpin 6:68c6a50e1437 280 case 5:
jmpin 6:68c6a50e1437 281 currentDecayTable = decayVals5;
jmpin 6:68c6a50e1437 282 break;
jmpin 6:68c6a50e1437 283 case 4:
jmpin 6:68c6a50e1437 284 currentDecayTable = decayVals4;
jmpin 6:68c6a50e1437 285 break;
jmpin 6:68c6a50e1437 286 case 3:
jmpin 6:68c6a50e1437 287 currentDecayTable = decayVals3;
jmpin 6:68c6a50e1437 288 break;
jmpin 6:68c6a50e1437 289 case 2:
jmpin 6:68c6a50e1437 290 currentDecayTable = decayVals2;
jmpin 6:68c6a50e1437 291 break;
jmpin 6:68c6a50e1437 292 case 1:
jmpin 6:68c6a50e1437 293 currentDecayTable = decayVals1;
jmpin 6:68c6a50e1437 294 break;
jmpin 6:68c6a50e1437 295 default:
jmpin 6:68c6a50e1437 296 break;
jmpin 6:68c6a50e1437 297 }
jmpin 6:68c6a50e1437 298 }
jmpin 5:afd67e985df0 299
jmpin 6:68c6a50e1437 300 void change_Sustain_Table(int sustainVal)
jmpin 6:68c6a50e1437 301 {
jmpin 6:68c6a50e1437 302 switch(sustainVal){
jmpin 6:68c6a50e1437 303 case 5:
jmpin 7:d4c3260cb092 304 //sustainAmplitude = .8;
jmpin 6:68c6a50e1437 305 currentSustainTable = sustainVals5;
jmpin 6:68c6a50e1437 306 break;
jmpin 6:68c6a50e1437 307 case 4:
jmpin 7:d4c3260cb092 308 //sustainAmplitude = .65;
jmpin 6:68c6a50e1437 309 currentSustainTable = sustainVals4;
jmpin 6:68c6a50e1437 310 break;
jmpin 6:68c6a50e1437 311 case 3:
jmpin 7:d4c3260cb092 312 //sustainAmplitude = .5;
jmpin 6:68c6a50e1437 313 currentSustainTable = sustainVals3;
jmpin 6:68c6a50e1437 314 break;
jmpin 6:68c6a50e1437 315 case 2:
jmpin 7:d4c3260cb092 316 //sustainAmplitude = .35;
jmpin 6:68c6a50e1437 317 currentSustainTable = sustainVals2;
jmpin 6:68c6a50e1437 318 break;
jmpin 6:68c6a50e1437 319 case 1:
jmpin 7:d4c3260cb092 320 //sustainAmplitude = .2;
jmpin 6:68c6a50e1437 321 currentSustainTable = sustainVals1;
jmpin 6:68c6a50e1437 322 break;
jmpin 6:68c6a50e1437 323 default:
jmpin 6:68c6a50e1437 324 break;
jmpin 6:68c6a50e1437 325 }
jmpin 6:68c6a50e1437 326 }
jmpin 6:68c6a50e1437 327
jmpin 6:68c6a50e1437 328 void change_Release_Table(int releaseVal)
jmpin 6:68c6a50e1437 329 {
jmpin 6:68c6a50e1437 330 switch(releaseVal){
jmpin 6:68c6a50e1437 331 case 5:
jmpin 6:68c6a50e1437 332 currentReleaseTable = releaseVals5;
jmpin 6:68c6a50e1437 333 break;
jmpin 6:68c6a50e1437 334 case 4:
jmpin 6:68c6a50e1437 335 currentReleaseTable = releaseVals4;
jmpin 6:68c6a50e1437 336 break;
jmpin 6:68c6a50e1437 337 case 3:
jmpin 6:68c6a50e1437 338 currentReleaseTable = releaseVals3;
jmpin 6:68c6a50e1437 339 break;
jmpin 6:68c6a50e1437 340 case 2:
jmpin 6:68c6a50e1437 341 currentReleaseTable = releaseVals2;
jmpin 6:68c6a50e1437 342 break;
jmpin 6:68c6a50e1437 343 case 1:
jmpin 6:68c6a50e1437 344 currentReleaseTable = releaseVals1;
jmpin 6:68c6a50e1437 345 break;
jmpin 6:68c6a50e1437 346 default:
jmpin 6:68c6a50e1437 347 break;
jmpin 6:68c6a50e1437 348 }
jmpin 6:68c6a50e1437 349 }
jmpin 8:f6699fd30737 350 void initialize_sustainVals()
jmpin 8:f6699fd30737 351 {
jmpin 8:f6699fd30737 352 for(int j = 0; j < 160; j++)
jmpin 8:f6699fd30737 353 {
jmpin 8:f6699fd30737 354 sustainVals5[j] = .6;
jmpin 8:f6699fd30737 355 sustainVals4[j] = .6;
jmpin 8:f6699fd30737 356 sustainVals3[j] = .6;
jmpin 8:f6699fd30737 357 sustainVals2[j] = .6;
jmpin 8:f6699fd30737 358 sustainVals1[j] = .6;
jmpin 8:f6699fd30737 359 }
jmpin 8:f6699fd30737 360 }
jmpin 6:68c6a50e1437 361
jmpin 6:68c6a50e1437 362 void buffer_Samples(void){
jmpin 6:68c6a50e1437 363 for(int j=0;j<num_samples;j++){
jmpin 6:68c6a50e1437 364 accumulator_Increment(); // Increment the phase accumulator
jmpin 6:68c6a50e1437 365 lookupTableIndex = phaseAccumulator >> 24; // Get address into wavetable
jmpin 6:68c6a50e1437 366 sampleBuffer.push_back(currentLookupTable[lookupTableIndex] / 255); // divide by 255 so that we get values between 0 and 1
jmpin 6:68c6a50e1437 367 }
jmpin 6:68c6a50e1437 368 }
jmpin 6:68c6a50e1437 369
jmpin 6:68c6a50e1437 370 void apply_Envelope(void){
jmpin 6:68c6a50e1437 371 int attack_range, decay_range, sustain_range, release_range;
jmpin 6:68c6a50e1437 372 attack_range = sampleBuffer.size() * (1/8); // The attack portion of the waveform will take (1/8) of the note's duration
jmpin 6:68c6a50e1437 373 decay_range = attack_range + (sampleBuffer.size() * (1/8)); // The decay portion of the waveform will take (1/8) of the note's duration
jmpin 6:68c6a50e1437 374 sustain_range = sustain_range + (sampleBuffer.size() * (5/8)); // The sustain portion of the waveform will take (5/8) of the note's duration
jmpin 6:68c6a50e1437 375 release_range = release_range + (sampleBuffer.size() * (1/8)); // The release portion of the waveform will take (1/8) of the note's duration
jmpin 6:68c6a50e1437 376 for(int i = 0; i < attack_range; i++)
jmpin 6:68c6a50e1437 377 {
jmpin 6:68c6a50e1437 378 sampleBuffer[i] = sampleBuffer[i] * currentAttackTable[i];
jmpin 6:68c6a50e1437 379 }
jmpin 6:68c6a50e1437 380 for(int k = attack_range; k < decay_range; k++)
jmpin 6:68c6a50e1437 381 {
jmpin 6:68c6a50e1437 382 sampleBuffer[k] = sampleBuffer[k] * currentDecayTable[k-attack_range];
jmpin 6:68c6a50e1437 383 }
jmpin 6:68c6a50e1437 384 for(int m = decay_range; m < sustain_range; m++)
jmpin 6:68c6a50e1437 385 {
jmpin 6:68c6a50e1437 386 sampleBuffer[m] = sampleBuffer[m] * currentSustainTable[m-decay_range];
jmpin 6:68c6a50e1437 387 }
jmpin 6:68c6a50e1437 388 for(int n = sustain_range; n < release_range; n++)
jmpin 6:68c6a50e1437 389 {
jmpin 6:68c6a50e1437 390 sampleBuffer[n] = sampleBuffer[n] * currentReleaseTable[n-sustain_range];
jmpin 6:68c6a50e1437 391 }
jmpin 6:68c6a50e1437 392 }
jmpin 5:afd67e985df0 393
jmpin 9:e4df1a31a098 394 void generate_sineWave(int frequency)
jmpin 9:e4df1a31a098 395 {
jmpin 9:e4df1a31a098 396 double t = 0;
jmpin 9:e4df1a31a098 397 for(int i = 0; i < 256 ; i++)
jmpin 9:e4df1a31a098 398 {
jmpin 9:e4df1a31a098 399 sampleBuffer.push_back(((sin(2*(PI)*frequency*t)) + 1)/2); // scaled to be a % of maximum output voltage (3.3V)
jmpin 9:e4df1a31a098 400 t = t + timeIncrement; // increment t for calculation of next value in the waveform
jmpin 9:e4df1a31a098 401 }
jmpin 9:e4df1a31a098 402 }
jmpin 9:e4df1a31a098 403
jmpin 9:e4df1a31a098 404 void generate_sawtoothWave(int frequency)
jmpin 9:e4df1a31a098 405 {
jmpin 9:e4df1a31a098 406 double t = 0;
jmpin 9:e4df1a31a098 407 for(int i = 0; i<256 ; i++)
jmpin 9:e4df1a31a098 408 {
jmpin 9:e4df1a31a098 409 sampleBuffer.push_back((2*(t*frequency) - (.5 + (t*frequency)) + 1) / 2);
jmpin 9:e4df1a31a098 410 t = t + timeIncrement; // increment t for calculation of next value in the waveform
jmpin 9:e4df1a31a098 411 }
jmpin 9:e4df1a31a098 412 }
jmpin 9:e4df1a31a098 413
jmpin 9:e4df1a31a098 414 void generate_squareWave(int frequency)
jmpin 9:e4df1a31a098 415 {
jmpin 9:e4df1a31a098 416 double width = (1 / 2 * frequency); //Width of a half period of the square wave
jmpin 9:e4df1a31a098 417 double t = 0;
jmpin 9:e4df1a31a098 418 for(int i = 0; i < 256; i++)
jmpin 9:e4df1a31a098 419 {
jmpin 9:e4df1a31a098 420 if(((int)(t / width) % 2 ) == 0) // Even, write a 1 for the square wave
jmpin 9:e4df1a31a098 421 sampleBuffer.push_back(1.0);
jmpin 9:e4df1a31a098 422 else // Odd, write a 0 for the square wave
jmpin 9:e4df1a31a098 423 sampleBuffer.push_back(0.0);
jmpin 9:e4df1a31a098 424 t = t + timeIncrement; // increment t for calculation of next value in the waveform
jmpin 9:e4df1a31a098 425 }
jmpin 9:e4df1a31a098 426 }
jmpin 9:e4df1a31a098 427
jmpin 9:e4df1a31a098 428 void create_samples(int frequency, WaveType currentWaveType)
jmpin 8:f6699fd30737 429 {
jmpin 8:f6699fd30737 430 switch(currentWaveType){
jmpin 8:f6699fd30737 431 case sine:
jmpin 8:f6699fd30737 432 //Generate sine wave values
jmpin 8:f6699fd30737 433 generate_sineWave(frequency);
jmpin 8:f6699fd30737 434 apply_Envelope();
jmpin 8:f6699fd30737 435 break;
jmpin 8:f6699fd30737 436 case square:
jmpin 8:f6699fd30737 437 //Generate square wave values
jmpin 8:f6699fd30737 438 generate_squareWave(frequency);
jmpin 9:e4df1a31a098 439 //apply_Envelope();
jmpin 8:f6699fd30737 440 break;
jmpin 8:f6699fd30737 441 case sawtooth:
jmpin 8:f6699fd30737 442 //Generate sawtooth wave values
jmpin 8:f6699fd30737 443 generate_sawtoothWave(frequency);
jmpin 9:e4df1a31a098 444 //apply_Envelope();
jmpin 8:f6699fd30737 445 break;
jmpin 8:f6699fd30737 446 default:
jmpin 8:f6699fd30737 447 break;
jmpin 8:f6699fd30737 448 }
jmpin 8:f6699fd30737 449 }
jmpin 5:afd67e985df0 450
jmpin 5:afd67e985df0 451
jmpin 5:afd67e985df0 452
jmpin 8:f6699fd30737 453 void output_samples()
jmpin 8:f6699fd30737 454 {
jmpin 8:f6699fd30737 455 for( int sample = 0; sample < 256; sample++)
jmpin 8:f6699fd30737 456 {
jmpin 8:f6699fd30737 457 synthPin = sampleBuffer[sample];
jmpin 8:f6699fd30737 458 Thread::wait(timeIncrement * 1000);
jmpin 8:f6699fd30737 459 }
jmpin 9:e4df1a31a098 460 }
jmpin 8:f6699fd30737 461
jmpin 8:f6699fd30737 462
jmpin 8:f6699fd30737 463
jmpin 5:afd67e985df0 464
jmpin 0:48311ffdfa96 465 //Interrupt routine to parse message with one new character per serial RX interrupt
jmpin 0:48311ffdfa96 466 void parse_message()
jmpin 0:48311ffdfa96 467 {
jmpin 10:085c49fe2509 468 PC.printf("Parse_message was called");
jmpin 10:085c49fe2509 469 if(Blue.readable())
jmpin 10:085c49fe2509 470 {
jmpin 0:48311ffdfa96 471 keyPress = Blue.getc();
jmpin 0:48311ffdfa96 472 PC.putc(keyPress);
jmpin 10:085c49fe2509 473 readyFlag = false;
jmpin 0:48311ffdfa96 474 PC.printf("\n\r Value of readyFlag is: %i",readyFlag);
jmpin 10:085c49fe2509 475 PC.printf("Value of keyPress is: %c\n\r",keyPress);
jmpin 10:085c49fe2509 476 }
jmpin 0:48311ffdfa96 477 }
jmpin 3:3aba1d783730 478
jmpin 3:3aba1d783730 479
jmpin 3:3aba1d783730 480 /*
jmpin 3:3aba1d783730 481 This function writes which note was just played to a text file on the SDCard.
jmpin 3:3aba1d783730 482 The note played will be encoded in hexadecimal, as well as the octave, Attack Value,
jmpin 3:3aba1d783730 483 Delay Value, Sustain Value, and Release Value. The format of the bits will be as follows:
jmpin 3:3aba1d783730 484 | 3 bits | 3 bits | 3 bits | 3 bits | 3 bits | 3 bits |
jmpin 6:68c6a50e1437 485 | Attack | Decay | Susttain | Release | Octave | Note |
jmpin 3:3aba1d783730 486 For the 3 bits representing note, A will correspond to 1, B to 2, and so on.
jmpin 3:3aba1d783730 487 For example, if the lower 3 bits corresponding to note are 001, then the note is an A.
jmpin 3:3aba1d783730 488
jmpin 3:3aba1d783730 489 @param: The note that is being played/recorded into the text file
jmpin 3:3aba1d783730 490 */
jmpin 3:3aba1d783730 491
jmpin 3:3aba1d783730 492 void write_to_SDCard(char note)
jmpin 3:3aba1d783730 493 {
jmpin 6:68c6a50e1437 494 int AttackBits, SustainBits, DecayBits, ReleaseBits, OctaveBits, NoteBits;
jmpin 2:f06ba516b1ad 495
jmpin 3:3aba1d783730 496 AttackBits = currentAttackVal;
jmpin 6:68c6a50e1437 497 DecayBits = currentDecayVal;
jmpin 3:3aba1d783730 498 SustainBits = currentSustainVal;
jmpin 3:3aba1d783730 499 ReleaseBits = currentReleaseVal;
jmpin 3:3aba1d783730 500 OctaveBits = currentOctave;
jmpin 3:3aba1d783730 501 switch(note){
jmpin 3:3aba1d783730 502 case 'C':
jmpin 3:3aba1d783730 503 NoteBits = 3;
jmpin 3:3aba1d783730 504 break;
jmpin 3:3aba1d783730 505 case 'D':
jmpin 3:3aba1d783730 506 NoteBits = 4;
jmpin 3:3aba1d783730 507 break;
jmpin 3:3aba1d783730 508 case 'E':
jmpin 3:3aba1d783730 509 NoteBits = 5;
jmpin 3:3aba1d783730 510 break;
jmpin 3:3aba1d783730 511 case 'F':
jmpin 3:3aba1d783730 512 NoteBits = 6;
jmpin 3:3aba1d783730 513 break;
jmpin 3:3aba1d783730 514 case 'G':
jmpin 3:3aba1d783730 515 NoteBits = 7;
jmpin 3:3aba1d783730 516 break;
jmpin 3:3aba1d783730 517 case 'A':
jmpin 3:3aba1d783730 518 NoteBits = 1;
jmpin 3:3aba1d783730 519 break;
jmpin 3:3aba1d783730 520 case 'B':
jmpin 3:3aba1d783730 521 NoteBits = 2;
jmpin 3:3aba1d783730 522 break;
jmpin 3:3aba1d783730 523 default:
jmpin 3:3aba1d783730 524 NoteBits = 0;
jmpin 3:3aba1d783730 525 break;
jmpin 3:3aba1d783730 526 }
jmpin 3:3aba1d783730 527 int writeVal;
jmpin 6:68c6a50e1437 528 writeVal = (AttackBits << 15) | (DecayBits << 12) | (SustainBits << 9) | (ReleaseBits << 6) | (OctaveBits << 3) | (NoteBits);
jmpin 3:3aba1d783730 529
jmpin 3:3aba1d783730 530 FILE *fp = fopen("/sd/noteRecords/note_record_01.txt", "w");
jmpin 3:3aba1d783730 531 if(fp == NULL) {
jmpin 3:3aba1d783730 532 error("Could not open file for write\n");
jmpin 3:3aba1d783730 533 }
jmpin 3:3aba1d783730 534 fprintf(fp,"%X\r\n",writeVal); // writes value to the text file in hexadecimal
jmpin 3:3aba1d783730 535 fclose(fp);
jmpin 3:3aba1d783730 536 }
jmpin 3:3aba1d783730 537
jmpin 0:48311ffdfa96 538 int main()
jmpin 0:48311ffdfa96 539 {
jmpin 10:085c49fe2509 540
jmpin 10:085c49fe2509 541 Thread thread1(uLCD_Display_Thread);
jmpin 10:085c49fe2509 542
jmpin 10:085c49fe2509 543 // make directory to hold the record of notes played
jmpin 10:085c49fe2509 544 mkdir("/sd/noteRecords", 0777);
jmpin 3:3aba1d783730 545
jmpin 10:085c49fe2509 546 initialize_sustainVals(); // fill the lookup tables with the sustain values in them
jmpin 3:3aba1d783730 547
jmpin 10:085c49fe2509 548 //attach interrupt function for each new Bluetooth serial character
jmpin 0:48311ffdfa96 549 Blue.attach(&parse_message,Serial::RxIrq);
jmpin 0:48311ffdfa96 550 while(1) {
jmpin 10:085c49fe2509 551 //PC.printf("Main loop reached.");
jmpin 0:48311ffdfa96 552 //check for a new button message ready
jmpin 10:085c49fe2509 553 if((keyPress == 'Z') && (readyFlag)){ // button Z pressed
jmpin 10:085c49fe2509 554 PC.printf("Got a Z");
jmpin 6:68c6a50e1437 555 set_Note_Freq(noteArray[currentOctave-1][0]);
jmpin 9:e4df1a31a098 556 create_samples(noteFreq, myWave);
jmpin 3:3aba1d783730 557 write_to_SDCard('C');
jmpin 10:085c49fe2509 558 readyFlag = true;
jmpin 0:48311ffdfa96 559 // Play note that corresponds to Z
jmpin 0:48311ffdfa96 560 }
jmpin 3:3aba1d783730 561 else if((keyPress == D_NOTE_KEY) && (readyFlag)){ // button X pressed
jmpin 6:68c6a50e1437 562 set_Note_Freq(noteArray[currentOctave-1][1]);
jmpin 9:e4df1a31a098 563 create_samples(noteFreq, myWave);
jmpin 3:3aba1d783730 564 write_to_SDCard('D');
jmpin 4:406f59c6a1a6 565 readyFlag = false;
jmpin 0:48311ffdfa96 566 // Play note that corresponds to X
jmpin 0:48311ffdfa96 567 }
jmpin 3:3aba1d783730 568 else if((keyPress == E_NOTE_KEY) && (readyFlag)){ // button C pressed
jmpin 6:68c6a50e1437 569 set_Note_Freq(noteArray[currentOctave-1][2]);
jmpin 9:e4df1a31a098 570 create_samples(noteFreq, myWave);
jmpin 0:48311ffdfa96 571 // Play note that corresponds to C
jmpin 3:3aba1d783730 572 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 573 write_to_SDCard('E');
jmpin 4:406f59c6a1a6 574 readyFlag = false;
jmpin 3:3aba1d783730 575 }
jmpin 3:3aba1d783730 576 else if((keyPress == F_NOTE_KEY) && (readyFlag)){ // button V pressed
jmpin 6:68c6a50e1437 577 set_Note_Freq(noteArray[currentOctave-1][3]);
jmpin 9:e4df1a31a098 578 create_samples(noteFreq, myWave);
jmpin 0:48311ffdfa96 579 // Play note that corresponds to V
jmpin 3:3aba1d783730 580 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 581 write_to_SDCard('F');
jmpin 4:406f59c6a1a6 582 readyFlag = false;
jmpin 3:3aba1d783730 583 }
jmpin 3:3aba1d783730 584 else if((keyPress == G_NOTE_KEY) && (readyFlag)){ // button B pressed
jmpin 6:68c6a50e1437 585 set_Note_Freq(noteArray[currentOctave-1][4]);
jmpin 9:e4df1a31a098 586 create_samples(noteFreq, myWave);
jmpin 0:48311ffdfa96 587 // Play note that corresponds to B
jmpin 3:3aba1d783730 588 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 589 write_to_SDCard('G');
jmpin 4:406f59c6a1a6 590 readyFlag = false;
jmpin 3:3aba1d783730 591 }
jmpin 3:3aba1d783730 592 else if((keyPress == A_NOTE_KEY) && (readyFlag)){ // button N pressed
jmpin 6:68c6a50e1437 593 set_Note_Freq(noteArray[currentOctave][5]);
jmpin 9:e4df1a31a098 594 create_samples(noteFreq, myWave);
jmpin 0:48311ffdfa96 595 // Play note that corresponds to N
jmpin 3:3aba1d783730 596 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 597 write_to_SDCard('A');
jmpin 4:406f59c6a1a6 598 readyFlag = false;
jmpin 3:3aba1d783730 599 }
jmpin 3:3aba1d783730 600 else if((keyPress == B_NOTE_KEY) && (readyFlag)){ // button M pressed
jmpin 6:68c6a50e1437 601 set_Note_Freq(noteArray[currentOctave][6]);
jmpin 9:e4df1a31a098 602 create_samples(noteFreq, myWave);
jmpin 0:48311ffdfa96 603 // Play note that corresponds to M
jmpin 3:3aba1d783730 604 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 605 write_to_SDCard('B');
jmpin 4:406f59c6a1a6 606 readyFlag = false;
jmpin 3:3aba1d783730 607 }
jmpin 2:f06ba516b1ad 608 else if((keyPress == RAISE_OCTAVE_KEY) && (readyFlag)){ // button O pressed
jmpin 0:48311ffdfa96 609 // Raise an octave
jmpin 6:68c6a50e1437 610 if(currentOctave < 7)
jmpin 2:f06ba516b1ad 611 currentOctave++;
jmpin 4:406f59c6a1a6 612 else
jmpin 4:406f59c6a1a6 613 printf("Cannot raise octave above 7.\r\n");
jmpin 6:68c6a50e1437 614 }
jmpin 2:f06ba516b1ad 615 else if((keyPress == LOWER_OCTAVE_KEY) && (readyFlag)){ // button L pressed
jmpin 2:f06ba516b1ad 616 // Lower an octave
jmpin 4:406f59c6a1a6 617 if(currentOctave > 1)
jmpin 2:f06ba516b1ad 618 currentOctave--;
jmpin 4:406f59c6a1a6 619 else
jmpin 4:406f59c6a1a6 620 printf("Cannot lower octave below 1.\r\n");
jmpin 2:f06ba516b1ad 621 }
jmpin 2:f06ba516b1ad 622 else if((keyPress == RAISE_ATTACK_KEY) && (readyFlag)){ // button Q pressed
jmpin 0:48311ffdfa96 623 // Raise Attack Value
jmpin 6:68c6a50e1437 624 if(currentAttackVal < 5){
jmpin 2:f06ba516b1ad 625 currentAttackVal++;
jmpin 6:68c6a50e1437 626 change_Attack_Table(currentAttackVal);
jmpin 6:68c6a50e1437 627 }
jmpin 4:406f59c6a1a6 628 else
jmpin 4:406f59c6a1a6 629 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 630 }
jmpin 2:f06ba516b1ad 631 else if((keyPress == LOWER_ATTACK_KEY) && (readyFlag)){ // button A pressed
jmpin 0:48311ffdfa96 632 // Lower Attack Value
jmpin 6:68c6a50e1437 633 if(currentAttackVal > 1){
jmpin 2:f06ba516b1ad 634 currentAttackVal--;
jmpin 6:68c6a50e1437 635 change_Attack_Table(currentAttackVal);
jmpin 6:68c6a50e1437 636 }
jmpin 4:406f59c6a1a6 637 else
jmpin 6:68c6a50e1437 638 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 639 }
jmpin 2:f06ba516b1ad 640 else if((keyPress == RAISE_DELAY_KEY) && (readyFlag)){ // button W pressed
jmpin 0:48311ffdfa96 641 // Raise Delay Value
jmpin 6:68c6a50e1437 642 if(currentDecayVal < 5){
jmpin 6:68c6a50e1437 643 currentDecayVal++;
jmpin 6:68c6a50e1437 644 change_Decay_Table(currentDecayVal);
jmpin 6:68c6a50e1437 645 }
jmpin 4:406f59c6a1a6 646 else
jmpin 4:406f59c6a1a6 647 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 648 }
jmpin 2:f06ba516b1ad 649 else if((keyPress == LOWER_DELAY_KEY) && (readyFlag)){ // button S pressed
jmpin 0:48311ffdfa96 650 // Lower Delay Value
jmpin 6:68c6a50e1437 651 if(currentDecayVal > 1){
jmpin 6:68c6a50e1437 652 currentDecayVal--;
jmpin 6:68c6a50e1437 653 change_Decay_Table(currentDecayVal);
jmpin 6:68c6a50e1437 654 }
jmpin 4:406f59c6a1a6 655 else
jmpin 6:68c6a50e1437 656 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 657 }
jmpin 2:f06ba516b1ad 658 else if((keyPress == RAISE_SUSTAIN_KEY) && (readyFlag)){ // button E pressed
jmpin 0:48311ffdfa96 659 // Raise Sustain Value
jmpin 6:68c6a50e1437 660 if(currentSustainVal < 5){
jmpin 2:f06ba516b1ad 661 currentSustainVal++;
jmpin 6:68c6a50e1437 662 change_Sustain_Table(currentSustainVal);
jmpin 6:68c6a50e1437 663 }
jmpin 4:406f59c6a1a6 664 else
jmpin 4:406f59c6a1a6 665 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 666 }
jmpin 2:f06ba516b1ad 667 else if((keyPress == LOWER_SUSTAIN_KEY) && (readyFlag)){ // button D pressed
jmpin 0:48311ffdfa96 668 // Lower Sustain Value
jmpin 6:68c6a50e1437 669 if(currentSustainVal > 1){
jmpin 2:f06ba516b1ad 670 currentSustainVal--;
jmpin 6:68c6a50e1437 671 change_Sustain_Table(currentSustainVal);
jmpin 6:68c6a50e1437 672 }
jmpin 4:406f59c6a1a6 673 else
jmpin 6:68c6a50e1437 674 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 675 }
jmpin 2:f06ba516b1ad 676 else if((keyPress == RAISE_RELEASE_KEY) && (readyFlag)){ // button R pressed
jmpin 0:48311ffdfa96 677 // Raise Release Value
jmpin 6:68c6a50e1437 678 if(currentReleaseVal < 5){
jmpin 2:f06ba516b1ad 679 currentReleaseVal++;
jmpin 6:68c6a50e1437 680 change_Release_Table(currentReleaseVal);
jmpin 6:68c6a50e1437 681 }
jmpin 4:406f59c6a1a6 682 else
jmpin 4:406f59c6a1a6 683 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 684 }
jmpin 2:f06ba516b1ad 685 else if((keyPress == LOWER_RELEASE_KEY) && (readyFlag)){ // button F pressed
jmpin 0:48311ffdfa96 686 // Lower Release Value
jmpin 6:68c6a50e1437 687 if(currentReleaseVal > 1){
jmpin 2:f06ba516b1ad 688 currentReleaseVal--;
jmpin 6:68c6a50e1437 689 change_Release_Table(currentReleaseVal);
jmpin 6:68c6a50e1437 690 }
jmpin 4:406f59c6a1a6 691 else
jmpin 6:68c6a50e1437 692 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 693 }
jmpin 2:f06ba516b1ad 694 else if((keyPress == CHANGE_WAVESHAPE_UP) && (readyFlag)){ // button T pressed
jmpin 2:f06ba516b1ad 695 // Change waveform shape to next waveform type
jmpin 2:f06ba516b1ad 696 switch(myWave){
jmpin 2:f06ba516b1ad 697 case sine:
jmpin 2:f06ba516b1ad 698 myWave = square;
jmpin 6:68c6a50e1437 699 change_Wave(myWave);
jmpin 2:f06ba516b1ad 700 break;
jmpin 2:f06ba516b1ad 701 case square:
jmpin 2:f06ba516b1ad 702 myWave = sawtooth;
jmpin 6:68c6a50e1437 703 change_Wave(myWave);
jmpin 2:f06ba516b1ad 704 break;
jmpin 2:f06ba516b1ad 705 case sawtooth:
jmpin 2:f06ba516b1ad 706 myWave = sine;
jmpin 6:68c6a50e1437 707 change_Wave(myWave);
jmpin 2:f06ba516b1ad 708 break;
jmpin 2:f06ba516b1ad 709 default:
jmpin 2:f06ba516b1ad 710 break;
jmpin 2:f06ba516b1ad 711 }
jmpin 2:f06ba516b1ad 712 }
jmpin 2:f06ba516b1ad 713 else if((keyPress == CHANGE_WAVESHAPE_DOWN) && (readyFlag)){ // button G pressed
jmpin 2:f06ba516b1ad 714 // Change waveform shape to previous waveform type
jmpin 2:f06ba516b1ad 715 switch(myWave){
jmpin 2:f06ba516b1ad 716 case sine:
jmpin 2:f06ba516b1ad 717 myWave = sawtooth;
jmpin 6:68c6a50e1437 718 change_Wave(myWave);
jmpin 2:f06ba516b1ad 719 break;
jmpin 2:f06ba516b1ad 720 case square:
jmpin 2:f06ba516b1ad 721 myWave = sine;
jmpin 6:68c6a50e1437 722 change_Wave(myWave);
jmpin 2:f06ba516b1ad 723 break;
jmpin 2:f06ba516b1ad 724 case sawtooth:
jmpin 2:f06ba516b1ad 725 myWave = square;
jmpin 6:68c6a50e1437 726 change_Wave(myWave);
jmpin 2:f06ba516b1ad 727 break;
jmpin 2:f06ba516b1ad 728 default:
jmpin 2:f06ba516b1ad 729 break;
jmpin 2:f06ba516b1ad 730 }
jmpin 2:f06ba516b1ad 731 }
jmpin 2:f06ba516b1ad 732
jmpin 0:48311ffdfa96 733 //do other tasks in main - interrupts will process button message characters
jmpin 0:48311ffdfa96 734 myled = 1;
jmpin 10:085c49fe2509 735 wait(2);
jmpin 0:48311ffdfa96 736 myled = 0;
jmpin 10:085c49fe2509 737 wait(2);
jmpin 10:085c49fe2509 738 }
jmpin 0:48311ffdfa96 739 }