このライブラリでは、単音とメロディの出力が可能です。 In this library, you can output a single tone and melody. mbedのpwmOutとDigitalOutを使ってスピーカや圧電ブザーを直接駆動します。 directly drive speaker or buzzer and DigitalOut pwmOut using the mbed. メロディデータは、mbedのローカルにtxtファイルとして保存するか、プログラム中に配列データとして保存してください。 Melody data is either stored in a txt file on the local mbed, save it as a data array in the program.

Dependents:   kitchenTimer_Clock SoundLibraryExample_Melody_ProgramData M3PI_SuiviLigne

Sound.h

Committer:
suupen
Date:
2011-11-16
Revision:
0:e3f005984c2a
Child:
1:358449cfdcd3

File content as of revision 0:e3f005984c2a:

/***********************************************************************/
/*                                                                     */
/*    Sound.h                                                       */
/*                                                                     */
/*    V0.1 : 2011/11/13                                                */
/***********************************************************************/
#ifndef _SOUND_H
#define _SOUND_H

#include <string>
#include "types.h"


/** Sound output control class, based on a PwmOut
*
* Example:
* @code
* // Continuously sweep the servo through it's full range
*
*#include "mbed.h"
*#include "pwmSound.h"       // pwm sound library header
*
*Sound sound(p21, p10);      // 1tu me no sound syuturyoku (pwmOut = p21,  digitalOut = p10)
*
* //--------------------------------
* // "westminster chime" merody data
* //--------------------------------
*    const Sound::sound_t WESTMINSTER[] =     {
*    //   hanon siji 0:b(flat)   1:tujo  2:#(sharp)
*    //   |  C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji)  0xFF=end data
*    //   |  |   time (1/1[ms]/count)   
*    //   |  |   |    envelope(yoin) (1/1 [ms]/count)
*    //   |  |   |    |
*        {1,0xA4,1200,1000},
*        {1,0xF4,1200,1000},
*        {1,0x94,1200,1000},
*        {1,0xC4,2400,1000},
*
*        {1,0xC4,1200,1000},
*        {1,0x94,1200,1000},
*        {1,0xA4,1200,1000},
*        {1,0xF4,2400,1000},
*      
*        {1,0xFF,1000,0},    // end
*    };
*
* /--------------------------------------
** main
* /---------------------------------------
*int main() {
*
* //---------------------
* // enso data no settei
* //---------------------
* //    sound.sound_enso("/local/enso.txt");     // mbed local file data "enso.txt" load (sita ni data no rei wo oite oku)
*    sound.sound_enso((Sound::sound_t*)DEMEKIN);
*    
*    while(1) {
*
*        //---------------------------------------------------
*        // tanon syuturyoku no ato ni westminster chime enso
*        //---------------------------------------------------
*        if(sound.sound_enso() == false){
*        //sound2.sound_enso((Sound::sound_t*)RAMEN);
*
*
*            // tanon1 
*            Sound::sound_t oto = {1,0x95,200,100};
*            sound.sound_sound(oto);
*            while(sound.sound_sound() == true){}
*            
*            // tanon2
*            oto.hanon = 1; oto.onkai = 0xA5; oto.time = 2000; oto.envelope = 1000;
*            sound.sound_sound(oto);
*            while(sound.sound_sound() == true){}
*
*            // sai enso
*            sound.sound_enso(true);
*        }
*    }
*}
*
* @endcode
*/














class Sound {
public:


typedef struct {
    uint8_t     hanon;      // hanon siji 0:b(flat)   1:tujo  2:#(sharp)
    uint16_t    onkai;      // C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji)
                            // 0x00:hatuon teisi    0xFF:enso syuryo
    uint16_t  time;         // hatuon jikan (1/1 [ms]/count)
    uint16_t  envelope;     // yoin(envelope) jikan (1/1 [ms]/count)
} sound_t;

/*
// hanon no menber
enum{
    Z_hanonF = 0,    // b
    Z_hanonN ,        // tujo
    Z_hanonS,        // #
};
*/

    /** Create a sound object connected to the specified PwmOut pin & DigitalOut pin
    *
    * @param pin PwmOut pin to connect to 
    * @param pin DigitalOut pin to connect to
    */
    Sound(PinName pwm , PinName kijun);

    /** Check sound output
    *
    * @param return A bool ture : output\\false: none
    */
    bool sound_sound(void);                     // oto no syuturyoku jotai wo kakunin
                                                //      true : oto ari     false : oto nasi
    void sound_sound(sound_t data);             // oto no syuturyoku
                                                //      para : oto no data
    
    bool sound_enso(char *path);                 // enso data wo file kara yomikomi
                                                 //     true : data kakunou OK    false: data kakunou NG
    void sound_enso(Sound::sound_t* onpudata);   // enso data wo program no data table kara yomikomi
    bool sound_enso(void);                       // enso jyotai check
                                                 //     true : enso chu    false : enso shuryo
    void sound_enso(bool siji);                  // enso start / stop
                                                 //     true : enso start  false : enso stop
    
//protected:    
private:
    PwmOut _pwm;
    DigitalOut _kijun;
    
    Ticker sound_timer;
    Timer hatuon_jikan;


#define Z_pwmSyuuki (1)             // PWM syuuki           (1/1[us]/count)     syokichi = 1
#define Z_pulseCheckSyuuki (20)     // puls check syuuki    (1/1 [us]/count)    syokichi = 20 (10us ika deha pwm settei ga ijo ni naru)


typedef struct{
    uint32_t syuuki;    // oto no syuuki no count suu wo kioku (1/1 [us]/count)
    uint32_t jikan;     // oto no syuturyoku jikan wo kanri    (1/1 [us]/count)
    uint32_t envelope;  // envelope counter 0 - 1000000[us](1[s])
    uint32_t shokichienvelope;  // shokichi envelope counter 0 - 1000000[us](1[s])
} soundout_t;


soundout_t O_sound; // oto no syuturyoku pwm data

sound_t enso[100];      // mbed drive no enso data kakuno yo       
sound_t *ensoDataTable; // enso data no sento address kioku

    void sound_out(float siji, int8_t fugo);
    void pulseCheck(void);
        uint8_t F_pwmSet;    // 0:zenhan hansyuuki 1:kohan hansyuuki  wo request 
        uint32_t C_syuukiKeika;
        uint8_t f_muonSet;           // muon ji no sound_out() syori wo kurikaesu no wo fusegu
        uint32_t C_1msProcess;   // 1ms syuuki syori counter (Z_pulseCheckSyuuki/1 [us]/count))
    
    
    void sound_ensoSyori(void);
        int keikajikan;  // 1tu no oto no keikajikan
        sound_t* onpu; // onpu data no sento address

   
};    


#undef    _SOUND_C
#endif    // _SOUND_H