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

Dependencies:   TextLCD mbed SDFileSystem

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MySound.cpp Source File

MySound.cpp

00001 #include "MySound.h"
00002 
00003 MySound::MySound(PinName out) : _out(out){
00004     _out = 0;
00005 }
00006 
00007 void MySound::play(char pn,int s, char l)
00008 {
00009     double freq,f;
00010     double scale ;
00011     float length ;
00012        
00013     switch(l){
00014         case 'W':
00015             length = 4 ;
00016             break ;
00017         case 't':
00018             length = 3;
00019             break ;
00020         case 'D':
00021             length = 2 ;
00022             break;  
00023         case 'Q':
00024             length = 1;
00025             break;
00026         case 'q':
00027             length = 1.5;
00028             break;
00029         case 'E':
00030             length = 0.5;
00031             break;
00032         case 'S':
00033             length = 0.25;
00034             break;           
00035         case 'T':
00036             length = 0.125;
00037             break;
00038         default:
00039             length = 1;
00040     }
00041 
00042     switch(pn){
00043         case 'a':  
00044             freq = 415.30469 ;
00045             break; 
00046         case 'A':
00047             freq = 440.0;
00048             break ;
00049         case 'b':
00050             freq = 466.16876;
00051             break;
00052         case 'B': 
00053             freq = 493.88330;
00054             break ;
00055         case 'C':
00056             freq = 261.62556;
00057             break ;
00058         case 'd': 
00059             freq = 277.18263;
00060             break ;
00061         case 'D':
00062             freq = 293.66476;
00063             break;
00064         case 'e':
00065             freq = 311.12698;
00066             break ;
00067         case 'E':
00068             freq = 329.62755;
00069             break ;
00070         case 'F':
00071             freq = 349.22823;
00072             break;
00073         case 'g':
00074             freq = 369.99442;
00075             break ;
00076         case 'G': 
00077             freq = 391.99543;
00078             break ;                                          
00079         case 'R':
00080             freq = 0.0;
00081             break ;                                                  
00082         default:
00083             freq = 440;
00084     }
00085 
00086     switch ( s ){
00087         case 6:
00088             f = freq * 4.0 ;
00089             break;
00090         case 5:
00091             f = freq * 2.0 ;
00092             break;
00093         case 4:
00094             f = freq;
00095             break;
00096         case 3: 
00097             f = freq / 2.0 ;
00098             break;
00099         case 2:
00100             f = freq / 4.0;
00101             break; 
00102         default:
00103             f = freq ;
00104         break ;
00105     }
00106     
00107     scale = 1.0/(2.0*f);
00108  
00109 //    printf("scale=%lf\tf=%f\tfreq=%f\tlength=%lf\n",scale,f,freq,length);
00110 //     printf("f*length=%lf\tfreq=%lf\t%lf \n",f*length,freq,scale);
00111     
00112         for(int i = 0 ; i <= (int)( f * length ) ; i++ ){
00113             _out = 1;
00114             wait(scale) ;
00115             _out = 0 ;
00116             wait(scale) ;
00117         }   
00118 }