Bust-a-Beat

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

Committer:
javenho14
Date:
Wed Apr 27 01:34:47 2022 +0000
Revision:
2:d4fbe8a6302e
Parent:
0:bdbd3d6fc5d5
Init

Who changed what in which revision?

UserRevisionLine numberNew 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 }