以前のLibraryでは、スピーカ出力にPWM,DigitalOutを使いましたが、これは、両方ともPWMにしたものです。LPC1114FN28ではDigitalOutにノイズが乗ることがありその対応です。

Dependents:   kitchenTimer LPC1114FN28_kitchenTimer_Clock

Fork of Sound by suu pen

Sound.h

Committer:
suupen
Date:
2013-11-10
Revision:
15:7e1945a135d7
Parent:
14:027fe57d3491

File content as of revision 15:7e1945a135d7:

/* mbed Sound Library
 * Copyright (c) 2011 suupen
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/***********************************************************************/
/*                                                                     */
/*    Sound.h                                                          */
/*                                                                     */
/*    Sound.c V0.4 base                                                */
/*    V0.1 : @SS131027 DigitalOut wo PWMOut ni henko(Noise taisaku)   */
/*                       koreha LPC1114FN28 no taio                    */
/*                      Sound end no stop syori                        */ 
/*    V0.2 : @SS131110  fixed the bug in the output end processing     */  
/***********************************************************************/
#ifndef _SOUND_H
#define _SOUND_H

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


/** Sound output control class, based on a PwmOut
*
* Example:
* @code
* // Output tone and merody 
*
* #include "mbed.h"
* #include "Sound.h"       // sound library header
*
*------------------------------------
* <LPC1768>
* Sound sound(p21, p23);      // 1tu me no sound syuturyoku (pwmOut = p21,  digitalOut = p23)
*
*
* <scematic>
*                                  
*                  --------      _/
*  mbed(p21) -----|R:200ohm|----| |  speaker
*       pwmOut     --------     | | 
*                               | |
*  mbed(p23) -------------------|_|
*       digitalOut(Use PwmOut)     \
*
*------------------------------------
* <LPC1114FN28>
* Sound sound(dp1, dp2);      // 1tu me no sound syuturyoku (pwmOut = dp1,  digitalOut = dp2)
*
*
* <scematic>
*                                  
*                  --------      _/
*  mbed(dp1) -----|R:200ohm|----| |  speaker
*       pwmOut     --------     | | 
*                               | |
*  mbed(dp2) -------------------|_|
*       digitalOut(Use PwmOut)    \
*
* //--------------------------------
* // "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*)WESTMINSTER);
*    
*    //---------------------------------------------------
*    // output tone
*    //---------------------------------------------------
*    // tone1 
*    Sound::sound_t oto = {1,0x95,200,100};
*    sound.sound_sound(oto);
*    while(sound.sound_sound() == true){}
*            
*    // tone2
*    oto.hanon = 1; oto.onkai = 0xA5; oto.time = 2000; oto.envelope = 1000;
*    sound.sound_sound(oto);
*    while(sound.sound_sound() == true){}
*
*    //---------------
*    // output merody
*    //--------------
*    sound.sound_enso(true);
*
*    while(1) {
*    }
*}
*
* @endcode
*/


class Sound {
public:

/** tone data struct
*
* @param uint8_t hanon      :  hanon siji 0:b(flat)   1:tujo  2:#(sharp)
* @param uint16_t onkai     : C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji)    0x00:hatuon teisi    0xFF:enso syuryo
* @param uint16_t time      : hatuon jikan (1/1 [ms]/count)
* @param uint16_t envelope  : yoin(envelope) jikan (1/1 [ms]/count)
*/
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 tone
    *
    * @param return A bool ture : output 
    *      \\false: none
    */
    bool sound_sound(void);                     // oto no syuturyoku jotai wo kakunin
                                                //      true : oto ari     false : oto nasi
    /** output tone
    *
    * @param sound_t data : tone data set
    */
    void sound_sound(sound_t data);             // oto no syuturyoku
                                                //      para : oto no data
    
    /** merody data set (file data)
    *
    * @param merody data file path and name  (example : "/local/merodyFileName.txt")
    */
    bool sound_enso(char *path);                 // enso data wo file kara yomikomi
                                                 //     true : data kakunou OK    false: data kakunou NG
    /** merody data set (data table)
    *
    * @param merody data table name  (example : "(Sound::sound_t*)WESTMINSTER")
    */
    void sound_enso(Sound::sound_t* onpudata);   // enso data wo program no data table kara yomikomi

    /** check merody
    *
    * @param raturn ture:merody output  //false:merody stop
    */
    bool sound_enso(void);                       // enso jyotai check
                                                 //     true : enso chu    false : enso shuryo
    /** request merody start or stop
    *
    * @param ture:start merody //false:stop merody
    */
    void sound_enso(bool siji);                  // enso start / stop
                                                 //     true : enso start  false : enso stop
    
//protected:    
private:
    PwmOut _pwm;
    PwmOut _kijun;  //131027
//131027    DigitalOut _kijun;  //131027
    
    Ticker sound_timer;
    Timer hatuon_jikan;



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

// LPC1114FN28 taiou notameni syori wo osokusuru.   //131020
#define Z_pwmSyuuki (10)             // PWM syuuki           (1/1[us]/count)     syokichi = 10
#define Z_pulseCheckSyuuki (40)     // puls check syuuki    (1/1 [us]/count)    syokichi = 40 (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