エレキジャック Web版 mbedで初めてのマイコン開発 メモリカードを使ったデータの読み書き<2/3> 音符データをSDから読み込んで音楽を鳴らすプログラムです。 音楽データはエレキジャックのサイトに置いてあります。 music.txt http://www.eleki-jack.com/arm/2010/12/mbed-6.html
Dependencies: TextLCD mbed SDFileSystem
MySound.cpp@0:f0cd2b9de695, 2011-02-04 (annotated)
- Committer:
- sunifu
- Date:
- Fri Feb 04 15:09:01 2011 +0000
- Revision:
- 0:f0cd2b9de695
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunifu | 0:f0cd2b9de695 | 1 | #include "MySound.h" |
sunifu | 0:f0cd2b9de695 | 2 | |
sunifu | 0:f0cd2b9de695 | 3 | MySound::MySound(PinName out) : _out(out){ |
sunifu | 0:f0cd2b9de695 | 4 | _out = 0; |
sunifu | 0:f0cd2b9de695 | 5 | } |
sunifu | 0:f0cd2b9de695 | 6 | |
sunifu | 0:f0cd2b9de695 | 7 | void MySound::play(char pn,int s, char l) |
sunifu | 0:f0cd2b9de695 | 8 | { |
sunifu | 0:f0cd2b9de695 | 9 | double freq,f; |
sunifu | 0:f0cd2b9de695 | 10 | double scale ; |
sunifu | 0:f0cd2b9de695 | 11 | float length ; |
sunifu | 0:f0cd2b9de695 | 12 | |
sunifu | 0:f0cd2b9de695 | 13 | switch(l){ |
sunifu | 0:f0cd2b9de695 | 14 | case 'W': |
sunifu | 0:f0cd2b9de695 | 15 | length = 4 ; |
sunifu | 0:f0cd2b9de695 | 16 | break ; |
sunifu | 0:f0cd2b9de695 | 17 | case 't': |
sunifu | 0:f0cd2b9de695 | 18 | length = 3; |
sunifu | 0:f0cd2b9de695 | 19 | break ; |
sunifu | 0:f0cd2b9de695 | 20 | case 'D': |
sunifu | 0:f0cd2b9de695 | 21 | length = 2 ; |
sunifu | 0:f0cd2b9de695 | 22 | break; |
sunifu | 0:f0cd2b9de695 | 23 | case 'Q': |
sunifu | 0:f0cd2b9de695 | 24 | length = 1; |
sunifu | 0:f0cd2b9de695 | 25 | break; |
sunifu | 0:f0cd2b9de695 | 26 | case 'q': |
sunifu | 0:f0cd2b9de695 | 27 | length = 1.5; |
sunifu | 0:f0cd2b9de695 | 28 | break; |
sunifu | 0:f0cd2b9de695 | 29 | case 'E': |
sunifu | 0:f0cd2b9de695 | 30 | length = 0.5; |
sunifu | 0:f0cd2b9de695 | 31 | break; |
sunifu | 0:f0cd2b9de695 | 32 | case 'S': |
sunifu | 0:f0cd2b9de695 | 33 | length = 0.25; |
sunifu | 0:f0cd2b9de695 | 34 | break; |
sunifu | 0:f0cd2b9de695 | 35 | case 'T': |
sunifu | 0:f0cd2b9de695 | 36 | length = 0.125; |
sunifu | 0:f0cd2b9de695 | 37 | break; |
sunifu | 0:f0cd2b9de695 | 38 | default: |
sunifu | 0:f0cd2b9de695 | 39 | length = 1; |
sunifu | 0:f0cd2b9de695 | 40 | } |
sunifu | 0:f0cd2b9de695 | 41 | |
sunifu | 0:f0cd2b9de695 | 42 | switch(pn){ |
sunifu | 0:f0cd2b9de695 | 43 | case 'a': |
sunifu | 0:f0cd2b9de695 | 44 | freq = 415.30469 ; |
sunifu | 0:f0cd2b9de695 | 45 | break; |
sunifu | 0:f0cd2b9de695 | 46 | case 'A': |
sunifu | 0:f0cd2b9de695 | 47 | freq = 440.0; |
sunifu | 0:f0cd2b9de695 | 48 | break ; |
sunifu | 0:f0cd2b9de695 | 49 | case 'b': |
sunifu | 0:f0cd2b9de695 | 50 | freq = 466.16876; |
sunifu | 0:f0cd2b9de695 | 51 | break; |
sunifu | 0:f0cd2b9de695 | 52 | case 'B': |
sunifu | 0:f0cd2b9de695 | 53 | freq = 493.88330; |
sunifu | 0:f0cd2b9de695 | 54 | break ; |
sunifu | 0:f0cd2b9de695 | 55 | case 'C': |
sunifu | 0:f0cd2b9de695 | 56 | freq = 261.62556; |
sunifu | 0:f0cd2b9de695 | 57 | break ; |
sunifu | 0:f0cd2b9de695 | 58 | case 'd': |
sunifu | 0:f0cd2b9de695 | 59 | freq = 277.18263; |
sunifu | 0:f0cd2b9de695 | 60 | break ; |
sunifu | 0:f0cd2b9de695 | 61 | case 'D': |
sunifu | 0:f0cd2b9de695 | 62 | freq = 293.66476; |
sunifu | 0:f0cd2b9de695 | 63 | break; |
sunifu | 0:f0cd2b9de695 | 64 | case 'e': |
sunifu | 0:f0cd2b9de695 | 65 | freq = 311.12698; |
sunifu | 0:f0cd2b9de695 | 66 | break ; |
sunifu | 0:f0cd2b9de695 | 67 | case 'E': |
sunifu | 0:f0cd2b9de695 | 68 | freq = 329.62755; |
sunifu | 0:f0cd2b9de695 | 69 | break ; |
sunifu | 0:f0cd2b9de695 | 70 | case 'F': |
sunifu | 0:f0cd2b9de695 | 71 | freq = 349.22823; |
sunifu | 0:f0cd2b9de695 | 72 | break; |
sunifu | 0:f0cd2b9de695 | 73 | case 'g': |
sunifu | 0:f0cd2b9de695 | 74 | freq = 369.99442; |
sunifu | 0:f0cd2b9de695 | 75 | break ; |
sunifu | 0:f0cd2b9de695 | 76 | case 'G': |
sunifu | 0:f0cd2b9de695 | 77 | freq = 391.99543; |
sunifu | 0:f0cd2b9de695 | 78 | break ; |
sunifu | 0:f0cd2b9de695 | 79 | case 'R': |
sunifu | 0:f0cd2b9de695 | 80 | freq = 0.0; |
sunifu | 0:f0cd2b9de695 | 81 | break ; |
sunifu | 0:f0cd2b9de695 | 82 | default: |
sunifu | 0:f0cd2b9de695 | 83 | freq = 440; |
sunifu | 0:f0cd2b9de695 | 84 | } |
sunifu | 0:f0cd2b9de695 | 85 | |
sunifu | 0:f0cd2b9de695 | 86 | switch ( s ){ |
sunifu | 0:f0cd2b9de695 | 87 | case 6: |
sunifu | 0:f0cd2b9de695 | 88 | f = freq * 4.0 ; |
sunifu | 0:f0cd2b9de695 | 89 | break; |
sunifu | 0:f0cd2b9de695 | 90 | case 5: |
sunifu | 0:f0cd2b9de695 | 91 | f = freq * 2.0 ; |
sunifu | 0:f0cd2b9de695 | 92 | break; |
sunifu | 0:f0cd2b9de695 | 93 | case 4: |
sunifu | 0:f0cd2b9de695 | 94 | f = freq; |
sunifu | 0:f0cd2b9de695 | 95 | break; |
sunifu | 0:f0cd2b9de695 | 96 | case 3: |
sunifu | 0:f0cd2b9de695 | 97 | f = freq / 2.0 ; |
sunifu | 0:f0cd2b9de695 | 98 | break; |
sunifu | 0:f0cd2b9de695 | 99 | case 2: |
sunifu | 0:f0cd2b9de695 | 100 | f = freq / 4.0; |
sunifu | 0:f0cd2b9de695 | 101 | break; |
sunifu | 0:f0cd2b9de695 | 102 | default: |
sunifu | 0:f0cd2b9de695 | 103 | f = freq ; |
sunifu | 0:f0cd2b9de695 | 104 | break ; |
sunifu | 0:f0cd2b9de695 | 105 | } |
sunifu | 0:f0cd2b9de695 | 106 | |
sunifu | 0:f0cd2b9de695 | 107 | scale = 1.0/(2.0*f); |
sunifu | 0:f0cd2b9de695 | 108 | |
sunifu | 0:f0cd2b9de695 | 109 | // printf("scale=%lf\tf=%f\tfreq=%f\tlength=%lf\n",scale,f,freq,length); |
sunifu | 0:f0cd2b9de695 | 110 | // printf("f*length=%lf\tfreq=%lf\t%lf \n",f*length,freq,scale); |
sunifu | 0:f0cd2b9de695 | 111 | |
sunifu | 0:f0cd2b9de695 | 112 | for(int i = 0 ; i <= (int)( f * length ) ; i++ ){ |
sunifu | 0:f0cd2b9de695 | 113 | _out = 1; |
sunifu | 0:f0cd2b9de695 | 114 | wait(scale) ; |
sunifu | 0:f0cd2b9de695 | 115 | _out = 0 ; |
sunifu | 0:f0cd2b9de695 | 116 | wait(scale) ; |
sunifu | 0:f0cd2b9de695 | 117 | } |
sunifu | 0:f0cd2b9de695 | 118 | } |