Committer:
suupen
Date:
Sun Apr 08 03:46:12 2012 +0000
Revision:
0:a53877d0ea3d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:a53877d0ea3d 1 /* mbed Sound Library
suupen 0:a53877d0ea3d 2 * Copyright (c) 2011 suupen
suupen 0:a53877d0ea3d 3 *
suupen 0:a53877d0ea3d 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
suupen 0:a53877d0ea3d 5 * of this software and associated documentation files (the "Software"), to deal
suupen 0:a53877d0ea3d 6 * in the Software without restriction, including without limitation the rights
suupen 0:a53877d0ea3d 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
suupen 0:a53877d0ea3d 8 * copies of the Software, and to permit persons to whom the Software is
suupen 0:a53877d0ea3d 9 * furnished to do so, subject to the following conditions:
suupen 0:a53877d0ea3d 10 *
suupen 0:a53877d0ea3d 11 * The above copyright notice and this permission notice shall be included in
suupen 0:a53877d0ea3d 12 * all copies or substantial portions of the Software.
suupen 0:a53877d0ea3d 13 *
suupen 0:a53877d0ea3d 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
suupen 0:a53877d0ea3d 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
suupen 0:a53877d0ea3d 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
suupen 0:a53877d0ea3d 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
suupen 0:a53877d0ea3d 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
suupen 0:a53877d0ea3d 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
suupen 0:a53877d0ea3d 20 * THE SOFTWARE.
suupen 0:a53877d0ea3d 21 */
suupen 0:a53877d0ea3d 22
suupen 0:a53877d0ea3d 23 /***********************************************************************/
suupen 0:a53877d0ea3d 24 /* */
suupen 0:a53877d0ea3d 25 /* Sound.h */
suupen 0:a53877d0ea3d 26 /* */
suupen 0:a53877d0ea3d 27 /* V0.1 : 2012/xx/xx */
suupen 0:a53877d0ea3d 28 /***********************************************************************/
suupen 0:a53877d0ea3d 29 #ifndef _SOUND_H
suupen 0:a53877d0ea3d 30 #define _SOUND_H
suupen 0:a53877d0ea3d 31
suupen 0:a53877d0ea3d 32 #include <string>
suupen 0:a53877d0ea3d 33 #include "types.h"
suupen 0:a53877d0ea3d 34
suupen 0:a53877d0ea3d 35
suupen 0:a53877d0ea3d 36 /** Sound output control class, based on a PwmOut
suupen 0:a53877d0ea3d 37 *
suupen 0:a53877d0ea3d 38 * Example:
suupen 0:a53877d0ea3d 39 * @code
suupen 0:a53877d0ea3d 40 * // Output tone and merody
suupen 0:a53877d0ea3d 41 *
suupen 0:a53877d0ea3d 42 * #include "mbed.h"
suupen 0:a53877d0ea3d 43 * #include "Sound.h" // sound library header
suupen 0:a53877d0ea3d 44 *
suupen 0:a53877d0ea3d 45 * Sound sound(p21, p10); // 1tu me no sound syuturyoku (pwmOut = p21, digitalOut = p10)
suupen 0:a53877d0ea3d 46 *
suupen 0:a53877d0ea3d 47 *
suupen 0:a53877d0ea3d 48 * <scematic>
suupen 0:a53877d0ea3d 49 *
suupen 0:a53877d0ea3d 50 * -------- _/
suupen 0:a53877d0ea3d 51 * mbed(p21) -----|R:200ohm|----| | speaker
suupen 0:a53877d0ea3d 52 * pwmOut -------- | |
suupen 0:a53877d0ea3d 53 * | |
suupen 0:a53877d0ea3d 54 * mbed(p10) -------------------|_|
suupen 0:a53877d0ea3d 55 * digitalOut \
suupen 0:a53877d0ea3d 56 *
suupen 0:a53877d0ea3d 57 * //--------------------------------
suupen 0:a53877d0ea3d 58 * // "westminster chime" merody data
suupen 0:a53877d0ea3d 59 * //--------------------------------
suupen 0:a53877d0ea3d 60 * const Sound::sound_t WESTMINSTER[] = {
suupen 0:a53877d0ea3d 61 * // hanon siji 0:b(flat) 1:tujo 2:#(sharp)
suupen 0:a53877d0ea3d 62 * // | C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji) 0xFF=end data
suupen 0:a53877d0ea3d 63 * // | | time (1/1[ms]/count)
suupen 0:a53877d0ea3d 64 * // | | | envelope(yoin) (1/1 [ms]/count)
suupen 0:a53877d0ea3d 65 * // | | | |
suupen 0:a53877d0ea3d 66 * {1,0xA4,1200,1000},
suupen 0:a53877d0ea3d 67 * {1,0xF4,1200,1000},
suupen 0:a53877d0ea3d 68 * {1,0x94,1200,1000},
suupen 0:a53877d0ea3d 69 * {1,0xC4,2400,1000},
suupen 0:a53877d0ea3d 70 *
suupen 0:a53877d0ea3d 71 * {1,0xC4,1200,1000},
suupen 0:a53877d0ea3d 72 * {1,0x94,1200,1000},
suupen 0:a53877d0ea3d 73 * {1,0xA4,1200,1000},
suupen 0:a53877d0ea3d 74 * {1,0xF4,2400,1000},
suupen 0:a53877d0ea3d 75 *
suupen 0:a53877d0ea3d 76 * {1,0xFF,1000,0}, // end
suupen 0:a53877d0ea3d 77 * };
suupen 0:a53877d0ea3d 78 *
suupen 0:a53877d0ea3d 79 * /--------------------------------------
suupen 0:a53877d0ea3d 80 * * main
suupen 0:a53877d0ea3d 81 * /---------------------------------------
suupen 0:a53877d0ea3d 82 * int main() {
suupen 0:a53877d0ea3d 83 *
suupen 0:a53877d0ea3d 84 * //---------------------
suupen 0:a53877d0ea3d 85 * // enso data no settei
suupen 0:a53877d0ea3d 86 * //---------------------
suupen 0:a53877d0ea3d 87 * // sound.sound_enso("/local/enso.txt"); // mbed local file data "enso.txt" load (sita ni data no rei wo oite oku)
suupen 0:a53877d0ea3d 88 * sound.sound_enso((Sound::sound_t*)WESTMINSTER);
suupen 0:a53877d0ea3d 89 *
suupen 0:a53877d0ea3d 90 * //---------------------------------------------------
suupen 0:a53877d0ea3d 91 * // output tone
suupen 0:a53877d0ea3d 92 * //---------------------------------------------------
suupen 0:a53877d0ea3d 93 * // tone1
suupen 0:a53877d0ea3d 94 * Sound::sound_t oto = {1,0x95,200,100};
suupen 0:a53877d0ea3d 95 * sound.sound_sound(oto);
suupen 0:a53877d0ea3d 96 * while(sound.sound_sound() == true){}
suupen 0:a53877d0ea3d 97 *
suupen 0:a53877d0ea3d 98 * // tone2
suupen 0:a53877d0ea3d 99 * oto.hanon = 1; oto.onkai = 0xA5; oto.time = 2000; oto.envelope = 1000;
suupen 0:a53877d0ea3d 100 * sound.sound_sound(oto);
suupen 0:a53877d0ea3d 101 * while(sound.sound_sound() == true){}
suupen 0:a53877d0ea3d 102 *
suupen 0:a53877d0ea3d 103 * //---------------
suupen 0:a53877d0ea3d 104 * // output merody
suupen 0:a53877d0ea3d 105 * //--------------
suupen 0:a53877d0ea3d 106 * sound.sound_enso(true);
suupen 0:a53877d0ea3d 107 *
suupen 0:a53877d0ea3d 108 * while(1) {
suupen 0:a53877d0ea3d 109 * }
suupen 0:a53877d0ea3d 110 *}
suupen 0:a53877d0ea3d 111 *
suupen 0:a53877d0ea3d 112 * @endcode
suupen 0:a53877d0ea3d 113 */
suupen 0:a53877d0ea3d 114
suupen 0:a53877d0ea3d 115
suupen 0:a53877d0ea3d 116
suupen 0:a53877d0ea3d 117
suupen 0:a53877d0ea3d 118
suupen 0:a53877d0ea3d 119
suupen 0:a53877d0ea3d 120
suupen 0:a53877d0ea3d 121
suupen 0:a53877d0ea3d 122
suupen 0:a53877d0ea3d 123
suupen 0:a53877d0ea3d 124
suupen 0:a53877d0ea3d 125
suupen 0:a53877d0ea3d 126
suupen 0:a53877d0ea3d 127
suupen 0:a53877d0ea3d 128 class Sound {
suupen 0:a53877d0ea3d 129 public:
suupen 0:a53877d0ea3d 130
suupen 0:a53877d0ea3d 131 /** tone data struct
suupen 0:a53877d0ea3d 132 *
suupen 0:a53877d0ea3d 133 * @param uint8_t hanon : hanon siji 0:b(flat) 1:tujo 2:#(sharp)
suupen 0:a53877d0ea3d 134 * @param uint16_t onkai : C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji) 0x00:hatuon teisi 0xFF:enso syuryo
suupen 0:a53877d0ea3d 135 * @param uint16_t time : hatuon jikan (1/1 [ms]/count)
suupen 0:a53877d0ea3d 136 * @param uint16_t envelope : yoin(envelope) jikan (1/1 [ms]/count)
suupen 0:a53877d0ea3d 137 */
suupen 0:a53877d0ea3d 138 typedef struct {
suupen 0:a53877d0ea3d 139 uint8_t hanon; // hanon siji 0:b(flat) 1:tujo 2:#(sharp)
suupen 0:a53877d0ea3d 140 uint16_t onkai; // C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji)
suupen 0:a53877d0ea3d 141 // 0x00:hatuon teisi 0xFF:enso syuryo
suupen 0:a53877d0ea3d 142 uint16_t time; // hatuon jikan (1/1 [ms]/count)
suupen 0:a53877d0ea3d 143 uint16_t envelope; // yoin(envelope) jikan (1/1 [ms]/count)
suupen 0:a53877d0ea3d 144 } sound_t;
suupen 0:a53877d0ea3d 145
suupen 0:a53877d0ea3d 146 /*
suupen 0:a53877d0ea3d 147 // hanon no menber
suupen 0:a53877d0ea3d 148 enum{
suupen 0:a53877d0ea3d 149 Z_hanonF = 0, // b
suupen 0:a53877d0ea3d 150 Z_hanonN , // tujo
suupen 0:a53877d0ea3d 151 Z_hanonS, // #
suupen 0:a53877d0ea3d 152 };
suupen 0:a53877d0ea3d 153 */
suupen 0:a53877d0ea3d 154
suupen 0:a53877d0ea3d 155 /** Create a sound object connected to the specified PwmOut pin & DigitalOut pin
suupen 0:a53877d0ea3d 156 *
suupen 0:a53877d0ea3d 157 * @param pin PwmOut pin to connect to
suupen 0:a53877d0ea3d 158 * @param pin DigitalOut pin to connect to
suupen 0:a53877d0ea3d 159 */
suupen 0:a53877d0ea3d 160 Sound(PinName pwm , PinName kijun);
suupen 0:a53877d0ea3d 161
suupen 0:a53877d0ea3d 162 /** Check tone
suupen 0:a53877d0ea3d 163 *
suupen 0:a53877d0ea3d 164 * @param return A bool ture : output
suupen 0:a53877d0ea3d 165 * \\false: none
suupen 0:a53877d0ea3d 166 */
suupen 0:a53877d0ea3d 167 bool sound_sound(void); // oto no syuturyoku jotai wo kakunin
suupen 0:a53877d0ea3d 168 // true : oto ari false : oto nasi
suupen 0:a53877d0ea3d 169 /** output tone
suupen 0:a53877d0ea3d 170 *
suupen 0:a53877d0ea3d 171 * @param sound_t data : tone data set
suupen 0:a53877d0ea3d 172 */
suupen 0:a53877d0ea3d 173 void sound_sound(sound_t data); // oto no syuturyoku
suupen 0:a53877d0ea3d 174 // para : oto no data
suupen 0:a53877d0ea3d 175
suupen 0:a53877d0ea3d 176 /** merody data set (file data)
suupen 0:a53877d0ea3d 177 *
suupen 0:a53877d0ea3d 178 * @param merody data file path and name (example : "/local/merodyFileName.txt")
suupen 0:a53877d0ea3d 179 */
suupen 0:a53877d0ea3d 180 bool sound_enso(char *path); // enso data wo file kara yomikomi
suupen 0:a53877d0ea3d 181 // true : data kakunou OK false: data kakunou NG
suupen 0:a53877d0ea3d 182 /** merody data set (data table)
suupen 0:a53877d0ea3d 183 *
suupen 0:a53877d0ea3d 184 * @param merody data table name (example : "(Sound::sound_t*)WESTMINSTER")
suupen 0:a53877d0ea3d 185 */
suupen 0:a53877d0ea3d 186 void sound_enso(Sound::sound_t* onpudata); // enso data wo program no data table kara yomikomi
suupen 0:a53877d0ea3d 187
suupen 0:a53877d0ea3d 188 /** check merody
suupen 0:a53877d0ea3d 189 *
suupen 0:a53877d0ea3d 190 * @param raturn ture:merody output //false:merody stop
suupen 0:a53877d0ea3d 191 */
suupen 0:a53877d0ea3d 192 bool sound_enso(void); // enso jyotai check
suupen 0:a53877d0ea3d 193 // true : enso chu false : enso shuryo
suupen 0:a53877d0ea3d 194 /** request merody start or stop
suupen 0:a53877d0ea3d 195 *
suupen 0:a53877d0ea3d 196 * @param ture:start merody //false:stop merody
suupen 0:a53877d0ea3d 197 */
suupen 0:a53877d0ea3d 198 void sound_enso(bool siji); // enso start / stop
suupen 0:a53877d0ea3d 199 // true : enso start false : enso stop
suupen 0:a53877d0ea3d 200
suupen 0:a53877d0ea3d 201 //protected:
suupen 0:a53877d0ea3d 202 private:
suupen 0:a53877d0ea3d 203 SPI _pwm;
suupen 0:a53877d0ea3d 204 DigitalOut _kijun;
suupen 0:a53877d0ea3d 205
suupen 0:a53877d0ea3d 206 Ticker sound_timer;
suupen 0:a53877d0ea3d 207 Timer hatuon_jikan;
suupen 0:a53877d0ea3d 208
suupen 0:a53877d0ea3d 209
suupen 0:a53877d0ea3d 210 #define Z_pwmSyuuki (1) // PWM syuuki (1/1[us]/count) syokichi = 1
suupen 0:a53877d0ea3d 211 #define Z_pwmBunkaino (16) // PWM bunkaino (1/1 [count]/count) 0:PWM=0% - 15:PWM=100% (SPI miso output bit(16bit)
suupen 0:a53877d0ea3d 212 #define Z_pulseCheckSyuuki (20) // puls check syuuki (1/1 [us]/count) syokichi = 20 (10us ika deha pwm settei ga ijo ni naru)
suupen 0:a53877d0ea3d 213
suupen 0:a53877d0ea3d 214
suupen 0:a53877d0ea3d 215 typedef struct{
suupen 0:a53877d0ea3d 216 uint32_t syuuki; // oto no syuuki no count suu wo kioku (1/1 [us]/count)
suupen 0:a53877d0ea3d 217 uint32_t jikan; // oto no syuturyoku jikan wo kanri (1/1 [us]/count)
suupen 0:a53877d0ea3d 218 uint32_t envelope; // envelope counter 0 - 1000000[us](1[s])
suupen 0:a53877d0ea3d 219 uint32_t shokichienvelope; // shokichi envelope counter 0 - 1000000[us](1[s])
suupen 0:a53877d0ea3d 220 } soundout_t;
suupen 0:a53877d0ea3d 221
suupen 0:a53877d0ea3d 222
suupen 0:a53877d0ea3d 223 soundout_t O_sound; // oto no syuturyoku pwm data
suupen 0:a53877d0ea3d 224
suupen 0:a53877d0ea3d 225 sound_t enso[100]; // mbed drive no enso data kakuno yo
suupen 0:a53877d0ea3d 226 sound_t *ensoDataTable; // enso data no sento address kioku
suupen 0:a53877d0ea3d 227
suupen 0:a53877d0ea3d 228 void sound_out(float siji, int8_t fugo);
suupen 0:a53877d0ea3d 229 void pulseCheck(void);
suupen 0:a53877d0ea3d 230 uint8_t F_pwmSet; // 0:zenhan hansyuuki 1:kohan hansyuuki wo request
suupen 0:a53877d0ea3d 231 uint32_t C_syuukiKeika;
suupen 0:a53877d0ea3d 232 uint8_t f_muonSet; // muon ji no sound_out() syori wo kurikaesu no wo fusegu
suupen 0:a53877d0ea3d 233 uint32_t C_1msProcess; // 1ms syuuki syori counter (Z_pulseCheckSyuuki/1 [us]/count))
suupen 0:a53877d0ea3d 234 uint16_t D_SPIpwm; // SPI pwm no output data pwm 0 = 0x0000, pwm 1/15 = 0x0001, pwm 2/15 = 0x0003, ... , pwm 14/15 = 0x7FFF, pwm 15/15 = 0xFFFF
suupen 0:a53877d0ea3d 235
suupen 0:a53877d0ea3d 236
suupen 0:a53877d0ea3d 237 void sound_ensoSyori(void);
suupen 0:a53877d0ea3d 238 int keikajikan; // 1tu no oto no keikajikan
suupen 0:a53877d0ea3d 239 sound_t* onpu; // onpu data no sento address
suupen 0:a53877d0ea3d 240
suupen 0:a53877d0ea3d 241
suupen 0:a53877d0ea3d 242 };
suupen 0:a53877d0ea3d 243
suupen 0:a53877d0ea3d 244
suupen 0:a53877d0ea3d 245 #undef _SOUND_C
suupen 0:a53877d0ea3d 246 #endif // _SOUND_H