Diff: SoundSPI.h
- Revision:
- 0:a53877d0ea3d
diff -r 000000000000 -r a53877d0ea3d SoundSPI.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SoundSPI.h Sun Apr 08 03:46:12 2012 +0000
@@ -0,0 +1,246 @@
+/* mbed Sound Library
+ * Copyright (c) 2011 suupen
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/***********************************************************************/
+/* */
+/* Sound.h */
+/* */
+/* V0.1 : 2012/xx/xx */
+/***********************************************************************/
+#ifndef _SOUND_H
+#define _SOUND_H
+
+#include <string>
+#include "types.h"
+
+
+/** Sound output control class, based on a PwmOut
+*
+* Example:
+* @code
+* // Output tone and merody
+*
+* #include "mbed.h"
+* #include "Sound.h" // 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:
+ SPI _pwm;
+ DigitalOut _kijun;
+
+ Ticker sound_timer;
+ Timer hatuon_jikan;
+
+
+#define Z_pwmSyuuki (1) // PWM syuuki (1/1[us]/count) syokichi = 1
+#define Z_pwmBunkaino (16) // PWM bunkaino (1/1 [count]/count) 0:PWM=0% - 15:PWM=100% (SPI miso output bit(16bit)
+#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))
+ 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
+
+
+ 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