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

Dependencies:   TextLCD mbed SDFileSystem

MySound.cpp

Committer:
sunifu
Date:
2011-02-04
Revision:
0:f0cd2b9de695

File content as of revision 0:f0cd2b9de695:

#include "MySound.h"

MySound::MySound(PinName out) : _out(out){
    _out = 0;
}

void MySound::play(char pn,int s, char l)
{
    double freq,f;
    double scale ;
    float length ;
       
    switch(l){
        case 'W':
            length = 4 ;
            break ;
        case 't':
            length = 3;
            break ;
        case 'D':
            length = 2 ;
            break;  
        case 'Q':
            length = 1;
            break;
        case 'q':
            length = 1.5;
            break;
        case 'E':
            length = 0.5;
            break;
        case 'S':
            length = 0.25;
            break;           
        case 'T':
            length = 0.125;
            break;
        default:
            length = 1;
    }

    switch(pn){
        case 'a':  
            freq = 415.30469 ;
            break; 
        case 'A':
            freq = 440.0;
            break ;
        case 'b':
            freq = 466.16876;
            break;
        case 'B': 
            freq = 493.88330;
            break ;
        case 'C':
            freq = 261.62556;
            break ;
        case 'd': 
            freq = 277.18263;
            break ;
        case 'D':
            freq = 293.66476;
            break;
        case 'e':
            freq = 311.12698;
            break ;
        case 'E':
            freq = 329.62755;
            break ;
        case 'F':
            freq = 349.22823;
            break;
        case 'g':
            freq = 369.99442;
            break ;
        case 'G': 
            freq = 391.99543;
            break ;                                          
        case 'R':
            freq = 0.0;
            break ;                                                  
        default:
            freq = 440;
    }

    switch ( s ){
        case 6:
            f = freq * 4.0 ;
            break;
        case 5:
            f = freq * 2.0 ;
            break;
        case 4:
            f = freq;
            break;
        case 3: 
            f = freq / 2.0 ;
            break;
        case 2:
            f = freq / 4.0;
            break; 
        default:
            f = freq ;
        break ;
    }
    
    scale = 1.0/(2.0*f);
 
//    printf("scale=%lf\tf=%f\tfreq=%f\tlength=%lf\n",scale,f,freq,length);
//     printf("f*length=%lf\tfreq=%lf\t%lf \n",f*length,freq,scale);
    
        for(int i = 0 ; i <= (int)( f * length ) ; i++ ){
            _out = 1;
            wait(scale) ;
            _out = 0 ;
            wait(scale) ;
        }   
}