以前のLibraryでは、スピーカ出力にPWM,DigitalOutを使いましたが、これは、両方ともPWMにしたものです。LPC1114FN28ではDigitalOutにノイズが乗ることがありその対応です。
Dependents: kitchenTimer LPC1114FN28_kitchenTimer_Clock
Fork of Sound by
Diff: Sound.h
- Revision:
- 0:e3f005984c2a
- Child:
- 1:358449cfdcd3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sound.h Wed Nov 16 12:03:27 2011 +0000 @@ -0,0 +1,187 @@ +/***********************************************************************/ +/* */ +/* 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