ECE4180 Drum Auto-Transcription Project

Dependencies:   FatFileSystemCpp mbed

Fork of MSCUsbHost by Igor Skochinsky

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?

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