Bluetooth Enabled Keyboard/Synthesizer for mbed

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

Committer:
jmpin
Date:
Thu Apr 28 07:29:08 2016 +0000
Revision:
5:afd67e985df0
Parent:
4:406f59c6a1a6
Child:
6:68c6a50e1437
Added some wave tables for the different types of waves, and added some coefficient matrices used to shape the envelope of the waveform.

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 3:3aba1d783730 3 #include "synthesizer.h"
jmpin 0:48311ffdfa96 4 Serial Blue(p28,p27);
jmpin 0:48311ffdfa96 5 Serial PC(USBTX,USBRX);
jmpin 0:48311ffdfa96 6 DigitalOut myled(LED1);
jmpin 0:48311ffdfa96 7 DigitalOut myled4(LED4);
jmpin 3:3aba1d783730 8
jmpin 3:3aba1d783730 9 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup
jmpin 3:3aba1d783730 10
jmpin 0:48311ffdfa96 11 //global variables for main and interrupt routine
jmpin 0:48311ffdfa96 12 volatile bool readyFlag = true;
jmpin 0:48311ffdfa96 13 volatile char keyPress;
jmpin 3:3aba1d783730 14 WaveType myWave = sine; // default to sine wave
jmpin 3:3aba1d783730 15 volatile int currentOctave = 4; // default to 4 because thats where middle C is
jmpin 3:3aba1d783730 16 volatile int currentAttackVal = 3; // values will range from 1-5, default to 3
jmpin 3:3aba1d783730 17 volatile int currentDelayVal = 3; // values will range from 1-5, default to 3
jmpin 3:3aba1d783730 18 volatile int currentSustainVal = 3; // values will range from 1-5, default to 3
jmpin 3:3aba1d783730 19 volatile int currentReleaseVal = 3; // values will range from 1-5, default to 3
jmpin 5:afd67e985df0 20
jmpin 5:afd67e985df0 21 /* Coefficient Matrices Corresponding to Different Attack Values
jmpin 5:afd67e985df0 22 each matrix is comprised of 32 elements (256/8). The first matrix corresponds
jmpin 5:afd67e985df0 23 to an attack value of 1.
jmpin 5:afd67e985df0 24 */
jmpin 5:afd67e985df0 25
jmpin 5:afd67e985df0 26 const double attackVals5[32] = { //Approaches the maximum amplitude the quickest - corresponds to an attackValue of 5
jmpin 5:afd67e985df0 27 0, 0.275 , 0.55 , 0.7 ,
jmpin 5:afd67e985df0 28 0.8 , 0.85 , 0.9 , 0.91 ,
jmpin 5:afd67e985df0 29 0.92 , 0.93 , 0.939 , 0.948 ,
jmpin 5:afd67e985df0 30 0.956 , 0.963 , 0.969 , 0.974 ,
jmpin 5:afd67e985df0 31 0.978 , 0.982 , 0.986 , 0.989 ,
jmpin 5:afd67e985df0 32 0.991 , 0.992 , 0.993 , 0.994 ,
jmpin 5:afd67e985df0 33 0.995 , 0.996 , 0.997 , 0.998 ,
jmpin 5:afd67e985df0 34 0.9985 , 0.999 , 0.9995 , 1
jmpin 5:afd67e985df0 35 };
jmpin 5:afd67e985df0 36 const double attackVals4[32] = { //Corresponds to an attackValue of 4
jmpin 5:afd67e985df0 37 0 , 0.18 , 0.38 , 0.58 ,
jmpin 5:afd67e985df0 38 0.66 , 0.69 , 0.72 , 0.74 ,
jmpin 5:afd67e985df0 39 0.76 , 0.78 , 0.795 , 0.81 ,
jmpin 5:afd67e985df0 40 0.825 , 0.84 , 0.85 , 0.86 ,
jmpin 5:afd67e985df0 41 0.87 , 0.88 , 0.89 , 0.9 ,
jmpin 5:afd67e985df0 42 0.91 , 0.92 , 0.93 , 0.94 ,
jmpin 5:afd67e985df0 43 0.95 , 0.96 , 0.97 , 0.98 ,
jmpin 5:afd67e985df0 44 0.985 , 0.99 , 0.995 , 1
jmpin 5:afd67e985df0 45 };
jmpin 5:afd67e985df0 46 const double attackVals3[32] = { //Corresponds to an attackValue of 3
jmpin 5:afd67e985df0 47 0 , 0.09 , 0.18 , 0.27 ,
jmpin 5:afd67e985df0 48 0.35 , 0.43 , 0.5 , 0.57 ,
jmpin 5:afd67e985df0 49 0.61 , 0.65 , 0.68 , 0.71 ,
jmpin 5:afd67e985df0 50 0.74 , 0.76 , 0.78 , 0.8 ,
jmpin 5:afd67e985df0 51 0.82 , 0.84 , 0.86 , 0.88 ,
jmpin 5:afd67e985df0 52 0.895 , 0.91 , 0.925 , 0.94 ,
jmpin 5:afd67e985df0 53 0.95 , 0.96 , 0.97 , 0.98 ,
jmpin 5:afd67e985df0 54 0.985 , 0.99 , 0.995 , 1
jmpin 5:afd67e985df0 55 };
jmpin 5:afd67e985df0 56 const double attackVals2[32] = { //Corresponds to an attackValue of 2
jmpin 5:afd67e985df0 57 0 , 0.06 , 0.12 , 0.18 ,
jmpin 5:afd67e985df0 58 0.23 , 0.28 , 0.32 , 0.36 ,
jmpin 5:afd67e985df0 59 0.4 , 0.44 , 0.48 , 0.52 ,
jmpin 5:afd67e985df0 60 0.55 , 0.58 , 0.61 , 0.64 ,
jmpin 5:afd67e985df0 61 0.67 , 0.695 , 0.72 , 0.745 ,
jmpin 5:afd67e985df0 62 0.77 , 0.795 , 0.82 , 0.845 ,
jmpin 5:afd67e985df0 63 0.87 , 0.895 , 0.92 , 0.945 ,
jmpin 5:afd67e985df0 64 0.965 , 0.985 , 0.995 , 1
jmpin 5:afd67e985df0 65 };
jmpin 5:afd67e985df0 66 const double attackVals1[32] = { //Approaches the mamimum amplitude the slowest, in a linear fashion - corresponds to an attackValue of 1
jmpin 5:afd67e985df0 67 0 , 0.032258065 , 0.064516129 , 0.096774194 ,
jmpin 5:afd67e985df0 68 0.129032258 , 0.161290323 , 0.193548387 , 0.225806452 ,
jmpin 5:afd67e985df0 69 0.258064516 , 0.290322581 , 0.322580645 , 0.35483871 ,
jmpin 5:afd67e985df0 70 0.387096774 , 0.419354839 , 0.451612903 , 0.483870968 ,
jmpin 5:afd67e985df0 71 0.516129032 , 0.548387097 , 0.580645161 , 0.612903226 ,
jmpin 5:afd67e985df0 72 0.64516129 , 0.677419355 , 0.709677419 , 0.741935484 ,
jmpin 5:afd67e985df0 73 0.774193548 , 0.806451613 , 0.838709677 , 0.870967742 ,
jmpin 5:afd67e985df0 74 0.903225806 , 0.935483871 , 0.967741935 , 1
jmpin 5:afd67e985df0 75 };
jmpin 5:afd67e985df0 76
jmpin 5:afd67e985df0 77 const double decayVals5[32] = {
jmpin 5:afd67e985df0 78 };
jmpin 5:afd67e985df0 79 const double decayVals4[32] = {
jmpin 5:afd67e985df0 80 };
jmpin 5:afd67e985df0 81 const double decayVals3[32] = {
jmpin 5:afd67e985df0 82 };
jmpin 5:afd67e985df0 83 const double decayVals2[32] = {
jmpin 5:afd67e985df0 84 };
jmpin 5:afd67e985df0 85 const double decayVals1[32] = {
jmpin 5:afd67e985df0 86 };
jmpin 5:afd67e985df0 87 const double sustainVals5[160] = { //Highest level of sustain, the note will cap out at an amplitude of 1 - corresponds to sustain value of 5
jmpin 5:afd67e985df0 88 .8 , .8 , .8 , .8 ,
jmpin 5:afd67e985df0 89 .8 , .8 , .8 , .8 ,
jmpin 5:afd67e985df0 90 .8 , .8 , .8 , .8 ,
jmpin 5:afd67e985df0 91 .8 , .8 , .8 , .8 ,
jmpin 5:afd67e985df0 92 .8 , .8 , .8 , .8 ,
jmpin 5:afd67e985df0 93 .8 , .8 , .8 , .8 ,
jmpin 5:afd67e985df0 94 .8 , .8 , .8 , .8 ,
jmpin 5:afd67e985df0 95 .8 , .8 , .8 , .8
jmpin 5:afd67e985df0 96 };
jmpin 5:afd67e985df0 97 const double sustainVal4[160] = { //Sustain value of 4
jmpin 5:afd67e985df0 98 .65 , .65 , .65 , .65 ,
jmpin 5:afd67e985df0 99 .65 , .65 , .65 , .65 ,
jmpin 5:afd67e985df0 100 .65 , .65 , .65 , .65 ,
jmpin 5:afd67e985df0 101 .65 , .65 , .65 , .65 ,
jmpin 5:afd67e985df0 102 .65 , .65 , .65 , .65 ,
jmpin 5:afd67e985df0 103 .65 , .65 , .65 , .65 ,
jmpin 5:afd67e985df0 104 .65 , .65 , .65 , .65 ,
jmpin 5:afd67e985df0 105 .65 , .65 , .65 , .65
jmpin 5:afd67e985df0 106 };
jmpin 5:afd67e985df0 107 const double sustainVals3[160] = { //Sustain value of 3
jmpin 5:afd67e985df0 108 .5 , .5 , .5 , .5 ,
jmpin 5:afd67e985df0 109 .5 , .5 , .5 , .5 ,
jmpin 5:afd67e985df0 110 .5 , .5 , .5 , .5 ,
jmpin 5:afd67e985df0 111 .5 , .5 , .5 , .5 ,
jmpin 5:afd67e985df0 112 .5 , .5 , .5 , .5 ,
jmpin 5:afd67e985df0 113 .5 , .5 , .5 , .5 ,
jmpin 5:afd67e985df0 114 .5 , .5 , .5 , .5 ,
jmpin 5:afd67e985df0 115 .5 , .5 , .5 , .5
jmpin 5:afd67e985df0 116 };
jmpin 5:afd67e985df0 117 const double sustainVals2[160] = { //Sustain value of 2
jmpin 5:afd67e985df0 118 .35 , .35 , .35 , .35 ,
jmpin 5:afd67e985df0 119 .35 , .35 , .35 , .35 ,
jmpin 5:afd67e985df0 120 .35 , .35 , .35 , .35 ,
jmpin 5:afd67e985df0 121 .35 , .35 , .35 , .35 ,
jmpin 5:afd67e985df0 122 .35 , .35 , .35 , .35 ,
jmpin 5:afd67e985df0 123 .35 , .35 , .35 , .35 ,
jmpin 5:afd67e985df0 124 .35 , .35 , .35 , .35 ,
jmpin 5:afd67e985df0 125 .35 , .35 , .35 , .35
jmpin 5:afd67e985df0 126 };
jmpin 5:afd67e985df0 127 const double sustainVals1[160] = { //Lowest level of sustain, the note will cap at at an amplitude of .2 - corresponds to sustain value of 1
jmpin 5:afd67e985df0 128 .20 , .20 , .20 , .20 ,
jmpin 5:afd67e985df0 129 .20 , .20 , .20 , .20 ,
jmpin 5:afd67e985df0 130 .20 , .20 , .20 , .20 ,
jmpin 5:afd67e985df0 131 .20 , .20 , .20 , .20 ,
jmpin 5:afd67e985df0 132 .20 , .20 , .20 , .20 ,
jmpin 5:afd67e985df0 133 .20 , .20 , .20 , .20 ,
jmpin 5:afd67e985df0 134 .20 , .20 , .20 , .20 ,
jmpin 5:afd67e985df0 135 .20 , .20 , .20 , .20
jmpin 5:afd67e985df0 136 }
jmpin 5:afd67e985df0 137 const double releaseVals5[32] = {
jmpin 5:afd67e985df0 138 };
jmpin 5:afd67e985df0 139 const double releaseVals4[32] = {
jmpin 5:afd67e985df0 140 };
jmpin 5:afd67e985df0 141 const double releaseVals3[32] = {
jmpin 5:afd67e985df0 142 };
jmpin 5:afd67e985df0 143 const double releaseVals2[32] = {
jmpin 5:afd67e985df0 144 };
jmpin 5:afd67e985df0 145 const double releaseVals1[32] = {
jmpin 5:afd67e985df0 146 };
jmpin 5:afd67e985df0 147
jmpin 5:afd67e985df0 148 /* Values for the sine wave shaped waveform */
jmpin 5:afd67e985df0 149 const int sineTable[256] = {
jmpin 5:afd67e985df0 150 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,
jmpin 5:afd67e985df0 151 0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
jmpin 5:afd67e985df0 152 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,
jmpin 5:afd67e985df0 153 0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
jmpin 5:afd67e985df0 154 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,
jmpin 5:afd67e985df0 155 0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
jmpin 5:afd67e985df0 156 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,
jmpin 5:afd67e985df0 157 0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 158 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,
jmpin 5:afd67e985df0 159 0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
jmpin 5:afd67e985df0 160 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,
jmpin 5:afd67e985df0 161 0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
jmpin 5:afd67e985df0 162 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,
jmpin 5:afd67e985df0 163 0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
jmpin 5:afd67e985df0 164 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,
jmpin 5:afd67e985df0 165 0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
jmpin 5:afd67e985df0 166 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,
jmpin 5:afd67e985df0 167 0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
jmpin 5:afd67e985df0 168 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,
jmpin 5:afd67e985df0 169 0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
jmpin 5:afd67e985df0 170 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,
jmpin 5:afd67e985df0 171 0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
jmpin 5:afd67e985df0 172 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,
jmpin 5:afd67e985df0 173 0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 174 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
jmpin 5:afd67e985df0 175 0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
jmpin 5:afd67e985df0 176 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,
jmpin 5:afd67e985df0 177 0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
jmpin 5:afd67e985df0 178 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,
jmpin 5:afd67e985df0 179 0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
jmpin 5:afd67e985df0 180 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,
jmpin 5:afd67e985df0 181 0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
jmpin 5:afd67e985df0 182 };
jmpin 5:afd67e985df0 183
jmpin 5:afd67e985df0 184 /* Values for the square shaped waveform */
jmpin 5:afd67e985df0 185 const uint8_t squareTable[256] = {
jmpin 5:afd67e985df0 186 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 187 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 188 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 189 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 190 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 191 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 192 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 193 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 194 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 195 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 196 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 197 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 198 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 199 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 200 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 201 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
jmpin 5:afd67e985df0 202 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 203 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 204 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 205 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 206 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 207 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 208 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 209 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 210 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 211 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 212 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 213 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 214 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 215 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 216 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
jmpin 5:afd67e985df0 217 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
jmpin 5:afd67e985df0 218 };
jmpin 5:afd67e985df0 219
jmpin 5:afd67e985df0 220 /* Values for the sawtooth shaped waveform */
jmpin 5:afd67e985df0 221 const uint8_t sawtoothTable[256] = {
jmpin 5:afd67e985df0 222 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
jmpin 5:afd67e985df0 223 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
jmpin 5:afd67e985df0 224 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
jmpin 5:afd67e985df0 225 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
jmpin 5:afd67e985df0 226 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
jmpin 5:afd67e985df0 227 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
jmpin 5:afd67e985df0 228 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
jmpin 5:afd67e985df0 229 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
jmpin 5:afd67e985df0 230 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
jmpin 5:afd67e985df0 231 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
jmpin 5:afd67e985df0 232 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
jmpin 5:afd67e985df0 233 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
jmpin 5:afd67e985df0 234 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
jmpin 5:afd67e985df0 235 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
jmpin 5:afd67e985df0 236 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
jmpin 5:afd67e985df0 237 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
jmpin 5:afd67e985df0 238 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
jmpin 5:afd67e985df0 239 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
jmpin 5:afd67e985df0 240 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
jmpin 5:afd67e985df0 241 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
jmpin 5:afd67e985df0 242 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
jmpin 5:afd67e985df0 243 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
jmpin 5:afd67e985df0 244 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,
jmpin 5:afd67e985df0 245 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
jmpin 5:afd67e985df0 246 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
jmpin 5:afd67e985df0 247 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
jmpin 5:afd67e985df0 248 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
jmpin 5:afd67e985df0 249 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
jmpin 5:afd67e985df0 250 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
jmpin 5:afd67e985df0 251 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
jmpin 5:afd67e985df0 252 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
jmpin 5:afd67e985df0 253 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
jmpin 5:afd67e985df0 254 };
jmpin 5:afd67e985df0 255
jmpin 5:afd67e985df0 256
jmpin 5:afd67e985df0 257
jmpin 5:afd67e985df0 258
jmpin 5:afd67e985df0 259
jmpin 5:afd67e985df0 260
jmpin 5:afd67e985df0 261
jmpin 5:afd67e985df0 262
jmpin 5:afd67e985df0 263
jmpin 5:afd67e985df0 264
jmpin 5:afd67e985df0 265
jmpin 5:afd67e985df0 266
jmpin 5:afd67e985df0 267
jmpin 5:afd67e985df0 268
jmpin 0:48311ffdfa96 269 //Interrupt routine to parse message with one new character per serial RX interrupt
jmpin 0:48311ffdfa96 270 void parse_message()
jmpin 0:48311ffdfa96 271 {
jmpin 0:48311ffdfa96 272 keyPress = Blue.getc();
jmpin 0:48311ffdfa96 273 PC.putc(keyPress);
jmpin 0:48311ffdfa96 274 readyFlag = true;
jmpin 0:48311ffdfa96 275 PC.printf("\n\r Value of readyFlag is: %i",readyFlag);
jmpin 0:48311ffdfa96 276
jmpin 0:48311ffdfa96 277 //PC.printf("Value of keyPress is: %c\n\r",keyPress);
jmpin 0:48311ffdfa96 278 }
jmpin 3:3aba1d783730 279
jmpin 3:3aba1d783730 280
jmpin 3:3aba1d783730 281 /*
jmpin 3:3aba1d783730 282 This function writes which note was just played to a text file on the SDCard.
jmpin 3:3aba1d783730 283 The note played will be encoded in hexadecimal, as well as the octave, Attack Value,
jmpin 3:3aba1d783730 284 Delay Value, Sustain Value, and Release Value. The format of the bits will be as follows:
jmpin 3:3aba1d783730 285 | 3 bits | 3 bits | 3 bits | 3 bits | 3 bits | 3 bits |
jmpin 3:3aba1d783730 286 | Attack | Delay | Susttain | Release | Octave | Note |
jmpin 3:3aba1d783730 287 For the 3 bits representing note, A will correspond to 1, B to 2, and so on.
jmpin 3:3aba1d783730 288 For example, if the lower 3 bits corresponding to note are 001, then the note is an A.
jmpin 3:3aba1d783730 289
jmpin 3:3aba1d783730 290 @param: The note that is being played/recorded into the text file
jmpin 3:3aba1d783730 291 */
jmpin 3:3aba1d783730 292
jmpin 3:3aba1d783730 293 void write_to_SDCard(char note)
jmpin 3:3aba1d783730 294 {
jmpin 3:3aba1d783730 295 int AttackBits, SustainBits, DelayBits, ReleaseBits, OctaveBits, NoteBits;
jmpin 2:f06ba516b1ad 296
jmpin 3:3aba1d783730 297 AttackBits = currentAttackVal;
jmpin 3:3aba1d783730 298 DelayBits = currentDelayVal;
jmpin 3:3aba1d783730 299 SustainBits = currentSustainVal;
jmpin 3:3aba1d783730 300 ReleaseBits = currentReleaseVal;
jmpin 3:3aba1d783730 301 OctaveBits = currentOctave;
jmpin 3:3aba1d783730 302 switch(note){
jmpin 3:3aba1d783730 303 case 'C':
jmpin 3:3aba1d783730 304 NoteBits = 3;
jmpin 3:3aba1d783730 305 break;
jmpin 3:3aba1d783730 306 case 'D':
jmpin 3:3aba1d783730 307 NoteBits = 4;
jmpin 3:3aba1d783730 308 break;
jmpin 3:3aba1d783730 309 case 'E':
jmpin 3:3aba1d783730 310 NoteBits = 5;
jmpin 3:3aba1d783730 311 break;
jmpin 3:3aba1d783730 312 case 'F':
jmpin 3:3aba1d783730 313 NoteBits = 6;
jmpin 3:3aba1d783730 314 break;
jmpin 3:3aba1d783730 315 case 'G':
jmpin 3:3aba1d783730 316 NoteBits = 7;
jmpin 3:3aba1d783730 317 break;
jmpin 3:3aba1d783730 318 case 'A':
jmpin 3:3aba1d783730 319 NoteBits = 1;
jmpin 3:3aba1d783730 320 break;
jmpin 3:3aba1d783730 321 case 'B':
jmpin 3:3aba1d783730 322 NoteBits = 2;
jmpin 3:3aba1d783730 323 break;
jmpin 3:3aba1d783730 324 default:
jmpin 3:3aba1d783730 325 NoteBits = 0;
jmpin 3:3aba1d783730 326 break;
jmpin 3:3aba1d783730 327 }
jmpin 3:3aba1d783730 328 int writeVal;
jmpin 3:3aba1d783730 329 writeVal = (AttackBits << 15) | (DelayBits << 12) | (SustainBits << 9) | (ReleaseBits << 6) | (OctaveBits << 3) | (NoteBits);
jmpin 3:3aba1d783730 330
jmpin 3:3aba1d783730 331 FILE *fp = fopen("/sd/noteRecords/note_record_01.txt", "w");
jmpin 3:3aba1d783730 332 if(fp == NULL) {
jmpin 3:3aba1d783730 333 error("Could not open file for write\n");
jmpin 3:3aba1d783730 334 }
jmpin 3:3aba1d783730 335 fprintf(fp,"%X\r\n",writeVal); // writes value to the text file in hexadecimal
jmpin 3:3aba1d783730 336 fclose(fp);
jmpin 3:3aba1d783730 337 }
jmpin 3:3aba1d783730 338
jmpin 0:48311ffdfa96 339 int main()
jmpin 0:48311ffdfa96 340 {
jmpin 3:3aba1d783730 341 // make directory to hold the record of notes played
jmpin 3:3aba1d783730 342 mkdir("/sd/noteRecords", 0777);
jmpin 3:3aba1d783730 343
jmpin 3:3aba1d783730 344
jmpin 0:48311ffdfa96 345 //attach interrupt function for each new Bluetooth serial character
jmpin 0:48311ffdfa96 346 Blue.attach(&parse_message,Serial::RxIrq);
jmpin 0:48311ffdfa96 347 while(1) {
jmpin 0:48311ffdfa96 348 //check for a new button message ready
jmpin 3:3aba1d783730 349 if((keyPress == C_NOTE_KEY) && (readyFlag)){ // button Z pressed
jmpin 4:406f59c6a1a6 350 PC.printf("Got a Z");
jmpin 3:3aba1d783730 351 write_to_SDCard('C');
jmpin 0:48311ffdfa96 352 readyFlag = false;
jmpin 0:48311ffdfa96 353 // Play note that corresponds to Z
jmpin 0:48311ffdfa96 354 }
jmpin 3:3aba1d783730 355 else if((keyPress == D_NOTE_KEY) && (readyFlag)){ // button X pressed
jmpin 0:48311ffdfa96 356 PC.printf("Got an X");
jmpin 3:3aba1d783730 357 write_to_SDCard('D');
jmpin 4:406f59c6a1a6 358 readyFlag = false;
jmpin 0:48311ffdfa96 359 // Play note that corresponds to X
jmpin 0:48311ffdfa96 360 }
jmpin 3:3aba1d783730 361 else if((keyPress == E_NOTE_KEY) && (readyFlag)){ // button C pressed
jmpin 0:48311ffdfa96 362 // Play note that corresponds to C
jmpin 3:3aba1d783730 363 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 364 write_to_SDCard('E');
jmpin 4:406f59c6a1a6 365 readyFlag = false;
jmpin 3:3aba1d783730 366 }
jmpin 3:3aba1d783730 367 else if((keyPress == F_NOTE_KEY) && (readyFlag)){ // button V pressed
jmpin 0:48311ffdfa96 368 // Play note that corresponds to V
jmpin 3:3aba1d783730 369 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 370 write_to_SDCard('F');
jmpin 4:406f59c6a1a6 371 readyFlag = false;
jmpin 3:3aba1d783730 372 }
jmpin 3:3aba1d783730 373 else if((keyPress == G_NOTE_KEY) && (readyFlag)){ // button B pressed
jmpin 0:48311ffdfa96 374 // Play note that corresponds to B
jmpin 3:3aba1d783730 375 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 376 write_to_SDCard('G');
jmpin 4:406f59c6a1a6 377 readyFlag = false;
jmpin 3:3aba1d783730 378 }
jmpin 3:3aba1d783730 379 else if((keyPress == A_NOTE_KEY) && (readyFlag)){ // button N pressed
jmpin 0:48311ffdfa96 380 // Play note that corresponds to N
jmpin 3:3aba1d783730 381 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 382 write_to_SDCard('A');
jmpin 4:406f59c6a1a6 383 readyFlag = false;
jmpin 3:3aba1d783730 384 }
jmpin 3:3aba1d783730 385 else if((keyPress == B_NOTE_KEY) && (readyFlag)){ // button M pressed
jmpin 0:48311ffdfa96 386 // Play note that corresponds to M
jmpin 3:3aba1d783730 387 // Make note of which note was played in file on SD Card
jmpin 3:3aba1d783730 388 write_to_SDCard('B');
jmpin 4:406f59c6a1a6 389 readyFlag = false;
jmpin 3:3aba1d783730 390 }
jmpin 2:f06ba516b1ad 391 else if((keyPress == RAISE_OCTAVE_KEY) && (readyFlag)){ // button O pressed
jmpin 0:48311ffdfa96 392 // Raise an octave
jmpin 4:406f59c6a1a6 393 if(currentOcatve < 7)
jmpin 2:f06ba516b1ad 394 currentOctave++;
jmpin 2:f06ba516b1ad 395 }
jmpin 4:406f59c6a1a6 396 else
jmpin 4:406f59c6a1a6 397 printf("Cannot raise octave above 7.\r\n");
jmpin 2:f06ba516b1ad 398 else if((keyPress == LOWER_OCTAVE_KEY) && (readyFlag)){ // button L pressed
jmpin 2:f06ba516b1ad 399 // Lower an octave
jmpin 4:406f59c6a1a6 400 if(currentOctave > 1)
jmpin 2:f06ba516b1ad 401 currentOctave--;
jmpin 4:406f59c6a1a6 402 else
jmpin 4:406f59c6a1a6 403 printf("Cannot lower octave below 1.\r\n");
jmpin 2:f06ba516b1ad 404 }
jmpin 2:f06ba516b1ad 405 else if((keyPress == RAISE_ATTACK_KEY) && (readyFlag)){ // button Q pressed
jmpin 0:48311ffdfa96 406 // Raise Attack Value
jmpin 4:406f59c6a1a6 407 if(currentAttackVal < 5)
jmpin 2:f06ba516b1ad 408 currentAttackVal++;
jmpin 4:406f59c6a1a6 409 else
jmpin 4:406f59c6a1a6 410 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 411 }
jmpin 2:f06ba516b1ad 412 else if((keyPress == LOWER_ATTACK_KEY) && (readyFlag)){ // button A pressed
jmpin 0:48311ffdfa96 413 // Lower Attack Value
jmpin 4:406f59c6a1a6 414 if(currentAttackVal > 1)
jmpin 2:f06ba516b1ad 415 currentAttackVal--;
jmpin 4:406f59c6a1a6 416 else
jmpin 4:406f59c6a1a6 417 printf("Cannot lower value below 1.\r\n";
jmpin 2:f06ba516b1ad 418 }
jmpin 2:f06ba516b1ad 419 else if((keyPress == RAISE_DELAY_KEY) && (readyFlag)){ // button W pressed
jmpin 0:48311ffdfa96 420 // Raise Delay Value
jmpin 4:406f59c6a1a6 421 if(currentDelayVal < 5)
jmpin 2:f06ba516b1ad 422 currentDelayVal++;
jmpin 4:406f59c6a1a6 423 else
jmpin 4:406f59c6a1a6 424 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 425 }
jmpin 2:f06ba516b1ad 426 else if((keyPress == LOWER_DELAY_KEY) && (readyFlag)){ // button S pressed
jmpin 0:48311ffdfa96 427 // Lower Delay Value
jmpin 4:406f59c6a1a6 428 if(currentDelayVal > 1)
jmpin 2:f06ba516b1ad 429 currentDelayVal--;
jmpin 4:406f59c6a1a6 430 else
jmpin 4:406f59c6a1a6 431 printf("Cannot lower value below 1.\r\n";
jmpin 2:f06ba516b1ad 432 }
jmpin 2:f06ba516b1ad 433 else if((keyPress == RAISE_SUSTAIN_KEY) && (readyFlag)){ // button E pressed
jmpin 0:48311ffdfa96 434 // Raise Sustain Value
jmpin 4:406f59c6a1a6 435 if(currentSustainVal < 5)
jmpin 2:f06ba516b1ad 436 currentSustainVal++;
jmpin 4:406f59c6a1a6 437 else
jmpin 4:406f59c6a1a6 438 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 439 }
jmpin 2:f06ba516b1ad 440 else if((keyPress == LOWER_SUSTAIN_KEY) && (readyFlag)){ // button D pressed
jmpin 0:48311ffdfa96 441 // Lower Sustain Value
jmpin 4:406f59c6a1a6 442 if(currentSustainVal > 1)
jmpin 2:f06ba516b1ad 443 currentSustainVal--;
jmpin 4:406f59c6a1a6 444 else
jmpin 4:406f59c6a1a6 445 printf("Cannot lower value below 1.\r\n";
jmpin 2:f06ba516b1ad 446 }
jmpin 2:f06ba516b1ad 447 else if((keyPress == RAISE_RELEASE_KEY) && (readyFlag)){ // button R pressed
jmpin 0:48311ffdfa96 448 // Raise Release Value
jmpin 4:406f59c6a1a6 449 if(currentReleaseVal < 5)
jmpin 2:f06ba516b1ad 450 currentReleaseVal++;
jmpin 4:406f59c6a1a6 451 else
jmpin 4:406f59c6a1a6 452 printf("Cannot raise value above 5.\r\n");
jmpin 2:f06ba516b1ad 453 }
jmpin 2:f06ba516b1ad 454 else if((keyPress == LOWER_RELEASE_KEY) && (readyFlag)){ // button F pressed
jmpin 0:48311ffdfa96 455 // Lower Release Value
jmpin 4:406f59c6a1a6 456 if(currentReleaseVal > 1)
jmpin 2:f06ba516b1ad 457 currentReleaseVal--;
jmpin 4:406f59c6a1a6 458 else
jmpin 4:406f59c6a1a6 459 printf("Cannot lower value below 1.\r\n";
jmpin 2:f06ba516b1ad 460 }
jmpin 2:f06ba516b1ad 461 else if((keyPress == CHANGE_WAVESHAPE_UP) && (readyFlag)){ // button T pressed
jmpin 2:f06ba516b1ad 462 // Change waveform shape to next waveform type
jmpin 2:f06ba516b1ad 463 switch(myWave){
jmpin 2:f06ba516b1ad 464 case sine:
jmpin 2:f06ba516b1ad 465 myWave = square;
jmpin 2:f06ba516b1ad 466 break;
jmpin 2:f06ba516b1ad 467 case square:
jmpin 2:f06ba516b1ad 468 myWave = sawtooth;
jmpin 2:f06ba516b1ad 469 break;
jmpin 2:f06ba516b1ad 470 case sawtooth:
jmpin 2:f06ba516b1ad 471 myWave = sine;
jmpin 2:f06ba516b1ad 472 break;
jmpin 2:f06ba516b1ad 473 default:
jmpin 2:f06ba516b1ad 474 break;
jmpin 2:f06ba516b1ad 475 }
jmpin 2:f06ba516b1ad 476 }
jmpin 2:f06ba516b1ad 477 else if((keyPress == CHANGE_WAVESHAPE_DOWN) && (readyFlag)){ // button G pressed
jmpin 2:f06ba516b1ad 478 // Change waveform shape to previous waveform type
jmpin 2:f06ba516b1ad 479 switch(myWave){
jmpin 2:f06ba516b1ad 480 case sine:
jmpin 2:f06ba516b1ad 481 myWave = sawtooth;
jmpin 2:f06ba516b1ad 482 break;
jmpin 2:f06ba516b1ad 483 case square:
jmpin 2:f06ba516b1ad 484 myWave = sine;
jmpin 2:f06ba516b1ad 485 break;
jmpin 2:f06ba516b1ad 486 case sawtooth:
jmpin 2:f06ba516b1ad 487 myWave = square;
jmpin 2:f06ba516b1ad 488 break;
jmpin 2:f06ba516b1ad 489 default:
jmpin 2:f06ba516b1ad 490 break;
jmpin 2:f06ba516b1ad 491 }
jmpin 2:f06ba516b1ad 492 }
jmpin 2:f06ba516b1ad 493
jmpin 0:48311ffdfa96 494 }
jmpin 0:48311ffdfa96 495 //do other tasks in main - interrupts will process button message characters
jmpin 0:48311ffdfa96 496 myled = 1;
jmpin 0:48311ffdfa96 497 wait(0.1);
jmpin 0:48311ffdfa96 498 myled = 0;
jmpin 0:48311ffdfa96 499 wait(0.1);
jmpin 0:48311ffdfa96 500
jmpin 0:48311ffdfa96 501 }