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

Dependents:   kitchenTimer LPC1114FN28_kitchenTimer_Clock

Fork of Sound by suu pen

Committer:
suupen
Date:
Wed Nov 16 12:40:22 2011 +0000
Revision:
4:dc8c3e896c80
Parent:
3:2f5107cb0589
Child:
5:9d861f258467

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:e3f005984c2a 1 /***********************************************************************/
suupen 0:e3f005984c2a 2 /* */
suupen 0:e3f005984c2a 3 /* Sound.h */
suupen 0:e3f005984c2a 4 /* */
suupen 0:e3f005984c2a 5 /* V0.1 : 2011/11/13 */
suupen 0:e3f005984c2a 6 /***********************************************************************/
suupen 0:e3f005984c2a 7 #ifndef _SOUND_H
suupen 0:e3f005984c2a 8 #define _SOUND_H
suupen 0:e3f005984c2a 9
suupen 0:e3f005984c2a 10 #include <string>
suupen 0:e3f005984c2a 11 #include "types.h"
suupen 0:e3f005984c2a 12
suupen 0:e3f005984c2a 13
suupen 0:e3f005984c2a 14 /** Sound output control class, based on a PwmOut
suupen 0:e3f005984c2a 15 *
suupen 0:e3f005984c2a 16 * Example:
suupen 0:e3f005984c2a 17 * @code
suupen 0:e3f005984c2a 18 * // Continuously sweep the servo through it's full range
suupen 0:e3f005984c2a 19 *
suupen 0:e3f005984c2a 20 *#include "mbed.h"
suupen 0:e3f005984c2a 21 *#include "pwmSound.h" // pwm sound library header
suupen 0:e3f005984c2a 22 *
suupen 0:e3f005984c2a 23 *Sound sound(p21, p10); // 1tu me no sound syuturyoku (pwmOut = p21, digitalOut = p10)
suupen 0:e3f005984c2a 24 *
suupen 4:dc8c3e896c80 25 *
suupen 4:dc8c3e896c80 26 * <scematic>
suupen 4:dc8c3e896c80 27 *
suupen 4:dc8c3e896c80 28 * -------- _/
suupen 4:dc8c3e896c80 29 * mbed(p21) -----|R:200ohm|----| | speaker
suupen 4:dc8c3e896c80 30 * pwmOut --------
suupen 4:dc8c3e896c80 31 * | |
suupen 4:dc8c3e896c80 32 * mbed(p10) -------------------|_|
suupen 4:dc8c3e896c80 33 * digitalOut \
suupen 4:dc8c3e896c80 34 *
suupen 0:e3f005984c2a 35 * //--------------------------------
suupen 0:e3f005984c2a 36 * // "westminster chime" merody data
suupen 0:e3f005984c2a 37 * //--------------------------------
suupen 0:e3f005984c2a 38 * const Sound::sound_t WESTMINSTER[] = {
suupen 0:e3f005984c2a 39 * // hanon siji 0:b(flat) 1:tujo 2:#(sharp)
suupen 0:e3f005984c2a 40 * // | C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji) 0xFF=end data
suupen 0:e3f005984c2a 41 * // | | time (1/1[ms]/count)
suupen 0:e3f005984c2a 42 * // | | | envelope(yoin) (1/1 [ms]/count)
suupen 0:e3f005984c2a 43 * // | | | |
suupen 0:e3f005984c2a 44 * {1,0xA4,1200,1000},
suupen 0:e3f005984c2a 45 * {1,0xF4,1200,1000},
suupen 0:e3f005984c2a 46 * {1,0x94,1200,1000},
suupen 0:e3f005984c2a 47 * {1,0xC4,2400,1000},
suupen 0:e3f005984c2a 48 *
suupen 0:e3f005984c2a 49 * {1,0xC4,1200,1000},
suupen 0:e3f005984c2a 50 * {1,0x94,1200,1000},
suupen 0:e3f005984c2a 51 * {1,0xA4,1200,1000},
suupen 0:e3f005984c2a 52 * {1,0xF4,2400,1000},
suupen 0:e3f005984c2a 53 *
suupen 0:e3f005984c2a 54 * {1,0xFF,1000,0}, // end
suupen 0:e3f005984c2a 55 * };
suupen 0:e3f005984c2a 56 *
suupen 0:e3f005984c2a 57 * /--------------------------------------
suupen 0:e3f005984c2a 58 ** main
suupen 0:e3f005984c2a 59 * /---------------------------------------
suupen 0:e3f005984c2a 60 *int main() {
suupen 0:e3f005984c2a 61 *
suupen 0:e3f005984c2a 62 * //---------------------
suupen 0:e3f005984c2a 63 * // enso data no settei
suupen 0:e3f005984c2a 64 * //---------------------
suupen 0:e3f005984c2a 65 * // sound.sound_enso("/local/enso.txt"); // mbed local file data "enso.txt" load (sita ni data no rei wo oite oku)
suupen 0:e3f005984c2a 66 * sound.sound_enso((Sound::sound_t*)DEMEKIN);
suupen 0:e3f005984c2a 67 *
suupen 0:e3f005984c2a 68 * while(1) {
suupen 0:e3f005984c2a 69 *
suupen 0:e3f005984c2a 70 * //---------------------------------------------------
suupen 0:e3f005984c2a 71 * // tanon syuturyoku no ato ni westminster chime enso
suupen 0:e3f005984c2a 72 * //---------------------------------------------------
suupen 0:e3f005984c2a 73 * if(sound.sound_enso() == false){
suupen 0:e3f005984c2a 74 * //sound2.sound_enso((Sound::sound_t*)RAMEN);
suupen 0:e3f005984c2a 75 *
suupen 0:e3f005984c2a 76 *
suupen 0:e3f005984c2a 77 * // tanon1
suupen 0:e3f005984c2a 78 * Sound::sound_t oto = {1,0x95,200,100};
suupen 0:e3f005984c2a 79 * sound.sound_sound(oto);
suupen 0:e3f005984c2a 80 * while(sound.sound_sound() == true){}
suupen 0:e3f005984c2a 81 *
suupen 0:e3f005984c2a 82 * // tanon2
suupen 0:e3f005984c2a 83 * oto.hanon = 1; oto.onkai = 0xA5; oto.time = 2000; oto.envelope = 1000;
suupen 0:e3f005984c2a 84 * sound.sound_sound(oto);
suupen 0:e3f005984c2a 85 * while(sound.sound_sound() == true){}
suupen 0:e3f005984c2a 86 *
suupen 0:e3f005984c2a 87 * // sai enso
suupen 0:e3f005984c2a 88 * sound.sound_enso(true);
suupen 0:e3f005984c2a 89 * }
suupen 0:e3f005984c2a 90 * }
suupen 0:e3f005984c2a 91 *}
suupen 0:e3f005984c2a 92 *
suupen 0:e3f005984c2a 93 * @endcode
suupen 0:e3f005984c2a 94 */
suupen 0:e3f005984c2a 95
suupen 0:e3f005984c2a 96
suupen 0:e3f005984c2a 97
suupen 0:e3f005984c2a 98
suupen 0:e3f005984c2a 99
suupen 0:e3f005984c2a 100
suupen 0:e3f005984c2a 101
suupen 0:e3f005984c2a 102
suupen 0:e3f005984c2a 103
suupen 0:e3f005984c2a 104
suupen 0:e3f005984c2a 105
suupen 0:e3f005984c2a 106
suupen 0:e3f005984c2a 107
suupen 0:e3f005984c2a 108
suupen 0:e3f005984c2a 109 class Sound {
suupen 0:e3f005984c2a 110 public:
suupen 0:e3f005984c2a 111
suupen 1:358449cfdcd3 112 /** tone data struct
suupen 1:358449cfdcd3 113 *
suupen 1:358449cfdcd3 114 * @param uint8_t hanon : hanon siji 0:b(flat) 1:tujo 2:#(sharp)
suupen 1:358449cfdcd3 115 * @param uint16_t onkai : C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji) 0x00:hatuon teisi 0xFF:enso syuryo
suupen 1:358449cfdcd3 116 * @param uint16_t time : hatuon jikan (1/1 [ms]/count)
suupen 1:358449cfdcd3 117 * @param uint16_t envelope : yoin(envelope) jikan (1/1 [ms]/count)
suupen 1:358449cfdcd3 118 */
suupen 0:e3f005984c2a 119 typedef struct {
suupen 0:e3f005984c2a 120 uint8_t hanon; // hanon siji 0:b(flat) 1:tujo 2:#(sharp)
suupen 0:e3f005984c2a 121 uint16_t onkai; // C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji)
suupen 0:e3f005984c2a 122 // 0x00:hatuon teisi 0xFF:enso syuryo
suupen 0:e3f005984c2a 123 uint16_t time; // hatuon jikan (1/1 [ms]/count)
suupen 0:e3f005984c2a 124 uint16_t envelope; // yoin(envelope) jikan (1/1 [ms]/count)
suupen 0:e3f005984c2a 125 } sound_t;
suupen 0:e3f005984c2a 126
suupen 0:e3f005984c2a 127 /*
suupen 0:e3f005984c2a 128 // hanon no menber
suupen 0:e3f005984c2a 129 enum{
suupen 0:e3f005984c2a 130 Z_hanonF = 0, // b
suupen 0:e3f005984c2a 131 Z_hanonN , // tujo
suupen 0:e3f005984c2a 132 Z_hanonS, // #
suupen 0:e3f005984c2a 133 };
suupen 0:e3f005984c2a 134 */
suupen 0:e3f005984c2a 135
suupen 0:e3f005984c2a 136 /** Create a sound object connected to the specified PwmOut pin & DigitalOut pin
suupen 0:e3f005984c2a 137 *
suupen 0:e3f005984c2a 138 * @param pin PwmOut pin to connect to
suupen 0:e3f005984c2a 139 * @param pin DigitalOut pin to connect to
suupen 0:e3f005984c2a 140 */
suupen 0:e3f005984c2a 141 Sound(PinName pwm , PinName kijun);
suupen 0:e3f005984c2a 142
suupen 1:358449cfdcd3 143 /** Check tone
suupen 0:e3f005984c2a 144 *
suupen 2:ed8a182cefe2 145 * @param return A bool ture : output
suupen 3:2f5107cb0589 146 * \\false: none
suupen 0:e3f005984c2a 147 */
suupen 0:e3f005984c2a 148 bool sound_sound(void); // oto no syuturyoku jotai wo kakunin
suupen 0:e3f005984c2a 149 // true : oto ari false : oto nasi
suupen 1:358449cfdcd3 150 /** output tone
suupen 1:358449cfdcd3 151 *
suupen 1:358449cfdcd3 152 * @param sound_t data : tone data set
suupen 1:358449cfdcd3 153 */
suupen 0:e3f005984c2a 154 void sound_sound(sound_t data); // oto no syuturyoku
suupen 0:e3f005984c2a 155 // para : oto no data
suupen 0:e3f005984c2a 156
suupen 1:358449cfdcd3 157 /** merody data set (file data)
suupen 1:358449cfdcd3 158 *
suupen 1:358449cfdcd3 159 * @param merody data file path and name (example : "/local/merodyFileName.txt")
suupen 1:358449cfdcd3 160 */
suupen 0:e3f005984c2a 161 bool sound_enso(char *path); // enso data wo file kara yomikomi
suupen 0:e3f005984c2a 162 // true : data kakunou OK false: data kakunou NG
suupen 1:358449cfdcd3 163 /** merody data set (data table)
suupen 1:358449cfdcd3 164 *
suupen 1:358449cfdcd3 165 * @param merody data table name (example : "(Sound::sound_t*)WESTMINSTER")
suupen 1:358449cfdcd3 166 */
suupen 0:e3f005984c2a 167 void sound_enso(Sound::sound_t* onpudata); // enso data wo program no data table kara yomikomi
suupen 1:358449cfdcd3 168
suupen 1:358449cfdcd3 169 /** check merody
suupen 1:358449cfdcd3 170 *
suupen 1:358449cfdcd3 171 * @param raturn ture:merody output //false:merody stop
suupen 1:358449cfdcd3 172 */
suupen 0:e3f005984c2a 173 bool sound_enso(void); // enso jyotai check
suupen 0:e3f005984c2a 174 // true : enso chu false : enso shuryo
suupen 1:358449cfdcd3 175 /** request merody start or stop
suupen 1:358449cfdcd3 176 *
suupen 1:358449cfdcd3 177 * @param ture:start merody //false:stop merody
suupen 1:358449cfdcd3 178 */
suupen 0:e3f005984c2a 179 void sound_enso(bool siji); // enso start / stop
suupen 0:e3f005984c2a 180 // true : enso start false : enso stop
suupen 0:e3f005984c2a 181
suupen 0:e3f005984c2a 182 //protected:
suupen 0:e3f005984c2a 183 private:
suupen 0:e3f005984c2a 184 PwmOut _pwm;
suupen 0:e3f005984c2a 185 DigitalOut _kijun;
suupen 0:e3f005984c2a 186
suupen 0:e3f005984c2a 187 Ticker sound_timer;
suupen 0:e3f005984c2a 188 Timer hatuon_jikan;
suupen 0:e3f005984c2a 189
suupen 0:e3f005984c2a 190
suupen 0:e3f005984c2a 191 #define Z_pwmSyuuki (1) // PWM syuuki (1/1[us]/count) syokichi = 1
suupen 0:e3f005984c2a 192 #define Z_pulseCheckSyuuki (20) // puls check syuuki (1/1 [us]/count) syokichi = 20 (10us ika deha pwm settei ga ijo ni naru)
suupen 0:e3f005984c2a 193
suupen 0:e3f005984c2a 194
suupen 0:e3f005984c2a 195 typedef struct{
suupen 0:e3f005984c2a 196 uint32_t syuuki; // oto no syuuki no count suu wo kioku (1/1 [us]/count)
suupen 0:e3f005984c2a 197 uint32_t jikan; // oto no syuturyoku jikan wo kanri (1/1 [us]/count)
suupen 0:e3f005984c2a 198 uint32_t envelope; // envelope counter 0 - 1000000[us](1[s])
suupen 0:e3f005984c2a 199 uint32_t shokichienvelope; // shokichi envelope counter 0 - 1000000[us](1[s])
suupen 0:e3f005984c2a 200 } soundout_t;
suupen 0:e3f005984c2a 201
suupen 0:e3f005984c2a 202
suupen 0:e3f005984c2a 203 soundout_t O_sound; // oto no syuturyoku pwm data
suupen 0:e3f005984c2a 204
suupen 0:e3f005984c2a 205 sound_t enso[100]; // mbed drive no enso data kakuno yo
suupen 0:e3f005984c2a 206 sound_t *ensoDataTable; // enso data no sento address kioku
suupen 0:e3f005984c2a 207
suupen 0:e3f005984c2a 208 void sound_out(float siji, int8_t fugo);
suupen 0:e3f005984c2a 209 void pulseCheck(void);
suupen 0:e3f005984c2a 210 uint8_t F_pwmSet; // 0:zenhan hansyuuki 1:kohan hansyuuki wo request
suupen 0:e3f005984c2a 211 uint32_t C_syuukiKeika;
suupen 0:e3f005984c2a 212 uint8_t f_muonSet; // muon ji no sound_out() syori wo kurikaesu no wo fusegu
suupen 0:e3f005984c2a 213 uint32_t C_1msProcess; // 1ms syuuki syori counter (Z_pulseCheckSyuuki/1 [us]/count))
suupen 0:e3f005984c2a 214
suupen 0:e3f005984c2a 215
suupen 0:e3f005984c2a 216 void sound_ensoSyori(void);
suupen 0:e3f005984c2a 217 int keikajikan; // 1tu no oto no keikajikan
suupen 0:e3f005984c2a 218 sound_t* onpu; // onpu data no sento address
suupen 0:e3f005984c2a 219
suupen 0:e3f005984c2a 220
suupen 0:e3f005984c2a 221 };
suupen 0:e3f005984c2a 222
suupen 0:e3f005984c2a 223
suupen 0:e3f005984c2a 224 #undef _SOUND_C
suupen 0:e3f005984c2a 225 #endif // _SOUND_H