A simple sound library for mbed. I use the Ring Tone Text Transfer Language (RTTTL) to play song with mbed.

Dependents:   acd52832_buzzer

Committer:
adelino
Date:
Wed Dec 11 10:43:20 2013 +0000
Revision:
1:b0c0c7d002aa
Parent:
0:4c9dcb64e608
A simple sound ans music library for mbed. I use the RTTTL format to play a song music, in an PwmOutput.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adelino 0:4c9dcb64e608 1 #include "mbed.h"
adelino 0:4c9dcb64e608 2 #include "Buzzer.h"
adelino 0:4c9dcb64e608 3
adelino 0:4c9dcb64e608 4 const int tab_A[]= {NOTE_A3,NOTE_A4,NOTE_A5,NOTE_A6,NOTE_A7};
adelino 0:4c9dcb64e608 5
adelino 0:4c9dcb64e608 6 const int tab_AS[]= {NOTE_AS3,NOTE_AS4,NOTE_AS5,NOTE_AS6,NOTE_AS7};
adelino 0:4c9dcb64e608 7
adelino 0:4c9dcb64e608 8 const int tab_B[]= {NOTE_B3,NOTE_B4,NOTE_B5,NOTE_B6,NOTE_B7};
adelino 0:4c9dcb64e608 9
adelino 0:4c9dcb64e608 10 const int tab_BS[]= {NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C6,NOTE_C7};
adelino 0:4c9dcb64e608 11
adelino 0:4c9dcb64e608 12 const int tab_C[]= {NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C6,NOTE_C7};
adelino 0:4c9dcb64e608 13
adelino 0:4c9dcb64e608 14 const int tab_CS[]= {NOTE_CS3,NOTE_CS4,NOTE_CS5,NOTE_CS6,NOTE_CS7};
adelino 0:4c9dcb64e608 15
adelino 0:4c9dcb64e608 16 const int tab_D[]= {NOTE_D3,NOTE_D4,NOTE_D5,NOTE_D6,NOTE_D7};
adelino 0:4c9dcb64e608 17
adelino 0:4c9dcb64e608 18 const int tab_DS[]= {NOTE_DS3,NOTE_DS4,NOTE_DS5,NOTE_DS6,NOTE_DS7};
adelino 0:4c9dcb64e608 19
adelino 0:4c9dcb64e608 20 const int tab_E[]= {NOTE_E3,NOTE_E4,NOTE_E5,NOTE_E6,NOTE_E7};
adelino 0:4c9dcb64e608 21
adelino 0:4c9dcb64e608 22 const int tab_ES[]= {NOTE_F3,NOTE_F4,NOTE_F5,NOTE_F6,NOTE_F7};
adelino 0:4c9dcb64e608 23
adelino 0:4c9dcb64e608 24 const int tab_F[]= {NOTE_F3,NOTE_F4,NOTE_F5,NOTE_F6,NOTE_F7};
adelino 0:4c9dcb64e608 25
adelino 0:4c9dcb64e608 26 const int tab_FS[]= {NOTE_FS3,NOTE_FS4,NOTE_FS5,NOTE_FS6,NOTE_FS7};
adelino 0:4c9dcb64e608 27
adelino 0:4c9dcb64e608 28 const int tab_G[]= {NOTE_G3,NOTE_G4,NOTE_G5,NOTE_G6,NOTE_G7};
adelino 0:4c9dcb64e608 29
adelino 0:4c9dcb64e608 30 const int tab_GS[]= {NOTE_GS3,NOTE_GS4,NOTE_GS5,NOTE_GS6,NOTE_GS7};
adelino 0:4c9dcb64e608 31
adelino 0:4c9dcb64e608 32 #define isDigit(n) (n>='0' && n <= '9')
adelino 0:4c9dcb64e608 33
adelino 0:4c9dcb64e608 34 //------------------------------
adelino 0:4c9dcb64e608 35 Note::Note(char _note,bool _isSharp,char _octave,int _duration):
adelino 0:4c9dcb64e608 36 myNoteChar(_note),myIsSharp(_isSharp),myOctave(_octave),myDuration(_duration)
adelino 0:4c9dcb64e608 37 {
adelino 0:4c9dcb64e608 38 myPeriod_us=calculatePeriod_us();
adelino 0:4c9dcb64e608 39 }
adelino 0:4c9dcb64e608 40 //--------------------------------
adelino 0:4c9dcb64e608 41 Note::Note(char* str,int _duration):myDuration(_duration)
adelino 0:4c9dcb64e608 42 {
adelino 0:4c9dcb64e608 43 parse(str);
adelino 0:4c9dcb64e608 44 myPeriod_us=calculatePeriod_us();
adelino 0:4c9dcb64e608 45 }
adelino 0:4c9dcb64e608 46 //--------------------------------
adelino 0:4c9dcb64e608 47 void Note::parse(const char* _str)
adelino 0:4c9dcb64e608 48 {
adelino 0:4c9dcb64e608 49 int i=0;
adelino 0:4c9dcb64e608 50
adelino 0:4c9dcb64e608 51 for(i=0; i<3; i++) {
adelino 0:4c9dcb64e608 52 switch(_str[i]) {
adelino 0:4c9dcb64e608 53 //
adelino 0:4c9dcb64e608 54 case 'R':
adelino 0:4c9dcb64e608 55 myNoteChar='R';
adelino 0:4c9dcb64e608 56 break;
adelino 0:4c9dcb64e608 57
adelino 0:4c9dcb64e608 58 case 'r':
adelino 0:4c9dcb64e608 59 myNoteChar='R';
adelino 0:4c9dcb64e608 60 break;
adelino 0:4c9dcb64e608 61
adelino 0:4c9dcb64e608 62 //
adelino 0:4c9dcb64e608 63 case 'A':
adelino 0:4c9dcb64e608 64 myNoteChar='A';
adelino 0:4c9dcb64e608 65 break;
adelino 0:4c9dcb64e608 66 case 'a':
adelino 0:4c9dcb64e608 67 myNoteChar='A';
adelino 0:4c9dcb64e608 68 break;
adelino 0:4c9dcb64e608 69 //
adelino 0:4c9dcb64e608 70 //
adelino 0:4c9dcb64e608 71 case 'B':
adelino 0:4c9dcb64e608 72 myNoteChar='B';
adelino 0:4c9dcb64e608 73 break;
adelino 0:4c9dcb64e608 74 //
adelino 0:4c9dcb64e608 75 case 'b':
adelino 0:4c9dcb64e608 76 myNoteChar='B';
adelino 0:4c9dcb64e608 77 break;
adelino 0:4c9dcb64e608 78 //
adelino 0:4c9dcb64e608 79 case 'C':
adelino 0:4c9dcb64e608 80 myNoteChar='C';
adelino 0:4c9dcb64e608 81 break;
adelino 0:4c9dcb64e608 82 case 'c':
adelino 0:4c9dcb64e608 83 myNoteChar='C';
adelino 0:4c9dcb64e608 84 break;
adelino 0:4c9dcb64e608 85 //
adelino 0:4c9dcb64e608 86 case 'D':
adelino 0:4c9dcb64e608 87 myNoteChar='D';
adelino 0:4c9dcb64e608 88 break;
adelino 0:4c9dcb64e608 89 case 'd':
adelino 0:4c9dcb64e608 90 myNoteChar='D';
adelino 0:4c9dcb64e608 91 break;
adelino 0:4c9dcb64e608 92 //
adelino 0:4c9dcb64e608 93 //
adelino 0:4c9dcb64e608 94 case 'E':
adelino 0:4c9dcb64e608 95 myNoteChar='E';
adelino 0:4c9dcb64e608 96 break;
adelino 0:4c9dcb64e608 97 //
adelino 0:4c9dcb64e608 98 case 'e':
adelino 0:4c9dcb64e608 99 myNoteChar='E';
adelino 0:4c9dcb64e608 100 break;
adelino 0:4c9dcb64e608 101 //
adelino 0:4c9dcb64e608 102 case 'F':
adelino 0:4c9dcb64e608 103 myNoteChar='F';
adelino 0:4c9dcb64e608 104 break;
adelino 0:4c9dcb64e608 105 //
adelino 0:4c9dcb64e608 106 case 'f':
adelino 0:4c9dcb64e608 107 myNoteChar='F';
adelino 0:4c9dcb64e608 108 break;
adelino 0:4c9dcb64e608 109 //
adelino 0:4c9dcb64e608 110 case 'G':
adelino 0:4c9dcb64e608 111 myNoteChar='G';
adelino 0:4c9dcb64e608 112 break;
adelino 0:4c9dcb64e608 113 //
adelino 0:4c9dcb64e608 114 case 'g':
adelino 0:4c9dcb64e608 115 myNoteChar='G';
adelino 0:4c9dcb64e608 116 break;
adelino 0:4c9dcb64e608 117 //
adelino 0:4c9dcb64e608 118 case '%':
adelino 0:4c9dcb64e608 119 myIsSharp=false;
adelino 0:4c9dcb64e608 120 break;
adelino 0:4c9dcb64e608 121 //
adelino 0:4c9dcb64e608 122 //
adelino 0:4c9dcb64e608 123 case '#':
adelino 0:4c9dcb64e608 124 myIsSharp=true;
adelino 0:4c9dcb64e608 125 break;
adelino 0:4c9dcb64e608 126 //
adelino 0:4c9dcb64e608 127 //
adelino 0:4c9dcb64e608 128 case '3':
adelino 0:4c9dcb64e608 129 myOctave=3;
adelino 0:4c9dcb64e608 130 break;
adelino 0:4c9dcb64e608 131 //
adelino 0:4c9dcb64e608 132 //
adelino 0:4c9dcb64e608 133 case '4':
adelino 0:4c9dcb64e608 134 myOctave=4;
adelino 0:4c9dcb64e608 135 break;
adelino 0:4c9dcb64e608 136 //
adelino 0:4c9dcb64e608 137 //
adelino 0:4c9dcb64e608 138 case '5':
adelino 0:4c9dcb64e608 139 myOctave=5;
adelino 0:4c9dcb64e608 140 break;
adelino 0:4c9dcb64e608 141 //
adelino 0:4c9dcb64e608 142 //
adelino 0:4c9dcb64e608 143 case '6':
adelino 0:4c9dcb64e608 144 myOctave=6;
adelino 0:4c9dcb64e608 145 break;
adelino 0:4c9dcb64e608 146 //
adelino 0:4c9dcb64e608 147 //
adelino 0:4c9dcb64e608 148 case '7':
adelino 0:4c9dcb64e608 149 myOctave=7;
adelino 0:4c9dcb64e608 150 break;
adelino 0:4c9dcb64e608 151
adelino 0:4c9dcb64e608 152 default:
adelino 0:4c9dcb64e608 153 myNoteChar='R';
adelino 0:4c9dcb64e608 154 break;
adelino 0:4c9dcb64e608 155 }
adelino 0:4c9dcb64e608 156 //
adelino 0:4c9dcb64e608 157 }
adelino 0:4c9dcb64e608 158 //
adelino 0:4c9dcb64e608 159
adelino 0:4c9dcb64e608 160 }
adelino 0:4c9dcb64e608 161 //--------------------------------
adelino 0:4c9dcb64e608 162 int Note::calculatePeriod_us(void)
adelino 0:4c9dcb64e608 163 {
adelino 0:4c9dcb64e608 164 switch(myNoteChar) {
adelino 0:4c9dcb64e608 165 //
adelino 0:4c9dcb64e608 166 case 'p':
adelino 0:4c9dcb64e608 167 return NOTE_R;
adelino 0:4c9dcb64e608 168 //
adelino 0:4c9dcb64e608 169 case 'R':
adelino 0:4c9dcb64e608 170 return NOTE_R;
adelino 0:4c9dcb64e608 171 //
adelino 0:4c9dcb64e608 172 case 'r':
adelino 0:4c9dcb64e608 173 return NOTE_R;
adelino 0:4c9dcb64e608 174 //
adelino 0:4c9dcb64e608 175 case 'A':
adelino 0:4c9dcb64e608 176 //
adelino 0:4c9dcb64e608 177 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 178 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 179 return tab_A[myOctave-3];
adelino 0:4c9dcb64e608 180 } else {
adelino 0:4c9dcb64e608 181 return tab_AS[myOctave-3];
adelino 0:4c9dcb64e608 182 }
adelino 0:4c9dcb64e608 183 }
adelino 0:4c9dcb64e608 184 break;
adelino 0:4c9dcb64e608 185 //
adelino 0:4c9dcb64e608 186 case 'a':
adelino 0:4c9dcb64e608 187 //
adelino 0:4c9dcb64e608 188 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 189 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 190 return tab_A[myOctave-3];
adelino 0:4c9dcb64e608 191 } else {
adelino 0:4c9dcb64e608 192 return tab_AS[myOctave-3];
adelino 0:4c9dcb64e608 193 }
adelino 0:4c9dcb64e608 194 }
adelino 0:4c9dcb64e608 195 break;
adelino 0:4c9dcb64e608 196 //
adelino 0:4c9dcb64e608 197 case 'B':
adelino 0:4c9dcb64e608 198 //
adelino 0:4c9dcb64e608 199 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 200 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 201 return tab_B[myOctave-3];
adelino 0:4c9dcb64e608 202 } else {
adelino 0:4c9dcb64e608 203 return tab_BS[myOctave-3];
adelino 0:4c9dcb64e608 204 }
adelino 0:4c9dcb64e608 205 }
adelino 0:4c9dcb64e608 206 break;
adelino 0:4c9dcb64e608 207 //
adelino 0:4c9dcb64e608 208 case 'b':
adelino 0:4c9dcb64e608 209 //
adelino 0:4c9dcb64e608 210 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 211 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 212 return tab_B[myOctave-3];
adelino 0:4c9dcb64e608 213 } else {
adelino 0:4c9dcb64e608 214 return tab_BS[myOctave-3];
adelino 0:4c9dcb64e608 215 }
adelino 0:4c9dcb64e608 216 }
adelino 0:4c9dcb64e608 217 break;
adelino 0:4c9dcb64e608 218 //
adelino 0:4c9dcb64e608 219 case 'C':
adelino 0:4c9dcb64e608 220 //
adelino 0:4c9dcb64e608 221 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 222 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 223 return tab_C[myOctave-3];
adelino 0:4c9dcb64e608 224 } else {
adelino 0:4c9dcb64e608 225 return tab_CS[myOctave-3];
adelino 0:4c9dcb64e608 226 }
adelino 0:4c9dcb64e608 227 }
adelino 0:4c9dcb64e608 228 break;
adelino 0:4c9dcb64e608 229 //
adelino 0:4c9dcb64e608 230 case 'c':
adelino 0:4c9dcb64e608 231 //
adelino 0:4c9dcb64e608 232 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 233 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 234 return tab_C[myOctave-3];
adelino 0:4c9dcb64e608 235 } else {
adelino 0:4c9dcb64e608 236 return tab_CS[myOctave-3];
adelino 0:4c9dcb64e608 237 }
adelino 0:4c9dcb64e608 238 }
adelino 0:4c9dcb64e608 239 break;
adelino 0:4c9dcb64e608 240 //
adelino 0:4c9dcb64e608 241 //
adelino 0:4c9dcb64e608 242 case 'D':
adelino 0:4c9dcb64e608 243 //
adelino 0:4c9dcb64e608 244 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 245 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 246 return tab_D[myOctave-3];
adelino 0:4c9dcb64e608 247 } else {
adelino 0:4c9dcb64e608 248 return tab_DS[myOctave-3];
adelino 0:4c9dcb64e608 249 }
adelino 0:4c9dcb64e608 250 }
adelino 0:4c9dcb64e608 251 break;
adelino 0:4c9dcb64e608 252 //
adelino 0:4c9dcb64e608 253 case 'd':
adelino 0:4c9dcb64e608 254 //
adelino 0:4c9dcb64e608 255 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 256 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 257 return tab_D[myOctave-3];
adelino 0:4c9dcb64e608 258 } else {
adelino 0:4c9dcb64e608 259 return tab_DS[myOctave-3];
adelino 0:4c9dcb64e608 260 }
adelino 0:4c9dcb64e608 261 }
adelino 0:4c9dcb64e608 262 break;
adelino 0:4c9dcb64e608 263 //
adelino 0:4c9dcb64e608 264 case 'E':
adelino 0:4c9dcb64e608 265 //
adelino 0:4c9dcb64e608 266 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 267 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 268 return tab_E[myOctave-3];
adelino 0:4c9dcb64e608 269 } else {
adelino 0:4c9dcb64e608 270 return tab_ES[myOctave-3];
adelino 0:4c9dcb64e608 271 }
adelino 0:4c9dcb64e608 272 }
adelino 0:4c9dcb64e608 273 break;
adelino 0:4c9dcb64e608 274 //
adelino 0:4c9dcb64e608 275 case 'e':
adelino 0:4c9dcb64e608 276 //
adelino 0:4c9dcb64e608 277 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 278 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 279 return tab_E[myOctave-3];
adelino 0:4c9dcb64e608 280 } else {
adelino 0:4c9dcb64e608 281 return tab_ES[myOctave-3];
adelino 0:4c9dcb64e608 282 }
adelino 0:4c9dcb64e608 283 }
adelino 0:4c9dcb64e608 284 break;
adelino 0:4c9dcb64e608 285 //
adelino 0:4c9dcb64e608 286 case 'F':
adelino 0:4c9dcb64e608 287 //
adelino 0:4c9dcb64e608 288 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 289 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 290 return tab_F[myOctave-3];
adelino 0:4c9dcb64e608 291 } else {
adelino 0:4c9dcb64e608 292 return tab_FS[myOctave-3];
adelino 0:4c9dcb64e608 293 }
adelino 0:4c9dcb64e608 294 }
adelino 0:4c9dcb64e608 295 break;
adelino 0:4c9dcb64e608 296 //
adelino 0:4c9dcb64e608 297 case 'f':
adelino 0:4c9dcb64e608 298 //
adelino 0:4c9dcb64e608 299 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 300 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 301 return tab_F[myOctave-3];
adelino 0:4c9dcb64e608 302 } else {
adelino 0:4c9dcb64e608 303 return tab_FS[myOctave-3];
adelino 0:4c9dcb64e608 304 }
adelino 0:4c9dcb64e608 305 }
adelino 0:4c9dcb64e608 306 break;
adelino 0:4c9dcb64e608 307 //
adelino 0:4c9dcb64e608 308 case 'G':
adelino 0:4c9dcb64e608 309 //
adelino 0:4c9dcb64e608 310 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 311 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 312 return tab_G[myOctave-3];
adelino 0:4c9dcb64e608 313 } else {
adelino 0:4c9dcb64e608 314 return tab_GS[myOctave-3];
adelino 0:4c9dcb64e608 315 }
adelino 0:4c9dcb64e608 316 }
adelino 0:4c9dcb64e608 317 break;
adelino 0:4c9dcb64e608 318 //
adelino 0:4c9dcb64e608 319 case 'g':
adelino 0:4c9dcb64e608 320 //
adelino 0:4c9dcb64e608 321 if(myOctave >=3 && myOctave <=7) {
adelino 0:4c9dcb64e608 322 if(myIsSharp==false) {
adelino 0:4c9dcb64e608 323 return tab_G[myOctave-3];
adelino 0:4c9dcb64e608 324 } else {
adelino 0:4c9dcb64e608 325 return tab_GS[myOctave-3];
adelino 0:4c9dcb64e608 326 }
adelino 0:4c9dcb64e608 327 }
adelino 0:4c9dcb64e608 328 break;
adelino 0:4c9dcb64e608 329 //
adelino 0:4c9dcb64e608 330 default:
adelino 0:4c9dcb64e608 331 break;
adelino 0:4c9dcb64e608 332 }
adelino 0:4c9dcb64e608 333
adelino 0:4c9dcb64e608 334 return 0;
adelino 0:4c9dcb64e608 335 }
adelino 0:4c9dcb64e608 336 //--------------------------------
adelino 0:4c9dcb64e608 337 int Note::getNotePeriod_us(void) const
adelino 0:4c9dcb64e608 338 {
adelino 0:4c9dcb64e608 339 return this->myPeriod_us;
adelino 0:4c9dcb64e608 340 }
adelino 0:4c9dcb64e608 341 //---------------------------------
adelino 0:4c9dcb64e608 342 bool Note::getIsSharp(void) const
adelino 0:4c9dcb64e608 343 {
adelino 0:4c9dcb64e608 344 return this->myIsSharp;
adelino 0:4c9dcb64e608 345 }
adelino 0:4c9dcb64e608 346 //----------------------------------
adelino 0:4c9dcb64e608 347 char Note::getNoteChar(void) const
adelino 0:4c9dcb64e608 348 {
adelino 0:4c9dcb64e608 349 return this-> myNoteChar;
adelino 0:4c9dcb64e608 350 }
adelino 0:4c9dcb64e608 351 //----------------------------------
adelino 0:4c9dcb64e608 352 char Note::getOctave(void) const
adelino 0:4c9dcb64e608 353 {
adelino 0:4c9dcb64e608 354 return this->myOctave;
adelino 0:4c9dcb64e608 355 }
adelino 0:4c9dcb64e608 356 //---------------------------------
adelino 0:4c9dcb64e608 357 int Note::getDuration(void) const
adelino 0:4c9dcb64e608 358 {
adelino 0:4c9dcb64e608 359 return this->myDuration;
adelino 0:4c9dcb64e608 360 }
adelino 0:4c9dcb64e608 361 //----------------------------------
adelino 0:4c9dcb64e608 362 void Note::toString(char* buffer)
adelino 0:4c9dcb64e608 363 {
adelino 0:4c9dcb64e608 364
adelino 0:4c9dcb64e608 365 buffer[0]= myNoteChar;
adelino 0:4c9dcb64e608 366 if(myIsSharp)
adelino 0:4c9dcb64e608 367 buffer[1]='#';
adelino 0:4c9dcb64e608 368 else
adelino 0:4c9dcb64e608 369 buffer[1]='%';
adelino 0:4c9dcb64e608 370
adelino 0:4c9dcb64e608 371 buffer[2]=myOctave+'0';
adelino 0:4c9dcb64e608 372
adelino 0:4c9dcb64e608 373 buffer[3]='\0';
adelino 0:4c9dcb64e608 374
adelino 0:4c9dcb64e608 375 }
adelino 0:4c9dcb64e608 376 //-----------------------------------
adelino 0:4c9dcb64e608 377
adelino 0:4c9dcb64e608 378
adelino 0:4c9dcb64e608 379 Buzzer::Buzzer(PinName _pwmOut):PwmOut(_pwmOut)
adelino 0:4c9dcb64e608 380 {
adelino 0:4c9dcb64e608 381 this->period_us(1);
adelino 0:4c9dcb64e608 382 this->pulsewidth_us(0);
adelino 0:4c9dcb64e608 383 }
adelino 0:4c9dcb64e608 384 //-----------------------------------
adelino 0:4c9dcb64e608 385 void Buzzer::tone(const Note* _note)
adelino 0:4c9dcb64e608 386 {
adelino 0:4c9dcb64e608 387 int mperiod = _note->getNotePeriod_us();
adelino 0:4c9dcb64e608 388
adelino 0:4c9dcb64e608 389 int dure=_note->getDuration();
adelino 0:4c9dcb64e608 390
adelino 0:4c9dcb64e608 391 this->period_us(mperiod);
adelino 0:4c9dcb64e608 392 this->pulsewidth_us(mperiod/2);
adelino 0:4c9dcb64e608 393
adelino 0:4c9dcb64e608 394 wait_ms(dure);
adelino 0:4c9dcb64e608 395 this->pulsewidth_us(0);
adelino 0:4c9dcb64e608 396
adelino 0:4c9dcb64e608 397
adelino 0:4c9dcb64e608 398 wait_ms(dure);
adelino 0:4c9dcb64e608 399
adelino 0:4c9dcb64e608 400 }
adelino 0:4c9dcb64e608 401 //-------------------------------------
adelino 0:4c9dcb64e608 402 Buzzer::~Buzzer()
adelino 0:4c9dcb64e608 403 {
adelino 0:4c9dcb64e608 404 }
adelino 0:4c9dcb64e608 405 //--------------------------------------
adelino 0:4c9dcb64e608 406 Music::Music(const char* p)
adelino 0:4c9dcb64e608 407 {
adelino 0:4c9dcb64e608 408 char defautDuree=4;
adelino 0:4c9dcb64e608 409 char defautOctave=6;
adelino 0:4c9dcb64e608 410 int bmp=63;
adelino 0:4c9dcb64e608 411
adelino 0:4c9dcb64e608 412 int ronde=0;
adelino 0:4c9dcb64e608 413 int dura=0;
adelino 0:4c9dcb64e608 414 int num=0;
adelino 0:4c9dcb64e608 415
adelino 0:4c9dcb64e608 416 char _note;
adelino 0:4c9dcb64e608 417 bool _issharp=false;
adelino 0:4c9dcb64e608 418 char _octave=0;
adelino 0:4c9dcb64e608 419
adelino 0:4c9dcb64e608 420 char newOctave=0;
adelino 0:4c9dcb64e608 421 //
adelino 0:4c9dcb64e608 422 while(*p != ':')
adelino 0:4c9dcb64e608 423 p++; //le titre
adelino 0:4c9dcb64e608 424
adelino 0:4c9dcb64e608 425 p++; //skip :
adelino 0:4c9dcb64e608 426
adelino 0:4c9dcb64e608 427 //defaut duration
adelino 0:4c9dcb64e608 428 if(*p=='d') {
adelino 0:4c9dcb64e608 429 p++;
adelino 0:4c9dcb64e608 430 p++; //skip d=
adelino 0:4c9dcb64e608 431
adelino 0:4c9dcb64e608 432
adelino 0:4c9dcb64e608 433 while(isDigit(*p)) {
adelino 0:4c9dcb64e608 434 num=(num*10)+(*p++-'0');
adelino 0:4c9dcb64e608 435 }
adelino 0:4c9dcb64e608 436 //
adelino 0:4c9dcb64e608 437 if(num >0)
adelino 0:4c9dcb64e608 438 defautDuree=num;
adelino 0:4c9dcb64e608 439 p++; //skip ,
adelino 0:4c9dcb64e608 440 }
adelino 0:4c9dcb64e608 441 //
adelino 0:4c9dcb64e608 442 if(*p=='o') {
adelino 0:4c9dcb64e608 443 p++;
adelino 0:4c9dcb64e608 444 p++; //skip o=
adelino 0:4c9dcb64e608 445
adelino 0:4c9dcb64e608 446 num=*p++ -'0';
adelino 0:4c9dcb64e608 447
adelino 0:4c9dcb64e608 448 if(num >=3 && num <=7)
adelino 0:4c9dcb64e608 449 defautOctave=num;
adelino 0:4c9dcb64e608 450
adelino 0:4c9dcb64e608 451 p++; //skip ,
adelino 0:4c9dcb64e608 452
adelino 0:4c9dcb64e608 453 }
adelino 0:4c9dcb64e608 454 //
adelino 0:4c9dcb64e608 455 if(*p =='b') {
adelino 0:4c9dcb64e608 456 p++;
adelino 0:4c9dcb64e608 457 p++; //skip b=
adelino 0:4c9dcb64e608 458 num=0;
adelino 0:4c9dcb64e608 459
adelino 0:4c9dcb64e608 460 while(isDigit(*p)) {
adelino 0:4c9dcb64e608 461 num=num*10+(*p++ -'0');
adelino 0:4c9dcb64e608 462 }
adelino 0:4c9dcb64e608 463 bmp=num;
adelino 0:4c9dcb64e608 464 p++; //skip :
adelino 0:4c9dcb64e608 465 }
adelino 0:4c9dcb64e608 466 //
adelino 0:4c9dcb64e608 467 ronde=(60*500/bmp)*4; // in ms
adelino 0:4c9dcb64e608 468
adelino 0:4c9dcb64e608 469 //les notes
adelino 0:4c9dcb64e608 470 while(*p) {
adelino 0:4c9dcb64e608 471 //ge t duration if available
adelino 0:4c9dcb64e608 472 num=0;
adelino 0:4c9dcb64e608 473 while(isDigit(*p)) {
adelino 0:4c9dcb64e608 474 num=(num*10)+(*p++ -'0');
adelino 0:4c9dcb64e608 475 }
adelino 0:4c9dcb64e608 476 if(num)
adelino 0:4c9dcb64e608 477 dura=ronde/num;
adelino 0:4c9dcb64e608 478 else
adelino 0:4c9dcb64e608 479 dura=ronde/defautDuree;
adelino 0:4c9dcb64e608 480 //la note
adelino 0:4c9dcb64e608 481 _note=*p;
adelino 0:4c9dcb64e608 482
adelino 0:4c9dcb64e608 483 p++;
adelino 0:4c9dcb64e608 484 //issharp
adelino 0:4c9dcb64e608 485 if(*p=='#') {
adelino 0:4c9dcb64e608 486 _issharp=true;
adelino 0:4c9dcb64e608 487 p++;
adelino 0:4c9dcb64e608 488 } else {
adelino 0:4c9dcb64e608 489 _issharp=false;
adelino 0:4c9dcb64e608 490
adelino 0:4c9dcb64e608 491 }
adelino 0:4c9dcb64e608 492 //un point ?
adelino 0:4c9dcb64e608 493 if(*p=='.') {
adelino 0:4c9dcb64e608 494 dura+=dura/2;
adelino 0:4c9dcb64e608 495 p++;
adelino 0:4c9dcb64e608 496 }
adelino 0:4c9dcb64e608 497 //
adelino 0:4c9dcb64e608 498 //nouvelle octave
adelino 0:4c9dcb64e608 499 if(isDigit(*p)) {
adelino 0:4c9dcb64e608 500 newOctave =*p - '0';
adelino 0:4c9dcb64e608 501 p++;
adelino 0:4c9dcb64e608 502 }
adelino 0:4c9dcb64e608 503
adelino 0:4c9dcb64e608 504 if(newOctave >0)
adelino 0:4c9dcb64e608 505 _octave=newOctave;
adelino 0:4c9dcb64e608 506
adelino 0:4c9dcb64e608 507 else {
adelino 0:4c9dcb64e608 508 _octave=defautOctave;
adelino 0:4c9dcb64e608 509 }
adelino 0:4c9dcb64e608 510
adelino 0:4c9dcb64e608 511 //
adelino 0:4c9dcb64e608 512 if(*p==',')
adelino 0:4c9dcb64e608 513 {
adelino 0:4c9dcb64e608 514 p++;
adelino 0:4c9dcb64e608 515 myTabNotes.push_back(new Note(_note,_issharp,_octave,dura));
adelino 0:4c9dcb64e608 516 }
adelino 0:4c9dcb64e608 517
adelino 0:4c9dcb64e608 518
adelino 0:4c9dcb64e608 519
adelino 0:4c9dcb64e608 520
adelino 0:4c9dcb64e608 521 }
adelino 0:4c9dcb64e608 522 }
adelino 0:4c9dcb64e608 523 //--------------------------------------
adelino 0:4c9dcb64e608 524 int Music::getNumbersNotes(void) const
adelino 0:4c9dcb64e608 525 {
adelino 0:4c9dcb64e608 526 return this->myTabNotes.size();
adelino 0:4c9dcb64e608 527 }
adelino 0:4c9dcb64e608 528
adelino 0:4c9dcb64e608 529 //--------------------------------------
adelino 0:4c9dcb64e608 530 void Music::play(Buzzer* _buzzer)
adelino 0:4c9dcb64e608 531 {
adelino 0:4c9dcb64e608 532 /*
adelino 0:4c9dcb64e608 533 char buffer[10];
adelino 0:4c9dcb64e608 534 int duration=0;
adelino 0:4c9dcb64e608 535
adelino 0:4c9dcb64e608 536 for(int i=0; i< myTabNotes.size(); i++) {
adelino 0:4c9dcb64e608 537 myTabNotes[i]->toString(buffer);
adelino 0:4c9dcb64e608 538 duration=myTabNotes[i]->getDuration();
adelino 0:4c9dcb64e608 539
adelino 0:4c9dcb64e608 540 pc.printf(" %s:%d \n\r",buffer,duration);
adelino 0:4c9dcb64e608 541 }
adelino 0:4c9dcb64e608 542 */
adelino 0:4c9dcb64e608 543
adelino 0:4c9dcb64e608 544 for(int i=0; i< myTabNotes.size(); i++) {
adelino 0:4c9dcb64e608 545 _buzzer->tone(myTabNotes[i]);
adelino 0:4c9dcb64e608 546 }
adelino 0:4c9dcb64e608 547
adelino 0:4c9dcb64e608 548
adelino 0:4c9dcb64e608 549 }
adelino 0:4c9dcb64e608 550 //--------------------------------------
adelino 0:4c9dcb64e608 551 Music::~Music()
adelino 0:4c9dcb64e608 552 {
adelino 0:4c9dcb64e608 553 for(int i=0; i< myTabNotes.size(); i++) {
adelino 0:4c9dcb64e608 554 delete(myTabNotes[i]);
adelino 0:4c9dcb64e608 555 myTabNotes[i]=0;
adelino 0:4c9dcb64e608 556 }
adelino 0:4c9dcb64e608 557 }
adelino 0:4c9dcb64e608 558 //--------------------------------------
adelino 0:4c9dcb64e608 559
adelino 0:4c9dcb64e608 560
adelino 0:4c9dcb64e608 561