User | Revision | Line number | New 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
|