以前のLibraryでは、スピーカ出力にPWM,DigitalOutを使いましたが、これは、両方ともPWMにしたものです。LPC1114FN28ではDigitalOutにノイズが乗ることがありその対応です。
Dependents: kitchenTimer LPC1114FN28_kitchenTimer_Clock
Fork of Sound by
Sound.h
- Committer:
- suupen
- Date:
- 2011-11-16
- Revision:
- 6:fb02f6d9bbaf
- Parent:
- 5:9d861f258467
- Child:
- 7:758ad151b16f
File content as of revision 6:fb02f6d9bbaf:
/***********************************************************************/ /* */ /* 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) * * * <scematic> * * -------- _/ * mbed(p21) -----|R:200ohm|----| | speaker * pwmOut -------- | | * | | * mbed(p10) -------------------|_| * digitalOut \ * * //-------------------------------- * // "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; 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