ECE4180 Drum Auto-Transcription Project
Dependencies: FatFileSystemCpp mbed
Fork of MSCUsbHost by
main.cpp@4:904fd1d62e04, 2012-10-11 (annotated)
- Committer:
- M_quettan
- Date:
- Thu Oct 11 18:28:04 2012 +0000
- Revision:
- 4:904fd1d62e04
- Parent:
- 0:e294af8d0e07
ECE4180 Drum Auto-Transcription Project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
M_quettan | 4:904fd1d62e04 | 1 | //**************************************************************************** |
M_quettan | 4:904fd1d62e04 | 2 | // Zak Gamache and Marcus Quettan |
M_quettan | 4:904fd1d62e04 | 3 | // |
M_quettan | 4:904fd1d62e04 | 4 | //Drum Machine |
M_quettan | 4:904fd1d62e04 | 5 | // - Write tablature based on input from user playing on a drum pad |
M_quettan | 4:904fd1d62e04 | 6 | // - Playback sound relating to user input |
M_quettan | 4:904fd1d62e04 | 7 | //**************************************************************************** |
M_quettan | 4:904fd1d62e04 | 8 | |
igorsk | 0:e294af8d0e07 | 9 | #include "mbed.h" |
igorsk | 0:e294af8d0e07 | 10 | #include "MSCFileSystem.h" |
igorsk | 0:e294af8d0e07 | 11 | |
igorsk | 0:e294af8d0e07 | 12 | #define FSNAME "msc" |
igorsk | 0:e294af8d0e07 | 13 | MSCFileSystem msc(FSNAME); |
igorsk | 0:e294af8d0e07 | 14 | |
M_quettan | 4:904fd1d62e04 | 15 | // Unused AnalogIn inputs set as DigitalIn to reduce A/D noise |
M_quettan | 4:904fd1d62e04 | 16 | DigitalOut noise1(p16); |
M_quettan | 4:904fd1d62e04 | 17 | DigitalOut noise2(p17); |
M_quettan | 4:904fd1d62e04 | 18 | DigitalOut noise3(p18); |
M_quettan | 4:904fd1d62e04 | 19 | DigitalOut noise4(p19); |
M_quettan | 4:904fd1d62e04 | 20 | DigitalOut noise5(p20); |
M_quettan | 4:904fd1d62e04 | 21 | |
M_quettan | 4:904fd1d62e04 | 22 | DigitalOut led1(LED1); // Hit strength level 1 |
M_quettan | 4:904fd1d62e04 | 23 | DigitalOut led2(LED2); // Hit strength level 2 |
M_quettan | 4:904fd1d62e04 | 24 | DigitalOut led3(LED3); // Hit strength level 3 |
M_quettan | 4:904fd1d62e04 | 25 | DigitalOut led4(LED4); // Hit strength level 4 |
M_quettan | 4:904fd1d62e04 | 26 | |
M_quettan | 4:904fd1d62e04 | 27 | DigitalIn write(p8); // USB Write Control: Push - Stop Write |
M_quettan | 4:904fd1d62e04 | 28 | DigitalIn sound(p9); // Switch to enable playback of sound |
M_quettan | 4:904fd1d62e04 | 29 | PwmOut driver(p26); // PWM to control sound volume |
M_quettan | 4:904fd1d62e04 | 30 | AnalogIn piezo(p15); // Input from vibration sensor |
M_quettan | 4:904fd1d62e04 | 31 | Serial pc(USBTX, USBRX); // mbed Serial over USB |
M_quettan | 4:904fd1d62e04 | 32 | Ticker PrintMe; // Used to print tablature at a regular interval |
M_quettan | 4:904fd1d62e04 | 33 | |
M_quettan | 4:904fd1d62e04 | 34 | int flag; // Hit tracker: 1 - Hit, 0 - No hit |
M_quettan | 4:904fd1d62e04 | 35 | int count = 0; // Separates time frames |
M_quettan | 4:904fd1d62e04 | 36 | float voltage; // Voltage from piezoelectric vibration sensor |
M_quettan | 4:904fd1d62e04 | 37 | int writeNow = 0; // Write every so often |
M_quettan | 4:904fd1d62e04 | 38 | |
M_quettan | 4:904fd1d62e04 | 39 | |
M_quettan | 4:904fd1d62e04 | 40 | // File I/O for tablature |
M_quettan | 4:904fd1d62e04 | 41 | FILE *tabFile = fopen( "/" FSNAME "/tablature.txt", "w"); |
M_quettan | 4:904fd1d62e04 | 42 | |
M_quettan | 4:904fd1d62e04 | 43 | //**************************************************************************** |
M_quettan | 4:904fd1d62e04 | 44 | // Keep (musical) time and tell program to write |
M_quettan | 4:904fd1d62e04 | 45 | //**************************************************************************** |
M_quettan | 4:904fd1d62e04 | 46 | void printNote() |
M_quettan | 4:904fd1d62e04 | 47 | { |
M_quettan | 4:904fd1d62e04 | 48 | // Tell the program to write |
M_quettan | 4:904fd1d62e04 | 49 | writeNow = 1; |
M_quettan | 4:904fd1d62e04 | 50 | } |
M_quettan | 4:904fd1d62e04 | 51 | |
M_quettan | 4:904fd1d62e04 | 52 | //**************************************************************************** |
M_quettan | 4:904fd1d62e04 | 53 | // Main Program |
M_quettan | 4:904fd1d62e04 | 54 | // - Continuously read vibration sensor and scale to a hit strength |
M_quettan | 4:904fd1d62e04 | 55 | // - Call ticker actions at a regular interval |
M_quettan | 4:904fd1d62e04 | 56 | //**************************************************************************** |
igorsk | 0:e294af8d0e07 | 57 | int main() |
igorsk | 0:e294af8d0e07 | 58 | { |
M_quettan | 4:904fd1d62e04 | 59 | // Flash lights and print error if file not opened |
M_quettan | 4:904fd1d62e04 | 60 | if ( tabFile == NULL ) { |
M_quettan | 4:904fd1d62e04 | 61 | error("Could not open file for write\n"); |
M_quettan | 4:904fd1d62e04 | 62 | } |
M_quettan | 4:904fd1d62e04 | 63 | |
M_quettan | 4:904fd1d62e04 | 64 | // Setup pullup resistor for sound switch |
M_quettan | 4:904fd1d62e04 | 65 | sound.mode(PullUp); |
M_quettan | 4:904fd1d62e04 | 66 | write.mode(PullUp); |
M_quettan | 4:904fd1d62e04 | 67 | wait(0.01); |
M_quettan | 4:904fd1d62e04 | 68 | |
M_quettan | 4:904fd1d62e04 | 69 | // Print to the tablature every half second (slow quarter note) |
M_quettan | 4:904fd1d62e04 | 70 | PrintMe.attach(&printNote, 0.50); |
M_quettan | 4:904fd1d62e04 | 71 | |
M_quettan | 4:904fd1d62e04 | 72 | // Run forever |
M_quettan | 4:904fd1d62e04 | 73 | while(1) { |
M_quettan | 4:904fd1d62e04 | 74 | // On switch toggle |
M_quettan | 4:904fd1d62e04 | 75 | if (!write) { |
M_quettan | 4:904fd1d62e04 | 76 | fclose(tabFile); // Close file |
M_quettan | 4:904fd1d62e04 | 77 | tabFile = NULL; // Set file pointer to null |
M_quettan | 4:904fd1d62e04 | 78 | pc.printf("Exit"); // Alert user to exit |
M_quettan | 4:904fd1d62e04 | 79 | break; |
M_quettan | 4:904fd1d62e04 | 80 | } |
M_quettan | 4:904fd1d62e04 | 81 | voltage = piezo; |
M_quettan | 4:904fd1d62e04 | 82 | |
M_quettan | 4:904fd1d62e04 | 83 | // 1 - Softest Hit |
M_quettan | 4:904fd1d62e04 | 84 | if ((voltage >= 0.495 && voltage < 0.515)) { |
M_quettan | 4:904fd1d62e04 | 85 | if(flag < 2) { |
M_quettan | 4:904fd1d62e04 | 86 | flag = 1; |
M_quettan | 4:904fd1d62e04 | 87 | } |
M_quettan | 4:904fd1d62e04 | 88 | led1 = 1; |
M_quettan | 4:904fd1d62e04 | 89 | } |
M_quettan | 4:904fd1d62e04 | 90 | // 2 - Soft Hit |
M_quettan | 4:904fd1d62e04 | 91 | else if ((voltage >= 0.515 && voltage < 0.530)) { |
M_quettan | 4:904fd1d62e04 | 92 | if (flag < 3) { |
M_quettan | 4:904fd1d62e04 | 93 | flag = 2; |
M_quettan | 4:904fd1d62e04 | 94 | } |
M_quettan | 4:904fd1d62e04 | 95 | led2 = 1; |
M_quettan | 4:904fd1d62e04 | 96 | } |
M_quettan | 4:904fd1d62e04 | 97 | // 3 - Hard Hit |
M_quettan | 4:904fd1d62e04 | 98 | else if ((voltage >= 0.530 && voltage < 0.550)) { |
M_quettan | 4:904fd1d62e04 | 99 | if(flag < 4) { |
M_quettan | 4:904fd1d62e04 | 100 | flag = 3; |
M_quettan | 4:904fd1d62e04 | 101 | } |
M_quettan | 4:904fd1d62e04 | 102 | led3 = 1; |
M_quettan | 4:904fd1d62e04 | 103 | } |
M_quettan | 4:904fd1d62e04 | 104 | // 4 - Hardest Hit |
M_quettan | 4:904fd1d62e04 | 105 | else if ((voltage >= 0.550)) { |
M_quettan | 4:904fd1d62e04 | 106 | flag = 4; |
M_quettan | 4:904fd1d62e04 | 107 | led4 = 1; |
M_quettan | 4:904fd1d62e04 | 108 | } |
M_quettan | 4:904fd1d62e04 | 109 | // 0 - No Hit |
M_quettan | 4:904fd1d62e04 | 110 | else { |
M_quettan | 4:904fd1d62e04 | 111 | led1 = 0; |
M_quettan | 4:904fd1d62e04 | 112 | led2 = 0; |
M_quettan | 4:904fd1d62e04 | 113 | led3 = 0; |
M_quettan | 4:904fd1d62e04 | 114 | led4 = 0; |
M_quettan | 4:904fd1d62e04 | 115 | } |
M_quettan | 4:904fd1d62e04 | 116 | |
M_quettan | 4:904fd1d62e04 | 117 | if (writeNow) { |
M_quettan | 4:904fd1d62e04 | 118 | if (tabFile) { |
M_quettan | 4:904fd1d62e04 | 119 | if (count == 0) { |
M_quettan | 4:904fd1d62e04 | 120 | pc.printf("\n\n" |
M_quettan | 4:904fd1d62e04 | 121 | "1 e & a 2 e & a 3 e & a 4 e & a || 1 e & a 2 e & a 3 e & a 4 e & a" |
M_quettan | 4:904fd1d62e04 | 122 | "\n"); |
M_quettan | 4:904fd1d62e04 | 123 | fprintf(tabFile, "\n\n" |
M_quettan | 4:904fd1d62e04 | 124 | "1 e & a 2 e & a 3 e & a 4 e & a || 1 e & a 2 e & a 3 e & a 4 e & a" |
M_quettan | 4:904fd1d62e04 | 125 | "\n", flag); |
M_quettan | 4:904fd1d62e04 | 126 | } |
M_quettan | 4:904fd1d62e04 | 127 | |
M_quettan | 4:904fd1d62e04 | 128 | // If a hit has occurred |
M_quettan | 4:904fd1d62e04 | 129 | if (flag > 0) { |
M_quettan | 4:904fd1d62e04 | 130 | // Print the strength value of the hit to the tablature |
M_quettan | 4:904fd1d62e04 | 131 | if (count == 16) { |
M_quettan | 4:904fd1d62e04 | 132 | pc.printf("|| %i ", flag); |
M_quettan | 4:904fd1d62e04 | 133 | fprintf(tabFile, "|| %i ", flag); |
M_quettan | 4:904fd1d62e04 | 134 | } else { |
M_quettan | 4:904fd1d62e04 | 135 | pc.printf("%i ", flag); |
M_quettan | 4:904fd1d62e04 | 136 | fprintf(tabFile, "%i ", flag); |
M_quettan | 4:904fd1d62e04 | 137 | } |
M_quettan | 4:904fd1d62e04 | 138 | |
M_quettan | 4:904fd1d62e04 | 139 | // Changes sound output pitch based on strenght of hit |
M_quettan | 4:904fd1d62e04 | 140 | if (flag == 1) { |
M_quettan | 4:904fd1d62e04 | 141 | driver.period(0.005); |
M_quettan | 4:904fd1d62e04 | 142 | } else if (flag == 2) { |
M_quettan | 4:904fd1d62e04 | 143 | driver.period(0.0075); |
M_quettan | 4:904fd1d62e04 | 144 | } else if (flag == 3) { |
M_quettan | 4:904fd1d62e04 | 145 | driver.period(0.01); |
M_quettan | 4:904fd1d62e04 | 146 | } else { |
M_quettan | 4:904fd1d62e04 | 147 | driver.period(0.015); |
M_quettan | 4:904fd1d62e04 | 148 | } |
M_quettan | 4:904fd1d62e04 | 149 | |
M_quettan | 4:904fd1d62e04 | 150 | // If sound is enabled, set the volume |
M_quettan | 4:904fd1d62e04 | 151 | if (sound) { |
M_quettan | 4:904fd1d62e04 | 152 | driver = 0.005; |
M_quettan | 4:904fd1d62e04 | 153 | } else { |
M_quettan | 4:904fd1d62e04 | 154 | driver = 0.0; |
M_quettan | 4:904fd1d62e04 | 155 | } |
M_quettan | 4:904fd1d62e04 | 156 | |
M_quettan | 4:904fd1d62e04 | 157 | // Reset hit tracker and time keeper |
M_quettan | 4:904fd1d62e04 | 158 | flag = 0; |
M_quettan | 4:904fd1d62e04 | 159 | count += 1; |
M_quettan | 4:904fd1d62e04 | 160 | // If no hit has occurred |
M_quettan | 4:904fd1d62e04 | 161 | } else { |
M_quettan | 4:904fd1d62e04 | 162 | // Print an empty note to tablature |
M_quettan | 4:904fd1d62e04 | 163 | if (count == 16) { |
M_quettan | 4:904fd1d62e04 | 164 | pc.printf("|| - ", flag); |
M_quettan | 4:904fd1d62e04 | 165 | fprintf(tabFile, "|| - ", flag); |
M_quettan | 4:904fd1d62e04 | 166 | } else { |
M_quettan | 4:904fd1d62e04 | 167 | pc.printf("- ", flag); |
M_quettan | 4:904fd1d62e04 | 168 | fprintf(tabFile, "- ", flag); |
M_quettan | 4:904fd1d62e04 | 169 | } |
M_quettan | 4:904fd1d62e04 | 170 | |
M_quettan | 4:904fd1d62e04 | 171 | // Make sure the volume is 0 and increment the time keeper |
M_quettan | 4:904fd1d62e04 | 172 | driver = 0.0; |
M_quettan | 4:904fd1d62e04 | 173 | count += 1; |
M_quettan | 4:904fd1d62e04 | 174 | } |
M_quettan | 4:904fd1d62e04 | 175 | |
M_quettan | 4:904fd1d62e04 | 176 | // Separates tablature time frames |
M_quettan | 4:904fd1d62e04 | 177 | if (count == 32) { |
M_quettan | 4:904fd1d62e04 | 178 | count = 0; |
M_quettan | 4:904fd1d62e04 | 179 | } |
M_quettan | 4:904fd1d62e04 | 180 | } else { |
M_quettan | 4:904fd1d62e04 | 181 | pc.printf("File Not Open\n"); |
M_quettan | 4:904fd1d62e04 | 182 | } |
M_quettan | 4:904fd1d62e04 | 183 | |
M_quettan | 4:904fd1d62e04 | 184 | // Don't write until next tick |
M_quettan | 4:904fd1d62e04 | 185 | writeNow = 0; |
igorsk | 0:e294af8d0e07 | 186 | } |
igorsk | 0:e294af8d0e07 | 187 | } |
M_quettan | 4:904fd1d62e04 | 188 | } |