Bluetooth Enabled Keyboard/Synthesizer for mbed

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

Committer:
jmpin
Date:
Thu Apr 28 22:16:40 2016 +0000
Revision:
8:f6699fd30737
Parent:
7:d4c3260cb092
Child:
9:e4df1a31a098
Waveform generating functions added as well as output function.

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 6:68c6a50e1437 31 int *currentAttackTable; // pointer to the correct attack coefficient table
jmpin 6:68c6a50e1437 32 int *currentDecayTable; // pointer to the correct decay coefficient table
jmpin 6:68c6a50e1437 33 int *currentSustainTable; // pointer to the correct sustain coefficient table
jmpin 6:68c6a50e1437 34 int *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 5:afd67e985df0 159 };
jmpin 6:68c6a50e1437 160 double releaseVals4[32] = {
jmpin 5:afd67e985df0 161 };
jmpin 6:68c6a50e1437 162 double releaseVals3[32] = {
jmpin 5:afd67e985df0 163 };
jmpin 6:68c6a50e1437 164 double releaseVals2[32] = {
jmpin 5:afd67e985df0 165 };
jmpin 6:68c6a50e1437 166 double releaseVals1[32] = {
jmpin 5:afd67e985df0 167 };
jmpin 5:afd67e985df0 168
jmpin 5:afd67e985df0 169 /* Values for the sine wave shaped waveform */
jmpin 6:68c6a50e1437 170 int sineTable[256] = {
jmpin 5:afd67e985df0 171 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,
jmpin 5:afd67e985df0 172 0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
jmpin 5:afd67e985df0 173 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,
jmpin 5:afd67e985df0 174 0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
jmpin 5:afd67e985df0 175 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,
jmpin 5:afd67e985df0 176 0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
jmpin 5:afd67e985df0 177 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,
jmpin 5:afd67e985df0 178 0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 179 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,
jmpin 5:afd67e985df0 180 0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
jmpin 5:afd67e985df0 181 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,
jmpin 5:afd67e985df0 182 0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
jmpin 5:afd67e985df0 183 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,
jmpin 5:afd67e985df0 184 0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
jmpin 5:afd67e985df0 185 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,
jmpin 5:afd67e985df0 186 0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
jmpin 5:afd67e985df0 187 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,
jmpin 5:afd67e985df0 188 0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
jmpin 5:afd67e985df0 189 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,
jmpin 5:afd67e985df0 190 0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
jmpin 5:afd67e985df0 191 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,
jmpin 5:afd67e985df0 192 0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
jmpin 5:afd67e985df0 193 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,
jmpin 5:afd67e985df0 194 0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 195 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
jmpin 5:afd67e985df0 196 0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
jmpin 5:afd67e985df0 197 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,
jmpin 5:afd67e985df0 198 0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
jmpin 5:afd67e985df0 199 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,
jmpin 5:afd67e985df0 200 0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
jmpin 5:afd67e985df0 201 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,
jmpin 5:afd67e985df0 202 0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
jmpin 5:afd67e985df0 203 };
jmpin 5:afd67e985df0 204
jmpin 5:afd67e985df0 205 /* Values for the square shaped waveform */
jmpin 6:68c6a50e1437 206 int squareTable[256] = {
jmpin 5:afd67e985df0 207 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 208 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 209 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 210 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 211 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 212 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 213 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 214 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 215 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 216 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 217 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 218 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 219 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 220 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 221 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 222 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 223 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 224 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 225 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 226 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 227 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 228 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 229 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 230 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 231 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 232 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 233 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 234 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 235 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 236 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 237 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 238 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
jmpin 5:afd67e985df0 239 };
jmpin 5:afd67e985df0 240
jmpin 5:afd67e985df0 241 /* Values for the sawtooth shaped waveform */
jmpin 6:68c6a50e1437 242 int sawtoothTable[256] = {
jmpin 5:afd67e985df0 243 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
jmpin 5:afd67e985df0 244 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
jmpin 5:afd67e985df0 245 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
jmpin 5:afd67e985df0 246 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
jmpin 5:afd67e985df0 247 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
jmpin 5:afd67e985df0 248 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
jmpin 5:afd67e985df0 249 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
jmpin 5:afd67e985df0 250 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
jmpin 5:afd67e985df0 251 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
jmpin 5:afd67e985df0 252 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
jmpin 5:afd67e985df0 253 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
jmpin 5:afd67e985df0 254 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
jmpin 5:afd67e985df0 255 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
jmpin 5:afd67e985df0 256 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
jmpin 5:afd67e985df0 257 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
jmpin 5:afd67e985df0 258 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
jmpin 5:afd67e985df0 259 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
jmpin 5:afd67e985df0 260 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
jmpin 5:afd67e985df0 261 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
jmpin 5:afd67e985df0 262 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
jmpin 5:afd67e985df0 263 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
jmpin 5:afd67e985df0 264 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
jmpin 5:afd67e985df0 265 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,
jmpin 5:afd67e985df0 266 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
jmpin 5:afd67e985df0 267 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
jmpin 5:afd67e985df0 268 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
jmpin 5:afd67e985df0 269 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
jmpin 5:afd67e985df0 270 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
jmpin 5:afd67e985df0 271 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
jmpin 5:afd67e985df0 272 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
jmpin 5:afd67e985df0 273 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
jmpin 5:afd67e985df0 274 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
jmpin 5:afd67e985df0 275 };
jmpin 5:afd67e985df0 276
jmpin 6:68c6a50e1437 277 int noteArray[7][7] = { // Array holding different note frequencies
jmpin 6:68c6a50e1437 278 C1 , D1 , E1 , F1 , G1 , A1 , B1 ,
jmpin 6:68c6a50e1437 279 C2 , D2 , E2 , F2 , G2 , A2 , B2,
jmpin 6:68c6a50e1437 280 C3 , D3 , E3 , F3 , G3 , A3 , B2 ,
jmpin 6:68c6a50e1437 281 C4 , D4 , E4 , F4 , G4 , A4 , B4 ,
jmpin 6:68c6a50e1437 282 C5 , D5 , E5 , F5 , G5 , A5 , B5 ,
jmpin 6:68c6a50e1437 283 C6 , D6 , E6 , F6 , G6 , A6 , B6 ,
jmpin 6:68c6a50e1437 284 C7 , D7 , E7 , F7 , G7 , A7 , B7
jmpin 6:68c6a50e1437 285 };
jmpin 5:afd67e985df0 286
jmpin 6:68c6a50e1437 287 void uLCD_Display_Thread(void const *args){
jmpin 6:68c6a50e1437 288 mtx.lock();
jmpin 6:68c6a50e1437 289 uLCD.locate(0,0);
jmpin 6:68c6a50e1437 290 uLCD.printf("Current Waveform Shape: %s\r\n",myWave);
jmpin 6:68c6a50e1437 291 uLCD.printf("Current Octave: %i\r\n",currentOctave);
jmpin 6:68c6a50e1437 292 uLCD.printf("Current Attack Value: %i\r\n",currentAttackVal);
jmpin 6:68c6a50e1437 293 uLCD.printf("Current Decay Value: %i\r\n",currentDecayVal);
jmpin 6:68c6a50e1437 294 uLCD.printf("Current Sustain Value: %i\r\n",currentSustainVal);
jmpin 6:68c6a50e1437 295 uLCD.printf("Current Release Value: %i\r\n",currentReleaseVal);
jmpin 6:68c6a50e1437 296 mtx.unlock();
jmpin 6:68c6a50e1437 297 Thread::wait(250);
jmpin 6:68c6a50e1437 298 }
jmpin 6:68c6a50e1437 299
jmpin 6:68c6a50e1437 300 void set_Frequency_Tuner(void) {
jmpin 6:68c6a50e1437 301 frequencyTuner = ((((int)noteFreq) * num_samples) *
jmpin 6:68c6a50e1437 302 (shift_factor / sampling_frequency));
jmpin 6:68c6a50e1437 303 }
jmpin 6:68c6a50e1437 304
jmpin 6:68c6a50e1437 305 void accumulator_Increment(void) {
jmpin 6:68c6a50e1437 306 phaseAccumulator += frequencyTuner;
jmpin 6:68c6a50e1437 307 }
jmpin 6:68c6a50e1437 308
jmpin 6:68c6a50e1437 309 void accumulator_reset(void) {
jmpin 6:68c6a50e1437 310 phaseAccumulator = 0;
jmpin 6:68c6a50e1437 311 }
jmpin 6:68c6a50e1437 312
jmpin 6:68c6a50e1437 313 void set_Note_Freq(int frequency){
jmpin 6:68c6a50e1437 314 accumulator_reset();
jmpin 6:68c6a50e1437 315 noteFreq = frequency;
jmpin 6:68c6a50e1437 316 set_Frequency_Tuner();
jmpin 6:68c6a50e1437 317 clear_buffer();
jmpin 6:68c6a50e1437 318 }
jmpin 6:68c6a50e1437 319
jmpin 6:68c6a50e1437 320 void change_Wave(const WaveType currentWave) {
jmpin 6:68c6a50e1437 321 switch(currentWave) {
jmpin 6:68c6a50e1437 322 case sine:
jmpin 6:68c6a50e1437 323 currentLookupTable = sineTable;
jmpin 6:68c6a50e1437 324 break;
jmpin 6:68c6a50e1437 325 case square:
jmpin 6:68c6a50e1437 326 currentLookupTable = squareTable;
jmpin 6:68c6a50e1437 327 break;
jmpin 6:68c6a50e1437 328 case sawtooth:
jmpin 6:68c6a50e1437 329 currentLookupTable = sawtoothTable;
jmpin 6:68c6a50e1437 330 break;
jmpin 6:68c6a50e1437 331 default:
jmpin 6:68c6a50e1437 332 break;
jmpin 6:68c6a50e1437 333 }
jmpin 6:68c6a50e1437 334 }
jmpin 6:68c6a50e1437 335
jmpin 6:68c6a50e1437 336 void change_Attack_Table(int attackVal)
jmpin 6:68c6a50e1437 337 {
jmpin 6:68c6a50e1437 338 switch(attackVal){
jmpin 6:68c6a50e1437 339 case 5:
jmpin 6:68c6a50e1437 340 currentAttackTable = attackVals5;
jmpin 6:68c6a50e1437 341 break;
jmpin 6:68c6a50e1437 342 case 4:
jmpin 6:68c6a50e1437 343 currentAttackTable = attackVals4;
jmpin 6:68c6a50e1437 344 break;
jmpin 6:68c6a50e1437 345 case 3:
jmpin 6:68c6a50e1437 346 currentAttackTable = attackVals3;
jmpin 6:68c6a50e1437 347 break;
jmpin 6:68c6a50e1437 348 case 2:
jmpin 6:68c6a50e1437 349 currentAttackTable = attackVals2;
jmpin 6:68c6a50e1437 350 break;
jmpin 6:68c6a50e1437 351 case 1:
jmpin 6:68c6a50e1437 352 currentAttackTable = attackVals1;
jmpin 6:68c6a50e1437 353 break;
jmpin 6:68c6a50e1437 354 default:
jmpin 6:68c6a50e1437 355 break;
jmpin 6:68c6a50e1437 356 }
jmpin 6:68c6a50e1437 357 }
jmpin 5:afd67e985df0 358
jmpin 6:68c6a50e1437 359 void change_Decay_Table(int decayVal)
jmpin 6:68c6a50e1437 360 {
jmpin 6:68c6a50e1437 361 switch(decayVal){
jmpin 6:68c6a50e1437 362 case 5:
jmpin 6:68c6a50e1437 363 currentDecayTable = decayVals5;
jmpin 6:68c6a50e1437 364 break;
jmpin 6:68c6a50e1437 365 case 4:
jmpin 6:68c6a50e1437 366 currentDecayTable = decayVals4;
jmpin 6:68c6a50e1437 367 break;
jmpin 6:68c6a50e1437 368 case 3:
jmpin 6:68c6a50e1437 369 currentDecayTable = decayVals3;
jmpin 6:68c6a50e1437 370 break;
jmpin 6:68c6a50e1437 371 case 2:
jmpin 6:68c6a50e1437 372 currentDecayTable = decayVals2;
jmpin 6:68c6a50e1437 373 break;
jmpin 6:68c6a50e1437 374 case 1:
jmpin 6:68c6a50e1437 375 currentDecayTable = decayVals1;
jmpin 6:68c6a50e1437 376 break;
jmpin 6:68c6a50e1437 377 default:
jmpin 6:68c6a50e1437 378 break;
jmpin 6:68c6a50e1437 379 }
jmpin 6:68c6a50e1437 380 }
jmpin 5:afd67e985df0 381
jmpin 6:68c6a50e1437 382 void change_Sustain_Table(int sustainVal)
jmpin 6:68c6a50e1437 383 {
jmpin 6:68c6a50e1437 384 switch(sustainVal){
jmpin 6:68c6a50e1437 385 case 5:
jmpin 7:d4c3260cb092 386 //sustainAmplitude = .8;
jmpin 6:68c6a50e1437 387 currentSustainTable = sustainVals5;
jmpin 6:68c6a50e1437 388 break;
jmpin 6:68c6a50e1437 389 case 4:
jmpin 7:d4c3260cb092 390 //sustainAmplitude = .65;
jmpin 6:68c6a50e1437 391 currentSustainTable = sustainVals4;
jmpin 6:68c6a50e1437 392 break;
jmpin 6:68c6a50e1437 393 case 3:
jmpin 7:d4c3260cb092 394 //sustainAmplitude = .5;
jmpin 6:68c6a50e1437 395 currentSustainTable = sustainVals3;
jmpin 6:68c6a50e1437 396 break;
jmpin 6:68c6a50e1437 397 case 2:
jmpin 7:d4c3260cb092 398 //sustainAmplitude = .35;
jmpin 6:68c6a50e1437 399 currentSustainTable = sustainVals2;
jmpin 6:68c6a50e1437 400 break;
jmpin 6:68c6a50e1437 401 case 1:
jmpin 7:d4c3260cb092 402 //sustainAmplitude = .2;
jmpin 6:68c6a50e1437 403 currentSustainTable = sustainVals1;
jmpin 6:68c6a50e1437 404 break;
jmpin 6:68c6a50e1437 405 default:
jmpin 6:68c6a50e1437 406 break;
jmpin 6:68c6a50e1437 407 }
jmpin 6:68c6a50e1437 408 }
jmpin 6:68c6a50e1437 409
jmpin 6:68c6a50e1437 410 void change_Release_Table(int releaseVal)
jmpin 6:68c6a50e1437 411 {
jmpin 6:68c6a50e1437 412 switch(releaseVal){
jmpin 6:68c6a50e1437 413 case 5:
jmpin 6:68c6a50e1437 414 currentReleaseTable = releaseVals5;
jmpin 6:68c6a50e1437 415 break;
jmpin 6:68c6a50e1437 416 case 4:
jmpin 6:68c6a50e1437 417 currentReleaseTable = releaseVals4;
jmpin 6:68c6a50e1437 418 break;
jmpin 6:68c6a50e1437 419 case 3:
jmpin 6:68c6a50e1437 420 currentReleaseTable = releaseVals3;
jmpin 6:68c6a50e1437 421 break;
jmpin 6:68c6a50e1437 422 case 2:
jmpin 6:68c6a50e1437 423 currentReleaseTable = releaseVals2;
jmpin 6:68c6a50e1437 424 break;
jmpin 6:68c6a50e1437 425 case 1:
jmpin 6:68c6a50e1437 426 currentReleaseTable = releaseVals1;
jmpin 6:68c6a50e1437 427 break;
jmpin 6:68c6a50e1437 428 default:
jmpin 6:68c6a50e1437 429 break;
jmpin 6:68c6a50e1437 430 }
jmpin 6:68c6a50e1437 431 }
jmpin 8:f6699fd30737 432 void initialize_sustainVals()
jmpin 8:f6699fd30737 433 {
jmpin 8:f6699fd30737 434 for(int j = 0; j < 160; j++)
jmpin 8:f6699fd30737 435 {
jmpin 8:f6699fd30737 436 sustainVals5[j] = .6;
jmpin 8:f6699fd30737 437 sustainVals4[j] = .6;
jmpin 8:f6699fd30737 438 sustainVals3[j] = .6;
jmpin 8:f6699fd30737 439 sustainVals2[j] = .6;
jmpin 8:f6699fd30737 440 sustainVals1[j] = .6;
jmpin 8:f6699fd30737 441 }
jmpin 8:f6699fd30737 442 }
jmpin 6:68c6a50e1437 443
jmpin 6:68c6a50e1437 444 void clear_Buffer(void){
jmpin 6:68c6a50e1437 445 sampleBuffer.clear();
jmpin 6:68c6a50e1437 446 }
jmpin 6:68c6a50e1437 447
jmpin 6:68c6a50e1437 448 void buffer_Samples(void){
jmpin 6:68c6a50e1437 449 for(int j=0;j<num_samples;j++){
jmpin 6:68c6a50e1437 450 accumulator_Increment(); // Increment the phase accumulator
jmpin 6:68c6a50e1437 451 lookupTableIndex = phaseAccumulator >> 24; // Get address into wavetable
jmpin 6:68c6a50e1437 452 sampleBuffer.push_back(currentLookupTable[lookupTableIndex] / 255); // divide by 255 so that we get values between 0 and 1
jmpin 6:68c6a50e1437 453 }
jmpin 6:68c6a50e1437 454 }
jmpin 6:68c6a50e1437 455
jmpin 6:68c6a50e1437 456 void apply_Envelope(void){
jmpin 6:68c6a50e1437 457 int attack_range, decay_range, sustain_range, release_range;
jmpin 6:68c6a50e1437 458 attack_range = sampleBuffer.size() * (1/8); // The attack portion of the waveform will take (1/8) of the note's duration
jmpin 6:68c6a50e1437 459 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 460 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 461 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 462 for(int i = 0; i < attack_range; i++)
jmpin 6:68c6a50e1437 463 {
jmpin 6:68c6a50e1437 464 sampleBuffer[i] = sampleBuffer[i] * currentAttackTable[i];
jmpin 6:68c6a50e1437 465 }
jmpin 6:68c6a50e1437 466 for(int k = attack_range; k < decay_range; k++)
jmpin 6:68c6a50e1437 467 {
jmpin 6:68c6a50e1437 468 sampleBuffer[k] = sampleBuffer[k] * currentDecayTable[k-attack_range];
jmpin 6:68c6a50e1437 469 }
jmpin 6:68c6a50e1437 470 for(int m = decay_range; m < sustain_range; m++)
jmpin 6:68c6a50e1437 471 {
jmpin 6:68c6a50e1437 472 sampleBuffer[m] = sampleBuffer[m] * currentSustainTable[m-decay_range];
jmpin 6:68c6a50e1437 473 }
jmpin 6:68c6a50e1437 474 for(int n = sustain_range; n < release_range; n++)
jmpin 6:68c6a50e1437 475 {
jmpin 6:68c6a50e1437 476 sampleBuffer[n] = sampleBuffer[n] * currentReleaseTable[n-sustain_range];
jmpin 6:68c6a50e1437 477 }
jmpin 6:68c6a50e1437 478 }
jmpin 5:afd67e985df0 479
jmpin 8:f6699fd30737 480 void create_samples(int frequency, waveType currentWaveType)
jmpin 8:f6699fd30737 481 {
jmpin 8:f6699fd30737 482 switch(currentWaveType){
jmpin 8:f6699fd30737 483 case sine:
jmpin 8:f6699fd30737 484 //Generate sine wave values
jmpin 8:f6699fd30737 485 generate_sineWave(frequency);
jmpin 8:f6699fd30737 486 apply_Envelope();
jmpin 8:f6699fd30737 487 break;
jmpin 8:f6699fd30737 488 case square:
jmpin 8:f6699fd30737 489 //Generate square wave values
jmpin 8:f6699fd30737 490 generate_squareWave(frequency);
jmpin 8:f6699fd30737 491 apply_Envelope();
jmpin 8:f6699fd30737 492 break;
jmpin 8:f6699fd30737 493 case sawtooth:
jmpin 8:f6699fd30737 494 //Generate sawtooth wave values
jmpin 8:f6699fd30737 495 generate_sawtoothWave(frequency);
jmpin 8:f6699fd30737 496 apply_Envelope();
jmpin 8:f6699fd30737 497 break;
jmpin 8:f6699fd30737 498 default:
jmpin 8:f6699fd30737 499 break;
jmpin 8:f6699fd30737 500 }
jmpin 8:f6699fd30737 501 }
jmpin 5:afd67e985df0 502
jmpin 8:f6699fd30737 503 void generate_sineWave(int frequency)
jmpin 8:f6699fd30737 504 {
jmpin 8:f6699fd30737 505 double t = 0;
jmpin 8:f6699fd30737 506 for(i = 0; i < 256 ; i++)
jmpin 8:f6699fd30737 507 {
jmpin 8:f6699fd30737 508 sampleBuffer.push_back(((sin(2*(PI)*frequency*t)) + 1)/2); // scaled to be a % of maximum output voltage (3.3V)
jmpin 8:f6699fd30737 509 t = t + timeIncrement; // increment t for calculation of next value in the waveform
jmpin 8:f6699fd30737 510 }
jmpin 8:f6699fd30737 511 }
jmpin 5:afd67e985df0 512
jmpin 8:f6699fd30737 513 void generate_sawtoothWave(int frequency)
jmpin 8:f6699fd30737 514 {
jmpin 8:f6699fd30737 515 double t = 0;
jmpin 8:f6699fd30737 516 for(i = 0; i<256 ; i++)
jmpin 8:f6699fd30737 517 {
jmpin 8:f6699fd30737 518 sampleBuffer.push_back((2*(t*frequency) - (.5 + (t*frequency)) + 1) / 2);
jmpin 8:f6699fd30737 519 t = t + timeIncrement; // increment t for calculation of next value in the waveform
jmpin 8:f6699fd30737 520 }
jmpin 8:f6699fd30737 521 }
jmpin 5:afd67e985df0 522
jmpin 8:f6699fd30737 523 void generate_squareWave(int frequency)
jmpin 8:f6699fd30737 524 {
jmpin 8:f6699fd30737 525 double width = (1 / 2 * frequency); //Width of a half period of the square wave
jmpin 8:f6699fd30737 526 double t = 0;
jmpin 8:f6699fd30737 527 for(i = 0; i < 256; i++)
jmpin 8:f6699fd30737 528 {
jmpin 8:f6699fd30737 529 if((int)(t / width) % 2 ) == 0) // Even, write a 1 for the square wave
jmpin 8:f6699fd30737 530 sampleBuffer.push_back(1.0);
jmpin 8:f6699fd30737 531 else // Odd, write a 0 for the square wave
jmpin 8:f6699fd30737 532 sampleBuffer.push_back(0.0);
jmpin 8:f6699fd30737 533 t = t + timeIncrement; // increment t for calculation of next value in the waveform
jmpin 8:f6699fd30737 534 }
jmpin 8:f6699fd30737 535 }
jmpin 5:afd67e985df0 536
jmpin 8:f6699fd30737 537 void output_samples()
jmpin 8:f6699fd30737 538 {
jmpin 8:f6699fd30737 539 for( int sample = 0; sample < 256; sample++)
jmpin 8:f6699fd30737 540 {
jmpin 8:f6699fd30737 541 synthPin = sampleBuffer[sample];
jmpin 8:f6699fd30737 542 Thread::wait(timeIncrement * 1000);
jmpin 8:f6699fd30737 543 }
jmpin 8:f6699fd30737 544
jmpin 8:f6699fd30737 545
jmpin 8:f6699fd30737 546
jmpin 5:afd67e985df0 547
jmpin 0:48311ffdfa96 548 //Interrupt routine to parse message with one new character per serial RX interrupt
jmpin 0:48311ffdfa96 549 void parse_message()
jmpin 0:48311ffdfa96 550 {
jmpin 0:48311ffdfa96 551 keyPress = Blue.getc();
jmpin 0:48311ffdfa96 552 PC.putc(keyPress);
jmpin 0:48311ffdfa96 553 readyFlag = true;
jmpin 0:48311ffdfa96 554 PC.printf("\n\r Value of readyFlag is: %i",readyFlag);
jmpin 0:48311ffdfa96 555
jmpin 0:48311ffdfa96 556 //PC.printf("Value of keyPress is: %c\n\r",keyPress);
jmpin 0:48311ffdfa96 557 }
jmpin 3:3aba1d783730 558
jmpin 3:3aba1d783730 559
jmpin 3:3aba1d783730 560 /*
jmpin 3:3aba1d783730 561 This function writes which note was just played to a text file on the SDCard.
jmpin 3:3aba1d783730 562 The note played will be encoded in hexadecimal, as well as the octave, Attack Value,
jmpin 3:3aba1d783730 563 Delay Value, Sustain Value, and Release Value. The format of the bits will be as follows:
jmpin 3:3aba1d783730 564 | 3 bits | 3 bits | 3 bits | 3 bits | 3 bits | 3 bits |
jmpin 6:68c6a50e1437 565 | Attack | Decay | Susttain | Release | Octave | Note |
jmpin 3:3aba1d783730 566 For the 3 bits representing note, A will correspond to 1, B to 2, and so on.
jmpin 3:3aba1d783730 567 For example, if the lower 3 bits corresponding to note are 001, then the note is an A.
jmpin 3:3aba1d783730 568
jmpin 3:3aba1d783730 569 @param: The note that is being played/recorded into the text file
jmpin 3:3aba1d783730 570 */
jmpin 3:3aba1d783730 571
jmpin 3:3aba1d783730 572 void write_to_SDCard(char note)
jmpin 3:3aba1d783730 573 {
jmpin 6:68c6a50e1437 574 int AttackBits, SustainBits, DecayBits, ReleaseBits, OctaveBits, NoteBits;
jmpin 2:f06ba516b1ad 575
jmpin 3:3aba1d783730 576 AttackBits = currentAttackVal;
jmpin 6:68c6a50e1437 577 DecayBits = currentDecayVal;
jmpin 3:3aba1d783730 578 SustainBits = currentSustainVal;
jmpin 3:3aba1d783730 579 ReleaseBits = currentReleaseVal;
jmpin 3:3aba1d783730 580 OctaveBits = currentOctave;
jmpin 3:3aba1d783730 581 switch(note){
jmpin 3:3aba1d783730 582 case 'C':
jmpin 3:3aba1d783730 583 NoteBits = 3;
jmpin 3:3aba1d783730 584 break;
jmpin 3:3aba1d783730 585 case 'D':
jmpin 3:3aba1d783730 586 NoteBits = 4;
jmpin 3:3aba1d783730 587 break;
jmpin 3:3aba1d783730 588 case 'E':
jmpin 3:3aba1d783730 589 NoteBits = 5;
jmpin 3:3aba1d783730 590 break;
jmpin 3:3aba1d783730 591 case 'F':
jmpin 3:3aba1d783730 592 NoteBits = 6;
jmpin 3:3aba1d783730 593 break;
jmpin 3:3aba1d783730 594 case 'G':
jmpin 3:3aba1d783730 595 NoteBits = 7;
jmpin 3:3aba1d783730 596 break;
jmpin 3:3aba1d783730 597 case 'A':
jmpin 3:3aba1d783730 598 NoteBits = 1;
jmpin 3:3aba1d783730 599 break;
jmpin 3:3aba1d783730 600 case 'B':
jmpin 3:3aba1d783730 601 NoteBits = 2;
jmpin 3:3aba1d783730 602 break;
jmpin 3:3aba1d783730 603 default:
jmpin 3:3aba1d783730 604 NoteBits = 0;
jmpin 3:3aba1d783730 605 break;
jmpin 3:3aba1d783730 606 }
jmpin 3:3aba1d783730 607 int writeVal;
jmpin 6:68c6a50e1437 608 writeVal = (AttackBits << 15) | (DecayBits << 12) | (SustainBits << 9) | (ReleaseBits << 6) | (OctaveBits << 3) | (NoteBits);
jmpin 3:3aba1d783730 609
jmpin 3:3aba1d783730 610 FILE *fp = fopen("/sd/noteRecords/note_record_01.txt", "w");
jmpin 3:3aba1d783730 611 if(fp == NULL) {
jmpin 3:3aba1d783730 612 error("Could not open file for write\n");
jmpin 3:3aba1d783730 613 }
jmpin 3:3aba1d783730 614 fprintf(fp,"%X\r\n",writeVal); // writes value to the text file in hexadecimal
jmpin 3:3aba1d783730 615 fclose(fp);
jmpin 3:3aba1d783730 616 }
jmpin 3:3aba1d783730 617
jmpin 0:48311ffdfa96 618 int main()
jmpin 0:48311ffdfa96 619 {
jmpin 3:3aba1d783730 620 // make directory to hold the record of notes played
jmpin 3:3aba1d783730 621 mkdir("/sd/noteRecords", 0777);
jmpin 3:3aba1d783730 622
jmpin 8:f6699fd30737 623 initialize_sustainVals(); // fill the lookup tables with the sustain values in them
jmpin 3:3aba1d783730 624
jmpin 0:48311ffdfa96 625 //attach interrupt function for each new Bluetooth serial character
jmpin 0:48311ffdfa96 626 Blue.attach(&parse_message,Serial::RxIrq);
jmpin 0:48311ffdfa96 627 while(1) {
jmpin 0:48311ffdfa96 628 //check for a new button message ready
jmpin 3:3aba1d783730 629 if((keyPress == C_NOTE_KEY) && (readyFlag)){ // button Z pressed
jmpin 6:68c6a50e1437 630 set_Note_Freq(noteArray[currentOctave-1][0]);
jmpin 8:f6699fd30737 631 create_samples(note_freq, myWave);
jmpin 3:3aba1d783730 632 write_to_SDCard('C');
jmpin 0:48311ffdfa96 633 readyFlag = false;
jmpin 0:48311ffdfa96 634 // Play note that corresponds to Z
jmpin 0:48311ffdfa96 635 }
jmpin 3:3aba1d783730 636 else if((keyPress == D_NOTE_KEY) && (readyFlag)){ // button X pressed
jmpin 6:68c6a50e1437 637 set_Note_Freq(noteArray[currentOctave-1][1]);
jmpin 3:3aba1d783730 638 write_to_SDCard('D');
jmpin 4:406f59c6a1a6 639 readyFlag = false;
jmpin 0:48311ffdfa96 640 // Play note that corresponds to X
jmpin 0:48311ffdfa96 641 }
jmpin 3:3aba1d783730 642 else if((keyPress == E_NOTE_KEY) && (readyFlag)){ // button C pressed
jmpin 6:68c6a50e1437 643 set_Note_Freq(noteArray[currentOctave-1][2]);
jmpin 0:48311ffdfa96 644 // Play note that corresponds to C
jmpin 3:3aba1d783730 645 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 646 write_to_SDCard('E');
jmpin 4:406f59c6a1a6 647 readyFlag = false;
jmpin 3:3aba1d783730 648 }
jmpin 3:3aba1d783730 649 else if((keyPress == F_NOTE_KEY) && (readyFlag)){ // button V pressed
jmpin 6:68c6a50e1437 650 set_Note_Freq(noteArray[currentOctave-1][3]);
jmpin 0:48311ffdfa96 651 // Play note that corresponds to V
jmpin 3:3aba1d783730 652 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 653 write_to_SDCard('F');
jmpin 4:406f59c6a1a6 654 readyFlag = false;
jmpin 3:3aba1d783730 655 }
jmpin 3:3aba1d783730 656 else if((keyPress == G_NOTE_KEY) && (readyFlag)){ // button B pressed
jmpin 6:68c6a50e1437 657 set_Note_Freq(noteArray[currentOctave-1][4]);
jmpin 0:48311ffdfa96 658 // Play note that corresponds to B
jmpin 3:3aba1d783730 659 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 660 write_to_SDCard('G');
jmpin 4:406f59c6a1a6 661 readyFlag = false;
jmpin 3:3aba1d783730 662 }
jmpin 3:3aba1d783730 663 else if((keyPress == A_NOTE_KEY) && (readyFlag)){ // button N pressed
jmpin 6:68c6a50e1437 664 set_Note_Freq(noteArray[currentOctave][5]);
jmpin 6:68c6a50e1437 665 buffer_Samples();
jmpin 0:48311ffdfa96 666 // Play note that corresponds to N
jmpin 3:3aba1d783730 667 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 668 write_to_SDCard('A');
jmpin 4:406f59c6a1a6 669 readyFlag = false;
jmpin 3:3aba1d783730 670 }
jmpin 3:3aba1d783730 671 else if((keyPress == B_NOTE_KEY) && (readyFlag)){ // button M pressed
jmpin 6:68c6a50e1437 672 set_Note_Freq(noteArray[currentOctave][6]);
jmpin 0:48311ffdfa96 673 // Play note that corresponds to M
jmpin 3:3aba1d783730 674 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 675 write_to_SDCard('B');
jmpin 4:406f59c6a1a6 676 readyFlag = false;
jmpin 3:3aba1d783730 677 }
jmpin 2:f06ba516b1ad 678 else if((keyPress == RAISE_OCTAVE_KEY) && (readyFlag)){ // button O pressed
jmpin 0:48311ffdfa96 679 // Raise an octave
jmpin 6:68c6a50e1437 680 if(currentOctave < 7)
jmpin 2:f06ba516b1ad 681 currentOctave++;
jmpin 4:406f59c6a1a6 682 else
jmpin 4:406f59c6a1a6 683 printf("Cannot raise octave above 7.\r\n");
jmpin 6:68c6a50e1437 684 }
jmpin 2:f06ba516b1ad 685 else if((keyPress == LOWER_OCTAVE_KEY) && (readyFlag)){ // button L pressed
jmpin 2:f06ba516b1ad 686 // Lower an octave
jmpin 4:406f59c6a1a6 687 if(currentOctave > 1)
jmpin 2:f06ba516b1ad 688 currentOctave--;
jmpin 4:406f59c6a1a6 689 else
jmpin 4:406f59c6a1a6 690 printf("Cannot lower octave below 1.\r\n");
jmpin 2:f06ba516b1ad 691 }
jmpin 2:f06ba516b1ad 692 else if((keyPress == RAISE_ATTACK_KEY) && (readyFlag)){ // button Q pressed
jmpin 0:48311ffdfa96 693 // Raise Attack Value
jmpin 6:68c6a50e1437 694 if(currentAttackVal < 5){
jmpin 2:f06ba516b1ad 695 currentAttackVal++;
jmpin 6:68c6a50e1437 696 change_Attack_Table(currentAttackVal);
jmpin 6:68c6a50e1437 697 }
jmpin 4:406f59c6a1a6 698 else
jmpin 4:406f59c6a1a6 699 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 700 }
jmpin 2:f06ba516b1ad 701 else if((keyPress == LOWER_ATTACK_KEY) && (readyFlag)){ // button A pressed
jmpin 0:48311ffdfa96 702 // Lower Attack Value
jmpin 6:68c6a50e1437 703 if(currentAttackVal > 1){
jmpin 2:f06ba516b1ad 704 currentAttackVal--;
jmpin 6:68c6a50e1437 705 change_Attack_Table(currentAttackVal);
jmpin 6:68c6a50e1437 706 }
jmpin 4:406f59c6a1a6 707 else
jmpin 6:68c6a50e1437 708 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 709 }
jmpin 2:f06ba516b1ad 710 else if((keyPress == RAISE_DELAY_KEY) && (readyFlag)){ // button W pressed
jmpin 0:48311ffdfa96 711 // Raise Delay Value
jmpin 6:68c6a50e1437 712 if(currentDecayVal < 5){
jmpin 6:68c6a50e1437 713 currentDecayVal++;
jmpin 6:68c6a50e1437 714 change_Decay_Table(currentDecayVal);
jmpin 6:68c6a50e1437 715 }
jmpin 4:406f59c6a1a6 716 else
jmpin 4:406f59c6a1a6 717 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 718 }
jmpin 2:f06ba516b1ad 719 else if((keyPress == LOWER_DELAY_KEY) && (readyFlag)){ // button S pressed
jmpin 0:48311ffdfa96 720 // Lower Delay Value
jmpin 6:68c6a50e1437 721 if(currentDecayVal > 1){
jmpin 6:68c6a50e1437 722 currentDecayVal--;
jmpin 6:68c6a50e1437 723 change_Decay_Table(currentDecayVal);
jmpin 6:68c6a50e1437 724 }
jmpin 4:406f59c6a1a6 725 else
jmpin 6:68c6a50e1437 726 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 727 }
jmpin 2:f06ba516b1ad 728 else if((keyPress == RAISE_SUSTAIN_KEY) && (readyFlag)){ // button E pressed
jmpin 0:48311ffdfa96 729 // Raise Sustain Value
jmpin 6:68c6a50e1437 730 if(currentSustainVal < 5){
jmpin 2:f06ba516b1ad 731 currentSustainVal++;
jmpin 6:68c6a50e1437 732 change_Sustain_Table(currentSustainVal);
jmpin 6:68c6a50e1437 733 }
jmpin 4:406f59c6a1a6 734 else
jmpin 4:406f59c6a1a6 735 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 736 }
jmpin 2:f06ba516b1ad 737 else if((keyPress == LOWER_SUSTAIN_KEY) && (readyFlag)){ // button D pressed
jmpin 0:48311ffdfa96 738 // Lower Sustain Value
jmpin 6:68c6a50e1437 739 if(currentSustainVal > 1){
jmpin 2:f06ba516b1ad 740 currentSustainVal--;
jmpin 6:68c6a50e1437 741 change_Sustain_Table(currentSustainVal);
jmpin 6:68c6a50e1437 742 }
jmpin 4:406f59c6a1a6 743 else
jmpin 6:68c6a50e1437 744 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 745 }
jmpin 2:f06ba516b1ad 746 else if((keyPress == RAISE_RELEASE_KEY) && (readyFlag)){ // button R pressed
jmpin 0:48311ffdfa96 747 // Raise Release Value
jmpin 6:68c6a50e1437 748 if(currentReleaseVal < 5){
jmpin 2:f06ba516b1ad 749 currentReleaseVal++;
jmpin 6:68c6a50e1437 750 change_Release_Table(currentReleaseVal);
jmpin 6:68c6a50e1437 751 }
jmpin 4:406f59c6a1a6 752 else
jmpin 4:406f59c6a1a6 753 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 754 }
jmpin 2:f06ba516b1ad 755 else if((keyPress == LOWER_RELEASE_KEY) && (readyFlag)){ // button F pressed
jmpin 0:48311ffdfa96 756 // Lower Release Value
jmpin 6:68c6a50e1437 757 if(currentReleaseVal > 1){
jmpin 2:f06ba516b1ad 758 currentReleaseVal--;
jmpin 6:68c6a50e1437 759 change_Release_Table(currentReleaseVal);
jmpin 6:68c6a50e1437 760 }
jmpin 4:406f59c6a1a6 761 else
jmpin 6:68c6a50e1437 762 printf("Cannot lower value below 1.\r\n");
jmpin 2:f06ba516b1ad 763 }
jmpin 2:f06ba516b1ad 764 else if((keyPress == CHANGE_WAVESHAPE_UP) && (readyFlag)){ // button T pressed
jmpin 2:f06ba516b1ad 765 // Change waveform shape to next waveform type
jmpin 2:f06ba516b1ad 766 switch(myWave){
jmpin 2:f06ba516b1ad 767 case sine:
jmpin 2:f06ba516b1ad 768 myWave = square;
jmpin 6:68c6a50e1437 769 change_Wave(myWave);
jmpin 2:f06ba516b1ad 770 break;
jmpin 2:f06ba516b1ad 771 case square:
jmpin 2:f06ba516b1ad 772 myWave = sawtooth;
jmpin 6:68c6a50e1437 773 change_Wave(myWave);
jmpin 2:f06ba516b1ad 774 break;
jmpin 2:f06ba516b1ad 775 case sawtooth:
jmpin 2:f06ba516b1ad 776 myWave = sine;
jmpin 6:68c6a50e1437 777 change_Wave(myWave);
jmpin 2:f06ba516b1ad 778 break;
jmpin 2:f06ba516b1ad 779 default:
jmpin 2:f06ba516b1ad 780 break;
jmpin 2:f06ba516b1ad 781 }
jmpin 2:f06ba516b1ad 782 }
jmpin 2:f06ba516b1ad 783 else if((keyPress == CHANGE_WAVESHAPE_DOWN) && (readyFlag)){ // button G pressed
jmpin 2:f06ba516b1ad 784 // Change waveform shape to previous waveform type
jmpin 2:f06ba516b1ad 785 switch(myWave){
jmpin 2:f06ba516b1ad 786 case sine:
jmpin 2:f06ba516b1ad 787 myWave = sawtooth;
jmpin 6:68c6a50e1437 788 change_Wave(myWave);
jmpin 2:f06ba516b1ad 789 break;
jmpin 2:f06ba516b1ad 790 case square:
jmpin 2:f06ba516b1ad 791 myWave = sine;
jmpin 6:68c6a50e1437 792 change_Wave(myWave);
jmpin 2:f06ba516b1ad 793 break;
jmpin 2:f06ba516b1ad 794 case sawtooth:
jmpin 2:f06ba516b1ad 795 myWave = square;
jmpin 6:68c6a50e1437 796 change_Wave(myWave);
jmpin 2:f06ba516b1ad 797 break;
jmpin 2:f06ba516b1ad 798 default:
jmpin 2:f06ba516b1ad 799 break;
jmpin 2:f06ba516b1ad 800 }
jmpin 2:f06ba516b1ad 801 }
jmpin 2:f06ba516b1ad 802
jmpin 0:48311ffdfa96 803 }
jmpin 0:48311ffdfa96 804 //do other tasks in main - interrupts will process button message characters
jmpin 0:48311ffdfa96 805 myled = 1;
jmpin 0:48311ffdfa96 806 wait(0.1);
jmpin 0:48311ffdfa96 807 myled = 0;
jmpin 0:48311ffdfa96 808 wait(0.1);
jmpin 0:48311ffdfa96 809
jmpin 0:48311ffdfa96 810 }