Music Player Library for YMZ294 Sound Generator LSI

Dependents:   Workshop_SSG

Committer:
yamaguch
Date:
Wed Jul 06 09:36:48 2011 +0000
Revision:
0:85d8bf9fb6fe
0.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:85d8bf9fb6fe 1 #include "Note.h"
yamaguch 0:85d8bf9fb6fe 2
yamaguch 0:85d8bf9fb6fe 3 int const WHOLE = 1920;
yamaguch 0:85d8bf9fb6fe 4
yamaguch 0:85d8bf9fb6fe 5 Note::Note(int pitch, int dur, bool tie) {
yamaguch 0:85d8bf9fb6fe 6 this->pitch = pitch;
yamaguch 0:85d8bf9fb6fe 7 this->dur = dur;
yamaguch 0:85d8bf9fb6fe 8 this->tie = tie;
yamaguch 0:85d8bf9fb6fe 9 }
yamaguch 0:85d8bf9fb6fe 10
yamaguch 0:85d8bf9fb6fe 11 Note::Note(const char* s) {
yamaguch 0:85d8bf9fb6fe 12 char c = *s;
yamaguch 0:85d8bf9fb6fe 13 pitch = ('A' <= c && c <= 'G') ? (5 * (c - 'A') + 1) / 3 : -1;
yamaguch 0:85d8bf9fb6fe 14
yamaguch 0:85d8bf9fb6fe 15 if (pitch != -1) {
yamaguch 0:85d8bf9fb6fe 16 c = *++s;
yamaguch 0:85d8bf9fb6fe 17 while (c < '0' || '9' < c) {
yamaguch 0:85d8bf9fb6fe 18 if (c == '#') {
yamaguch 0:85d8bf9fb6fe 19 pitch++;
yamaguch 0:85d8bf9fb6fe 20 } else if (c == 'b') {
yamaguch 0:85d8bf9fb6fe 21 pitch--;
yamaguch 0:85d8bf9fb6fe 22 }
yamaguch 0:85d8bf9fb6fe 23 c = *++s;
yamaguch 0:85d8bf9fb6fe 24 }
yamaguch 0:85d8bf9fb6fe 25 if (pitch < 3) {
yamaguch 0:85d8bf9fb6fe 26 pitch += 12;
yamaguch 0:85d8bf9fb6fe 27 }
yamaguch 0:85d8bf9fb6fe 28 pitch += (c - '0') * 12 + 9;
yamaguch 0:85d8bf9fb6fe 29 } else {
yamaguch 0:85d8bf9fb6fe 30 pitch = 0;
yamaguch 0:85d8bf9fb6fe 31 }
yamaguch 0:85d8bf9fb6fe 32
yamaguch 0:85d8bf9fb6fe 33 s++;
yamaguch 0:85d8bf9fb6fe 34 dur = 0;
yamaguch 0:85d8bf9fb6fe 35 tie = false;
yamaguch 0:85d8bf9fb6fe 36 while (*s) {
yamaguch 0:85d8bf9fb6fe 37 switch (*s++) {
yamaguch 0:85d8bf9fb6fe 38 case 'w':
yamaguch 0:85d8bf9fb6fe 39 dur += WHOLE; //whole note
yamaguch 0:85d8bf9fb6fe 40 break;
yamaguch 0:85d8bf9fb6fe 41 case 'h':
yamaguch 0:85d8bf9fb6fe 42 dur += WHOLE / 2; // half note
yamaguch 0:85d8bf9fb6fe 43 break;
yamaguch 0:85d8bf9fb6fe 44 case 'q':
yamaguch 0:85d8bf9fb6fe 45 dur += WHOLE / 4; // quarter
yamaguch 0:85d8bf9fb6fe 46 break;
yamaguch 0:85d8bf9fb6fe 47 case 'i':
yamaguch 0:85d8bf9fb6fe 48 dur += WHOLE / 8; // eighth
yamaguch 0:85d8bf9fb6fe 49 break;
yamaguch 0:85d8bf9fb6fe 50 case 's':
yamaguch 0:85d8bf9fb6fe 51 dur += WHOLE / 16; // sixteenth
yamaguch 0:85d8bf9fb6fe 52 break;
yamaguch 0:85d8bf9fb6fe 53 case 't':
yamaguch 0:85d8bf9fb6fe 54 dur += WHOLE / 32; // thirty-second
yamaguch 0:85d8bf9fb6fe 55 break;
yamaguch 0:85d8bf9fb6fe 56 case 'x':
yamaguch 0:85d8bf9fb6fe 57 dur += WHOLE / 64; // sixty-fourth
yamaguch 0:85d8bf9fb6fe 58 break;
yamaguch 0:85d8bf9fb6fe 59 case 'o':
yamaguch 0:85d8bf9fb6fe 60 dur += WHOLE / 128; // one-twenty-eighth
yamaguch 0:85d8bf9fb6fe 61 break;
yamaguch 0:85d8bf9fb6fe 62 case '.': // dot - only single . is supported
yamaguch 0:85d8bf9fb6fe 63 dur += dur / 2;
yamaguch 0:85d8bf9fb6fe 64 break;
yamaguch 0:85d8bf9fb6fe 65 case '/': // triplet
yamaguch 0:85d8bf9fb6fe 66 dur = dur * 2 / 3;
yamaguch 0:85d8bf9fb6fe 67 break;
yamaguch 0:85d8bf9fb6fe 68 case '-':
yamaguch 0:85d8bf9fb6fe 69 case '_':
yamaguch 0:85d8bf9fb6fe 70 tie = true;
yamaguch 0:85d8bf9fb6fe 71 break;
yamaguch 0:85d8bf9fb6fe 72 }
yamaguch 0:85d8bf9fb6fe 73 }
yamaguch 0:85d8bf9fb6fe 74 }