Bust-a-Beat
Dependencies: mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem PinDetect
main.cpp@2:d4fbe8a6302e, 2022-04-27 (annotated)
- Committer:
- javenho14
- Date:
- Wed Apr 27 01:34:47 2022 +0000
- Revision:
- 2:d4fbe8a6302e
- Parent:
- 0:bdbd3d6fc5d5
Init
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbed_official | 0:bdbd3d6fc5d5 | 1 | #include "mbed.h" |
javenho14 | 2:d4fbe8a6302e | 2 | #include "Speaker.h" |
javenho14 | 2:d4fbe8a6302e | 3 | #include "uLCD_4DGL.h" |
mbed_official | 0:bdbd3d6fc5d5 | 4 | #include "SDFileSystem.h" |
javenho14 | 2:d4fbe8a6302e | 5 | #include "PinDetect.h" |
javenho14 | 2:d4fbe8a6302e | 6 | #include "mpr121.h" |
javenho14 | 2:d4fbe8a6302e | 7 | #include "rtos.h" |
javenho14 | 2:d4fbe8a6302e | 8 | #include "wave_player.h" |
javenho14 | 2:d4fbe8a6302e | 9 | #include <algorithm> |
javenho14 | 2:d4fbe8a6302e | 10 | |
javenho14 | 2:d4fbe8a6302e | 11 | //Volume level |
javenho14 | 2:d4fbe8a6302e | 12 | BusOut myleds(LED1, LED2, LED3, LED4); |
javenho14 | 2:d4fbe8a6302e | 13 | |
javenho14 | 2:d4fbe8a6302e | 14 | //Frequency one of song |
javenho14 | 2:d4fbe8a6302e | 15 | Speaker speaker1(p21); |
javenho14 | 2:d4fbe8a6302e | 16 | //Frequency two of song |
javenho14 | 2:d4fbe8a6302e | 17 | Speaker speaker2(p21); |
javenho14 | 2:d4fbe8a6302e | 18 | |
javenho14 | 2:d4fbe8a6302e | 19 | //Help guide recording if recording |
javenho14 | 2:d4fbe8a6302e | 20 | //If not recording then show notes being played |
javenho14 | 2:d4fbe8a6302e | 21 | uLCD_4DGL uLCD(p9, p10, p11); |
javenho14 | 2:d4fbe8a6302e | 22 | |
javenho14 | 2:d4fbe8a6302e | 23 | //Save recording and play recording from |
javenho14 | 2:d4fbe8a6302e | 24 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
javenho14 | 2:d4fbe8a6302e | 25 | |
javenho14 | 2:d4fbe8a6302e | 26 | //Push button to switch instruments |
javenho14 | 2:d4fbe8a6302e | 27 | PinDetect pianoPB(p19); |
javenho14 | 2:d4fbe8a6302e | 28 | PinDetect synthPB(p20); |
javenho14 | 2:d4fbe8a6302e | 29 | PinDetect stringsPB(p16); |
javenho14 | 2:d4fbe8a6302e | 30 | |
javenho14 | 2:d4fbe8a6302e | 31 | //Red LEDs to show current instrument |
javenho14 | 2:d4fbe8a6302e | 32 | BusOut redLEDs(p22, p23, p24); |
javenho14 | 2:d4fbe8a6302e | 33 | |
javenho14 | 2:d4fbe8a6302e | 34 | // ======= INIT FOR TOUCH PAD ======= |
javenho14 | 2:d4fbe8a6302e | 35 | // Create the interrupt receiver object on pin 26 |
javenho14 | 2:d4fbe8a6302e | 36 | InterruptIn interrupt(p26); |
javenho14 | 2:d4fbe8a6302e | 37 | |
javenho14 | 2:d4fbe8a6302e | 38 | // Setup the Serial to the PC for debugging |
javenho14 | 2:d4fbe8a6302e | 39 | Serial pc(USBTX, USBRX); |
javenho14 | 2:d4fbe8a6302e | 40 | |
javenho14 | 2:d4fbe8a6302e | 41 | // Setup the i2c bus on pins 28 and 27 |
javenho14 | 2:d4fbe8a6302e | 42 | I2C i2c(p28, p27); |
javenho14 | 2:d4fbe8a6302e | 43 | |
javenho14 | 2:d4fbe8a6302e | 44 | // Setup the Mpr121: |
javenho14 | 2:d4fbe8a6302e | 45 | // constructor(i2c object, i2c address of the mpr121) |
javenho14 | 2:d4fbe8a6302e | 46 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
javenho14 | 2:d4fbe8a6302e | 47 | // ======= INIT FOR TOUCH PAD ======= |
javenho14 | 2:d4fbe8a6302e | 48 | |
javenho14 | 2:d4fbe8a6302e | 49 | //Bluetooth |
javenho14 | 2:d4fbe8a6302e | 50 | RawSerial bluemod(p13,p14); |
javenho14 | 2:d4fbe8a6302e | 51 | |
javenho14 | 2:d4fbe8a6302e | 52 | //Mutex Locks |
javenho14 | 2:d4fbe8a6302e | 53 | //uLCD |
javenho14 | 2:d4fbe8a6302e | 54 | Mutex stdio_mutex; |
javenho14 | 2:d4fbe8a6302e | 55 | Mutex currState_mutex; |
javenho14 | 2:d4fbe8a6302e | 56 | |
javenho14 | 2:d4fbe8a6302e | 57 | // ===== GLOBAL VARIABLES ====== |
javenho14 | 2:d4fbe8a6302e | 58 | enum instr{PIANO, SYNTH, STRINGS}; |
javenho14 | 2:d4fbe8a6302e | 59 | enum state{STARTING, IDLE, PLAYING, LOADING, SAVING}; |
javenho14 | 2:d4fbe8a6302e | 60 | enum playback{PAUSE, PLAY}; |
javenho14 | 2:d4fbe8a6302e | 61 | |
javenho14 | 2:d4fbe8a6302e | 62 | //Check how many places change state -> be sure to add mutex |
javenho14 | 2:d4fbe8a6302e | 63 | volatile int currInstr = PIANO; |
javenho14 | 2:d4fbe8a6302e | 64 | volatile int currState = STARTING; |
javenho14 | 2:d4fbe8a6302e | 65 | volatile int volume = 0.5; |
javenho14 | 2:d4fbe8a6302e | 66 | volatile int playback = PLAY; |
javenho14 | 2:d4fbe8a6302e | 67 | |
javenho14 | 2:d4fbe8a6302e | 68 | volatile int gridPosX = 0; |
javenho14 | 2:d4fbe8a6302e | 69 | volatile int gridPosY = 0; |
javenho14 | 2:d4fbe8a6302e | 70 | // ===== GLOBAL VARIABLES ====== |
javenho14 | 2:d4fbe8a6302e | 71 | |
javenho14 | 2:d4fbe8a6302e | 72 | void fallInterrupt() { |
javenho14 | 2:d4fbe8a6302e | 73 | int key_code=0; |
javenho14 | 2:d4fbe8a6302e | 74 | int i=0; |
javenho14 | 2:d4fbe8a6302e | 75 | int value=mpr121.read(0x00); |
javenho14 | 2:d4fbe8a6302e | 76 | value +=mpr121.read(0x01)<<8; |
javenho14 | 2:d4fbe8a6302e | 77 | for (i=0; i<12; i++) { |
javenho14 | 2:d4fbe8a6302e | 78 | if (((value>>i)&0x01)==1) key_code=i+1; |
javenho14 | 2:d4fbe8a6302e | 79 | } |
javenho14 | 2:d4fbe8a6302e | 80 | switch (key_code) { |
javenho14 | 2:d4fbe8a6302e | 81 | case 1: //Right |
javenho14 | 2:d4fbe8a6302e | 82 | gridPosX = std::min(8, gridPosX + 1); |
javenho14 | 2:d4fbe8a6302e | 83 | break; |
javenho14 | 2:d4fbe8a6302e | 84 | case 4: //Up |
javenho14 | 2:d4fbe8a6302e | 85 | gridPosY = std::max(8, gridPosY + 1); |
javenho14 | 2:d4fbe8a6302e | 86 | break; |
javenho14 | 2:d4fbe8a6302e | 87 | case 5: //Select |
javenho14 | 2:d4fbe8a6302e | 88 | break; |
javenho14 | 2:d4fbe8a6302e | 89 | case 6: //Down |
javenho14 | 2:d4fbe8a6302e | 90 | gridPosY = std::min(0, gridPosY - 1); |
javenho14 | 2:d4fbe8a6302e | 91 | break; |
javenho14 | 2:d4fbe8a6302e | 92 | case 9: //Left |
javenho14 | 2:d4fbe8a6302e | 93 | gridPosX = std::min(0, gridPosX - 1); |
javenho14 | 2:d4fbe8a6302e | 94 | break; |
javenho14 | 2:d4fbe8a6302e | 95 | default: |
javenho14 | 2:d4fbe8a6302e | 96 | break; |
javenho14 | 2:d4fbe8a6302e | 97 | } |
javenho14 | 2:d4fbe8a6302e | 98 | } |
javenho14 | 2:d4fbe8a6302e | 99 | |
javenho14 | 2:d4fbe8a6302e | 100 | void piano_hit_callback (void){ |
javenho14 | 2:d4fbe8a6302e | 101 | redLEDs.write(0x04); |
javenho14 | 2:d4fbe8a6302e | 102 | currInstr = PIANO; |
javenho14 | 2:d4fbe8a6302e | 103 | } |
javenho14 | 2:d4fbe8a6302e | 104 | |
javenho14 | 2:d4fbe8a6302e | 105 | void synth_hit_callback (void){ |
javenho14 | 2:d4fbe8a6302e | 106 | redLEDs.write(0x02); |
javenho14 | 2:d4fbe8a6302e | 107 | currInstr = SYNTH; |
javenho14 | 2:d4fbe8a6302e | 108 | } |
javenho14 | 2:d4fbe8a6302e | 109 | |
javenho14 | 2:d4fbe8a6302e | 110 | void strings_hit_callback (void){ |
javenho14 | 2:d4fbe8a6302e | 111 | redLEDs.write(0x01); |
javenho14 | 2:d4fbe8a6302e | 112 | currInstr = STRINGS; |
javenho14 | 2:d4fbe8a6302e | 113 | } |
javenho14 | 2:d4fbe8a6302e | 114 | |
javenho14 | 2:d4fbe8a6302e | 115 | void lcdThread(void const *args) { |
javenho14 | 2:d4fbe8a6302e | 116 | while(1) { |
javenho14 | 2:d4fbe8a6302e | 117 | // switch(currState) { |
javenho14 | 2:d4fbe8a6302e | 118 | // case STARTING: |
javenho14 | 2:d4fbe8a6302e | 119 | // stdio_mutex.lock(); |
javenho14 | 2:d4fbe8a6302e | 120 | // uLCD.text_width(4); |
javenho14 | 2:d4fbe8a6302e | 121 | // uLCD.text_height(4); |
javenho14 | 2:d4fbe8a6302e | 122 | // uLCD.printf("Welcome to\n"); |
javenho14 | 2:d4fbe8a6302e | 123 | // uLCD.printf("BUST A BEAT\n"); |
javenho14 | 2:d4fbe8a6302e | 124 | // stdio_mutex.unlock(); |
javenho14 | 2:d4fbe8a6302e | 125 | // break; |
javenho14 | 2:d4fbe8a6302e | 126 | // case IDLE: |
javenho14 | 2:d4fbe8a6302e | 127 | // break; |
javenho14 | 2:d4fbe8a6302e | 128 | // case PLAYING: |
javenho14 | 2:d4fbe8a6302e | 129 | // break; |
javenho14 | 2:d4fbe8a6302e | 130 | // case LOADING: |
javenho14 | 2:d4fbe8a6302e | 131 | // break; |
javenho14 | 2:d4fbe8a6302e | 132 | // case SAVING: |
javenho14 | 2:d4fbe8a6302e | 133 | // break; |
javenho14 | 2:d4fbe8a6302e | 134 | // } |
javenho14 | 2:d4fbe8a6302e | 135 | Thread::wait(1000.0*0.2); |
javenho14 | 2:d4fbe8a6302e | 136 | } |
javenho14 | 2:d4fbe8a6302e | 137 | } |
javenho14 | 2:d4fbe8a6302e | 138 | |
javenho14 | 2:d4fbe8a6302e | 139 | void beatThread(void const *args) { |
javenho14 | 2:d4fbe8a6302e | 140 | while(1) { |
javenho14 | 2:d4fbe8a6302e | 141 | // if (currState == PLAYING) { |
javenho14 | 2:d4fbe8a6302e | 142 | // |
javenho14 | 2:d4fbe8a6302e | 143 | // } |
javenho14 | 2:d4fbe8a6302e | 144 | Thread::wait(1000.0*0.2); |
javenho14 | 2:d4fbe8a6302e | 145 | } |
javenho14 | 2:d4fbe8a6302e | 146 | } |
javenho14 | 2:d4fbe8a6302e | 147 | |
javenho14 | 2:d4fbe8a6302e | 148 | void noteThread(void const *args) { |
javenho14 | 2:d4fbe8a6302e | 149 | while(1) { |
javenho14 | 2:d4fbe8a6302e | 150 | if (currState == PLAYING) { |
javenho14 | 2:d4fbe8a6302e | 151 | |
javenho14 | 2:d4fbe8a6302e | 152 | } |
javenho14 | 2:d4fbe8a6302e | 153 | Thread::wait(1000.0*0.2); |
javenho14 | 2:d4fbe8a6302e | 154 | } |
javenho14 | 2:d4fbe8a6302e | 155 | } |
javenho14 | 2:d4fbe8a6302e | 156 | |
javenho14 | 2:d4fbe8a6302e | 157 | void blueToothThread(void const *args) { |
javenho14 | 2:d4fbe8a6302e | 158 | char bnum=0; |
javenho14 | 2:d4fbe8a6302e | 159 | char bhit=0; |
javenho14 | 2:d4fbe8a6302e | 160 | while(1) { |
javenho14 | 2:d4fbe8a6302e | 161 | if (bluemod.getc()=='!') { |
javenho14 | 2:d4fbe8a6302e | 162 | if (bluemod.getc()=='B') { //color data packet |
javenho14 | 2:d4fbe8a6302e | 163 | bnum = bluemod.getc(); //button number |
javenho14 | 2:d4fbe8a6302e | 164 | bhit = bluemod.getc(); //1=hit, 0=release |
javenho14 | 2:d4fbe8a6302e | 165 | if (bluemod.getc()==char(~('!' + 'B' + bnum + bhit))) { |
javenho14 | 2:d4fbe8a6302e | 166 | switch (bnum) { |
javenho14 | 2:d4fbe8a6302e | 167 | case '1': //Playback Start |
javenho14 | 2:d4fbe8a6302e | 168 | playback = PLAY; |
javenho14 | 2:d4fbe8a6302e | 169 | break; |
javenho14 | 2:d4fbe8a6302e | 170 | case '2': //Playback Stop |
javenho14 | 2:d4fbe8a6302e | 171 | playback = PAUSE; |
javenho14 | 2:d4fbe8a6302e | 172 | break; |
javenho14 | 2:d4fbe8a6302e | 173 | case '3': //Save recording |
javenho14 | 2:d4fbe8a6302e | 174 | currState = SAVING; |
javenho14 | 2:d4fbe8a6302e | 175 | break; |
javenho14 | 2:d4fbe8a6302e | 176 | case '4': //Load recording |
javenho14 | 2:d4fbe8a6302e | 177 | currState = LOADING; |
javenho14 | 2:d4fbe8a6302e | 178 | break; |
javenho14 | 2:d4fbe8a6302e | 179 | case '5': //Volume Up |
javenho14 | 2:d4fbe8a6302e | 180 | volume = std::min(1.0, volume + 0.1); |
javenho14 | 2:d4fbe8a6302e | 181 | break; |
javenho14 | 2:d4fbe8a6302e | 182 | case '6': //Volume Down |
javenho14 | 2:d4fbe8a6302e | 183 | volume = std::max(0.0, volume - 0.1); |
javenho14 | 2:d4fbe8a6302e | 184 | break; |
javenho14 | 2:d4fbe8a6302e | 185 | default: |
javenho14 | 2:d4fbe8a6302e | 186 | break; |
javenho14 | 2:d4fbe8a6302e | 187 | } |
javenho14 | 2:d4fbe8a6302e | 188 | } |
javenho14 | 2:d4fbe8a6302e | 189 | } |
javenho14 | 2:d4fbe8a6302e | 190 | } |
javenho14 | 2:d4fbe8a6302e | 191 | if (volume >= 1) { |
javenho14 | 2:d4fbe8a6302e | 192 | myleds.write(0x0F); |
javenho14 | 2:d4fbe8a6302e | 193 | } else if (volume >= 0.75) { |
javenho14 | 2:d4fbe8a6302e | 194 | myleds.write(0x07); |
javenho14 | 2:d4fbe8a6302e | 195 | } else if (volume >= 0.50) { |
javenho14 | 2:d4fbe8a6302e | 196 | myleds.write(0x03); |
javenho14 | 2:d4fbe8a6302e | 197 | } else if (volume >= 0.25) { |
javenho14 | 2:d4fbe8a6302e | 198 | myleds.write(0x01); |
javenho14 | 2:d4fbe8a6302e | 199 | } else { |
javenho14 | 2:d4fbe8a6302e | 200 | myleds.write(0x00); |
javenho14 | 2:d4fbe8a6302e | 201 | } |
javenho14 | 2:d4fbe8a6302e | 202 | myleds.write(0x0F); |
javenho14 | 2:d4fbe8a6302e | 203 | Thread::wait(1000.0*0.2); |
javenho14 | 2:d4fbe8a6302e | 204 | } |
javenho14 | 2:d4fbe8a6302e | 205 | } |
javenho14 | 2:d4fbe8a6302e | 206 | |
javenho14 | 2:d4fbe8a6302e | 207 | void init() { |
javenho14 | 2:d4fbe8a6302e | 208 | pianoPB.mode(PullUp); |
javenho14 | 2:d4fbe8a6302e | 209 | synthPB.mode(PullUp); |
javenho14 | 2:d4fbe8a6302e | 210 | stringsPB.mode(PullUp); |
javenho14 | 2:d4fbe8a6302e | 211 | interrupt.mode(PullUp); |
javenho14 | 2:d4fbe8a6302e | 212 | wait(0.01); |
javenho14 | 2:d4fbe8a6302e | 213 | pc.printf("I am here\n"); |
javenho14 | 2:d4fbe8a6302e | 214 | pianoPB.attach_deasserted(&piano_hit_callback); |
javenho14 | 2:d4fbe8a6302e | 215 | synthPB.attach_deasserted(&synth_hit_callback); |
javenho14 | 2:d4fbe8a6302e | 216 | stringsPB.attach_deasserted(&strings_hit_callback); |
javenho14 | 2:d4fbe8a6302e | 217 | interrupt.fall(&fallInterrupt); |
mbed_official | 0:bdbd3d6fc5d5 | 218 | |
javenho14 | 2:d4fbe8a6302e | 219 | pianoPB.setSampleFrequency(); |
javenho14 | 2:d4fbe8a6302e | 220 | synthPB.setSampleFrequency(); |
javenho14 | 2:d4fbe8a6302e | 221 | stringsPB.setSampleFrequency(); |
javenho14 | 2:d4fbe8a6302e | 222 | |
javenho14 | 2:d4fbe8a6302e | 223 | Thread thread2(lcdThread); |
javenho14 | 2:d4fbe8a6302e | 224 | Thread thread3(beatThread); |
javenho14 | 2:d4fbe8a6302e | 225 | Thread thread4(noteThread); |
javenho14 | 2:d4fbe8a6302e | 226 | Thread thread5(blueToothThread); |
javenho14 | 2:d4fbe8a6302e | 227 | } |
javenho14 | 2:d4fbe8a6302e | 228 | |
javenho14 | 2:d4fbe8a6302e | 229 | int main() { |
javenho14 | 2:d4fbe8a6302e | 230 | init(); |
javenho14 | 2:d4fbe8a6302e | 231 | //Touchpad |
javenho14 | 2:d4fbe8a6302e | 232 | currState = IDLE; |
javenho14 | 2:d4fbe8a6302e | 233 | while(1) { |
javenho14 | 2:d4fbe8a6302e | 234 | wait(0.2); |
mbed_official | 0:bdbd3d6fc5d5 | 235 | } |
javenho14 | 2:d4fbe8a6302e | 236 | } |