piano 4 octaves, 8 notes, 3 threads, 2 outputs, no bug, clean code, comments, remove old .h

Dependencies:   TextLCD

Fork of Nucleo_piano_CS435 by karine aknin

Committer:
aknin001
Date:
Wed Jul 04 21:17:39 2018 +0000
Revision:
7:d2fe1a5e79ed
Parent:
6:58bab17100a2
Child:
8:781b03221397
project working need clean code and comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bcostm 0:5701b41769fd 1 #include "mbed.h"
Aliened 3:ca0d5d72f842 2 #include "TextLCD.h"
Aliened 3:ca0d5d72f842 3 #include "button_value.h"
Aliened 3:ca0d5d72f842 4 #include <map>
aknin001 5:824785b64822 5 #include <string.h>
aknin001 5:824785b64822 6 #include <math.h>
aknin001 7:d2fe1a5e79ed 7
Aliened 3:ca0d5d72f842 8 // Define screen
Aliened 3:ca0d5d72f842 9 TextLCD lcd(PA_8, PA_9, PC_7, PB_6, PA_7, PA_6, PA_5); // RS, RW, E, D4-D7
Aliened 3:ca0d5d72f842 10
aknin001 5:824785b64822 11 // Define Bus In for Buttons (Do, Re, Mi, Fa, Sol, La, Si, Do)
aknin001 5:824785b64822 12 BusIn Bus_In(PA_0, PA_1, PA_4, PB_0, PA_10, PB_3, PB_5, PB_4);
bcostm 0:5701b41769fd 13
Aliened 3:ca0d5d72f842 14 // Define the PWM speaker
Aliened 3:ca0d5d72f842 15 PwmOut speaker(PB_10);
aknin001 7:d2fe1a5e79ed 16
aknin001 7:d2fe1a5e79ed 17 //Define Bus In for Gamme Button
aknin001 7:d2fe1a5e79ed 18 BusIn Bus_In_Gamme(PB_9);
aknin001 7:d2fe1a5e79ed 19
Aliened 3:ca0d5d72f842 20 //Define variables for sound
aknin001 5:824785b64822 21 struct NoteReference {
aknin001 5:824785b64822 22 char name[4];
aknin001 5:824785b64822 23 int mask;
aknin001 5:824785b64822 24 double frequency;
aknin001 5:824785b64822 25 double add[4];
aknin001 5:824785b64822 26 };
aknin001 7:d2fe1a5e79ed 27
aknin001 5:824785b64822 28 NoteReference noteReference[8] = { {"Do", 0x1, 262.0, {0.0, -1.0, -1.5, -3.0}},
aknin001 5:824785b64822 29 {"Re", 0x2, 294.0, {0.0, -1.0, -1.0, -3.0 }},
aknin001 5:824785b64822 30 {"Mi", 0x4, 330.0, {0.0, -1.0, -1.5, -3.0}},
aknin001 5:824785b64822 31 {"Fa", 0x8, 349.0, {0.0, 0.5, -1.0, 2.0}},
aknin001 5:824785b64822 32 {"Sol", 0x10, 392.0, {0.0, 0.0, 0.0, 0.0}},
aknin001 5:824785b64822 33 {"La", 0x20, 440.0, {0.0, 0.0, 0.0, 0.0}},
aknin001 5:824785b64822 34 {"Si", 0x40, 494.0, {0.0, 0.0, -1.0, -1.0}},
aknin001 5:824785b64822 35 {"Do", 0x80, 523.0, {0.0, 0.0, 0.0, 0.0}}
aknin001 5:824785b64822 36 };
aknin001 5:824785b64822 37 volatile int state_buttons = 0;
aknin001 7:d2fe1a5e79ed 38 volatile int state_button_gamme = 0;
aknin001 5:824785b64822 39 volatile int gamme = 0;
Aliened 3:ca0d5d72f842 40
bcostm 2:35f13b7f3659 41
aknin001 7:d2fe1a5e79ed 42 //Define variable for display
aknin001 7:d2fe1a5e79ed 43 char bufferOutput[30] = "";
bcostm 0:5701b41769fd 44
aknin001 7:d2fe1a5e79ed 45 //Define variables for synchronization
aknin001 7:d2fe1a5e79ed 46 Mutex lockBufferOutput;
aknin001 7:d2fe1a5e79ed 47 Mutex lockGamme;
aknin001 7:d2fe1a5e79ed 48
Aliened 3:ca0d5d72f842 49 void refresh_state_button()
Aliened 3:ca0d5d72f842 50 {
aknin001 7:d2fe1a5e79ed 51 state_buttons = Bus_In & Bus_In.mask(); // read the bus and mask out bits not being used
Aliened 3:ca0d5d72f842 52 }
aknin001 7:d2fe1a5e79ed 53
aknin001 5:824785b64822 54 void play_music(int notes, double frequency)
Aliened 3:ca0d5d72f842 55 {
aknin001 7:d2fe1a5e79ed 56 speaker.period(1.0 / frequency);
aknin001 5:824785b64822 57 while (state_buttons == notes) {
Aliened 3:ca0d5d72f842 58 refresh_state_button();
Aliened 3:ca0d5d72f842 59 }
Aliened 3:ca0d5d72f842 60 }
aknin001 7:d2fe1a5e79ed 61
aknin001 7:d2fe1a5e79ed 62 void check_buttons(double frequency, int actualGamme)
Aliened 3:ca0d5d72f842 63 {
aknin001 6:58bab17100a2 64 if (state_buttons == 0xFF)
aknin001 5:824785b64822 65 {
aknin001 6:58bab17100a2 66 speaker = 0;
aknin001 7:d2fe1a5e79ed 67 lockBufferOutput.lock();
aknin001 7:d2fe1a5e79ed 68 strcpy(bufferOutput, "");
aknin001 7:d2fe1a5e79ed 69 lockBufferOutput.unlock();
aknin001 6:58bab17100a2 70 }
aknin001 6:58bab17100a2 71 else {
aknin001 7:d2fe1a5e79ed 72 frequency = 0.0;
aknin001 7:d2fe1a5e79ed 73 lockGamme.lock();
aknin001 7:d2fe1a5e79ed 74 actualGamme = gamme;
aknin001 7:d2fe1a5e79ed 75 lockGamme.unlock();
aknin001 7:d2fe1a5e79ed 76 lockBufferOutput.lock();
aknin001 7:d2fe1a5e79ed 77 strcpy(bufferOutput, "");
aknin001 7:d2fe1a5e79ed 78 for (int i = 0; i < 8; i++) {
aknin001 6:58bab17100a2 79 if (!(state_buttons & noteReference[i].mask)) {
aknin001 7:d2fe1a5e79ed 80 frequency += noteReference[i].frequency * pow(2.0, (double)actualGamme) + noteReference[i].add[actualGamme];
aknin001 6:58bab17100a2 81 strcat(bufferOutput, noteReference[i].name);
aknin001 6:58bab17100a2 82 strcat(bufferOutput, " ");
aknin001 6:58bab17100a2 83 }
aknin001 5:824785b64822 84 }
aknin001 7:d2fe1a5e79ed 85 lockBufferOutput.unlock();
aknin001 6:58bab17100a2 86 speaker = 0.5;
aknin001 5:824785b64822 87 play_music(state_buttons, frequency);
Aliened 3:ca0d5d72f842 88 }
Aliened 3:ca0d5d72f842 89 }
Aliened 3:ca0d5d72f842 90
aknin001 7:d2fe1a5e79ed 91 void run_music()
aknin001 7:d2fe1a5e79ed 92 {
aknin001 7:d2fe1a5e79ed 93 double frequency = 0.0;
aknin001 7:d2fe1a5e79ed 94 int actualGamme = 0;
aknin001 7:d2fe1a5e79ed 95
aknin001 7:d2fe1a5e79ed 96 while (true)
aknin001 7:d2fe1a5e79ed 97 {
aknin001 7:d2fe1a5e79ed 98 refresh_state_button();
aknin001 7:d2fe1a5e79ed 99 check_buttons(frequency, actualGamme);
aknin001 7:d2fe1a5e79ed 100 Thread::wait(100);
aknin001 7:d2fe1a5e79ed 101 }
aknin001 7:d2fe1a5e79ed 102 }
Aliened 3:ca0d5d72f842 103
aknin001 7:d2fe1a5e79ed 104 void run_display()
aknin001 7:d2fe1a5e79ed 105 {
aknin001 7:d2fe1a5e79ed 106 char old_buffer[30] = "";
aknin001 7:d2fe1a5e79ed 107 int old_gamme = 0;
aknin001 7:d2fe1a5e79ed 108
aknin001 7:d2fe1a5e79ed 109 lockBufferOutput.lock();
aknin001 7:d2fe1a5e79ed 110 lockGamme.lock();
aknin001 7:d2fe1a5e79ed 111 lcd.printf("Gamme = %d", gamme);
aknin001 7:d2fe1a5e79ed 112 lockGamme.unlock();
aknin001 7:d2fe1a5e79ed 113 lockBufferOutput.unlock();
aknin001 7:d2fe1a5e79ed 114 while(true)
aknin001 7:d2fe1a5e79ed 115 {
aknin001 7:d2fe1a5e79ed 116 lockBufferOutput.lock();
aknin001 7:d2fe1a5e79ed 117 if (strcmp(old_buffer, bufferOutput))
aknin001 7:d2fe1a5e79ed 118 {
aknin001 7:d2fe1a5e79ed 119 lcd.cls();
aknin001 7:d2fe1a5e79ed 120 lockGamme.lock();
aknin001 7:d2fe1a5e79ed 121 if (strcmp(bufferOutput, ""))
aknin001 7:d2fe1a5e79ed 122 lcd.printf("%s- g[%d]", bufferOutput, gamme);
aknin001 7:d2fe1a5e79ed 123 else
aknin001 7:d2fe1a5e79ed 124 lcd.printf("Gamme = %d", gamme);
aknin001 7:d2fe1a5e79ed 125 lockGamme.unlock();
aknin001 7:d2fe1a5e79ed 126 strcpy(old_buffer, bufferOutput);
aknin001 7:d2fe1a5e79ed 127 }
aknin001 7:d2fe1a5e79ed 128 else {
aknin001 7:d2fe1a5e79ed 129 lockGamme.lock();
aknin001 7:d2fe1a5e79ed 130 if (old_gamme != gamme)
aknin001 7:d2fe1a5e79ed 131 {
aknin001 7:d2fe1a5e79ed 132 lcd.cls();
aknin001 7:d2fe1a5e79ed 133 lcd.printf("Gamme = %d", gamme);
aknin001 7:d2fe1a5e79ed 134 old_gamme = gamme;
aknin001 7:d2fe1a5e79ed 135 }
aknin001 7:d2fe1a5e79ed 136 lockGamme.unlock();
aknin001 7:d2fe1a5e79ed 137 }
aknin001 7:d2fe1a5e79ed 138 lockBufferOutput.unlock();
aknin001 7:d2fe1a5e79ed 139 Thread::wait(100);
aknin001 7:d2fe1a5e79ed 140 }
aknin001 7:d2fe1a5e79ed 141 }
aknin001 7:d2fe1a5e79ed 142
aknin001 7:d2fe1a5e79ed 143 void check_state_button_gamme()
aknin001 7:d2fe1a5e79ed 144 {
aknin001 7:d2fe1a5e79ed 145 state_button_gamme = Bus_In_Gamme & Bus_In_Gamme.mask();
aknin001 7:d2fe1a5e79ed 146 }
aknin001 7:d2fe1a5e79ed 147
aknin001 7:d2fe1a5e79ed 148 void run_gamme()
aknin001 7:d2fe1a5e79ed 149 {
aknin001 7:d2fe1a5e79ed 150 while(true)
aknin001 7:d2fe1a5e79ed 151 {
aknin001 7:d2fe1a5e79ed 152 check_state_button_gamme();
aknin001 7:d2fe1a5e79ed 153 if (state_button_gamme == 0x0)
aknin001 7:d2fe1a5e79ed 154 {
aknin001 7:d2fe1a5e79ed 155 lockGamme.lock();
aknin001 7:d2fe1a5e79ed 156 if (gamme == 3)
aknin001 7:d2fe1a5e79ed 157 gamme = 0;
aknin001 7:d2fe1a5e79ed 158 else
aknin001 7:d2fe1a5e79ed 159 gamme++;
aknin001 7:d2fe1a5e79ed 160 lockGamme.unlock();
aknin001 7:d2fe1a5e79ed 161 while (state_button_gamme == 0x0)
aknin001 7:d2fe1a5e79ed 162 check_state_button_gamme();
aknin001 7:d2fe1a5e79ed 163 }
aknin001 7:d2fe1a5e79ed 164 Thread::wait(100);
aknin001 7:d2fe1a5e79ed 165 }
aknin001 7:d2fe1a5e79ed 166 }
Aliened 3:ca0d5d72f842 167
bcostm 0:5701b41769fd 168 int main()
bcostm 0:5701b41769fd 169 {
aknin001 7:d2fe1a5e79ed 170 Thread music_thread;
aknin001 7:d2fe1a5e79ed 171 Thread display_thread;
aknin001 7:d2fe1a5e79ed 172 Thread gamme_thread;
aknin001 7:d2fe1a5e79ed 173
aknin001 7:d2fe1a5e79ed 174 lcd.printf("CS435 : Piano Project\n");
aknin001 7:d2fe1a5e79ed 175 wait(3);
aknin001 7:d2fe1a5e79ed 176 lcd.cls();
aknin001 7:d2fe1a5e79ed 177
aknin001 7:d2fe1a5e79ed 178 music_thread.start(run_music);
aknin001 7:d2fe1a5e79ed 179 display_thread.start(run_display);
aknin001 7:d2fe1a5e79ed 180 gamme_thread.start(run_gamme);
aknin001 7:d2fe1a5e79ed 181 while(1);
aknin001 7:d2fe1a5e79ed 182 }