エレキジャック Web版 mbedで初めてのマイコン開発 メモリカードを使ったデータの読み書き<2/3> 音符データをSDから読み込んで音楽を鳴らすプログラムです。 音楽データはエレキジャックのサイトに置いてあります。 music.txt http://www.eleki-jack.com/arm/2010/12/mbed-6.html

Dependencies:   TextLCD mbed SDFileSystem

Committer:
sunifu
Date:
Fri Feb 04 15:09:01 2011 +0000
Revision:
0:f0cd2b9de695

        

Who changed what in which revision?

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