Hirotaka Yoneda / beep_sound

Dependents:   kiokuryoku_game escapeFromYou junirobo_sample001 ROBOX_Sample_IRcon ... more

Committer:
RBH
Date:
Tue Jun 28 09:47:46 2016 +0000
Revision:
3:86238dba1529
Parent:
2:259899b723ab
Child:
4:237b642c2ffa
interrupt stop

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RBH 0:c9832831c73f 1 #include "beep_sound.h"
RBH 0:c9832831c73f 2 #include "math.h"
RBH 3:86238dba1529 3 #include <queue>
RBH 3:86238dba1529 4
RBH 3:86238dba1529 5
RBH 0:c9832831c73f 6 beep_sound::beep_sound(PinName pwm)
RBH 0:c9832831c73f 7 {
RBH 0:c9832831c73f 8 m_pwm = new PwmOut(pwm);
RBH 0:c9832831c73f 9 m_pwm->write(0.0f);
RBH 0:c9832831c73f 10 }
RBH 0:c9832831c73f 11
RBH 0:c9832831c73f 12 beep_sound::~beep_sound()
RBH 0:c9832831c73f 13 {
RBH 0:c9832831c73f 14 delete m_pwm;
RBH 0:c9832831c73f 15 }
RBH 0:c9832831c73f 16
RBH 3:86238dba1529 17 void beep_sound::stop(){
RBH 3:86238dba1529 18 m_pwm->write(0.0f);
RBH 3:86238dba1529 19 // キューが空でなければ次の音へ
RBH 3:86238dba1529 20 if(otoQue.empty() != 1){
RBH 3:86238dba1529 21 beep_sound::playGakuhu();
RBH 3:86238dba1529 22 }
RBH 3:86238dba1529 23 }
RBH 3:86238dba1529 24
RBH 3:86238dba1529 25 // 音の再生
RBH 3:86238dba1529 26 void beep_sound::NoteOn(int octave, int note)
RBH 3:86238dba1529 27 {
RBH 3:86238dba1529 28 frequency = frequencyTable[note] << octave;
RBH 3:86238dba1529 29 m_pwm->period(1.0f/(float)frequency);
RBH 3:86238dba1529 30 m_pwm->write(0.5f);
RBH 3:86238dba1529 31 }
RBH 3:86238dba1529 32
RBH 3:86238dba1529 33 // 1音ずつ音符情報をキューに追加
RBH 3:86238dba1529 34 void beep_sound::setGakuhu(int argOc, int argNo, float argTi)
RBH 3:86238dba1529 35 {
RBH 3:86238dba1529 36 buf.octave = argOc;
RBH 3:86238dba1529 37 buf.note = argNo;
RBH 3:86238dba1529 38 buf.time_s = argTi;
RBH 3:86238dba1529 39 otoQue.push(buf);
RBH 3:86238dba1529 40 }
RBH 3:86238dba1529 41
RBH 3:86238dba1529 42 // 休符をキューに追加
RBH 3:86238dba1529 43 void beep_sound::setKyuhu(float argTi)
RBH 3:86238dba1529 44 {
RBH 3:86238dba1529 45 buf.octave = 1000;
RBH 3:86238dba1529 46 buf.note = 0;
RBH 3:86238dba1529 47 buf.time_s = argTi;
RBH 3:86238dba1529 48 otoQue.push(buf);
RBH 3:86238dba1529 49 }
RBH 3:86238dba1529 50
RBH 3:86238dba1529 51 // 楽譜キューを再生、音停止の割り込み予約
RBH 3:86238dba1529 52 // Timeoutの日本語リファレンスには書いていないが、
RBH 3:86238dba1529 53 // thisを引数にしないとコンパイルエラーになるので注意
RBH 3:86238dba1529 54 void beep_sound::playGakuhu()
RBH 3:86238dba1529 55 {
RBH 3:86238dba1529 56 beep_sound::NoteOn(otoQue.front().octave, otoQue.front().note);
RBH 3:86238dba1529 57 interruptStop.attach(this, &beep_sound::stop, otoQue.front().time_s);
RBH 3:86238dba1529 58 otoQue.pop();
RBH 3:86238dba1529 59 }
RBH 3:86238dba1529 60
RBH 0:c9832831c73f 61 void beep_sound::SetFrequency(int octave, int note, bool on_off)
RBH 0:c9832831c73f 62 {
RBH 3:86238dba1529 63 static int preFrequency = 0;
RBH 3:86238dba1529 64 if(on_off == true){
RBH 3:86238dba1529 65 int frequency = frequencyTable[note] << octave;
RBH 3:86238dba1529 66 if(frequency != preFrequency){
RBH 3:86238dba1529 67 m_pwm->period(1.0f/(float)frequency);
RBH 3:86238dba1529 68 m_pwm->write(0.5f);
RBH 0:c9832831c73f 69 }
RBH 3:86238dba1529 70 preFrequency = frequency;
RBH 3:86238dba1529 71 }else{
RBH 3:86238dba1529 72 m_pwm->write(0.0f);
RBH 3:86238dba1529 73 preFrequency = 0;
RBH 3:86238dba1529 74 }
RBH 0:c9832831c73f 75 }
RBH 0:c9832831c73f 76
RBH 0:c9832831c73f 77 void beep_sound::onpu(int octave, int note, float time_s)
RBH 0:c9832831c73f 78 {
RBH 0:c9832831c73f 79 beep_sound::SetFrequency(octave, note, true);
RBH 0:c9832831c73f 80 wait(time_s);
RBH 0:c9832831c73f 81 beep_sound::SetFrequency(octave, note, false);
RBH 0:c9832831c73f 82 /*
RBH 0:c9832831c73f 83 if(octave >= 10){
RBH 0:c9832831c73f 84 octave -= 10;
RBH 0:c9832831c73f 85 beep_sound::SetFrequency(octave, note, true);
RBH 0:c9832831c73f 86 wait(time_s);
RBH 0:c9832831c73f 87 beep_sound::SetFrequency(octave, note, false);
RBH 0:c9832831c73f 88 }else{
RBH 0:c9832831c73f 89 beep_sound::SetFrequency(octave, note, true);
RBH 0:c9832831c73f 90 }
RBH 0:c9832831c73f 91 */
RBH 0:c9832831c73f 92 }
RBH 0:c9832831c73f 93 void beep_sound::sinwave(float center,int speed,int width)
RBH 0:c9832831c73f 94 {
RBH 3:86238dba1529 95 for(float i=0.0f;i<6.28f;i+=0.01*speed)
RBH 0:c9832831c73f 96 {
RBH 0:c9832831c73f 97 m_pwm->period(1.0f/(center+width*(float)sin(i)));
RBH 0:c9832831c73f 98 m_pwm->write(0.5f);
RBH 0:c9832831c73f 99 wait_ms(2);
RBH 0:c9832831c73f 100 }
RBH 0:c9832831c73f 101 }
RBH 0:c9832831c73f 102 void beep_sound::setwave(float frequency,float duty,float wait)
RBH 0:c9832831c73f 103 {
RBH 0:c9832831c73f 104 m_pwm->period(1.0f/(frequency));
RBH 0:c9832831c73f 105 m_pwm->write(duty);
RBH 0:c9832831c73f 106 wait_ms(wait);
RBH 0:c9832831c73f 107 }
RBH 0:c9832831c73f 108 //引数の回数だけ鳴らす
RBH 0:c9832831c73f 109 void beep_sound::beep_right(int nTimes)
RBH 0:c9832831c73f 110 {
RBH 0:c9832831c73f 111 for(int i=0; i<nTimes; i++){
RBH 0:c9832831c73f 112 beep_sound::onpu(3,11,0.1);
RBH 0:c9832831c73f 113 beep_sound::onpu(3,7,0.35);
RBH 0:c9832831c73f 114 wait(0.1);
RBH 0:c9832831c73f 115 }
RBH 0:c9832831c73f 116 }
RBH 0:c9832831c73f 117 void beep_sound::beep_wrong(int nTimes)
RBH 0:c9832831c73f 118 {
RBH 0:c9832831c73f 119 for (int i = 0; i < nTimes; i++) {
RBH 0:c9832831c73f 120 m_pwm->period(0.01f);
RBH 0:c9832831c73f 121 m_pwm->write(0.5f);
RBH 0:c9832831c73f 122 wait(0.1);
RBH 0:c9832831c73f 123 m_pwm->write(0.0f);
RBH 0:c9832831c73f 124 wait(0.1);
RBH 0:c9832831c73f 125 m_pwm->period(0.01f);
RBH 0:c9832831c73f 126 m_pwm->write(0.5f);
RBH 0:c9832831c73f 127 wait(0.35);
RBH 0:c9832831c73f 128 m_pwm->write(0.0f);
RBH 0:c9832831c73f 129 wait(0.1);
RBH 0:c9832831c73f 130 }
RBH 0:c9832831c73f 131 }
RBH 0:c9832831c73f 132 void beep_sound::beep_1up(int nTimes)
RBH 0:c9832831c73f 133 {
RBH 0:c9832831c73f 134 for (int i = 0; i < nTimes; i++) {
RBH 0:c9832831c73f 135 beep_sound::onpu(3,4,0.1);
RBH 0:c9832831c73f 136 beep_sound::onpu(3,7,0.1);
RBH 0:c9832831c73f 137 beep_sound::onpu(4,4,0.1);
RBH 0:c9832831c73f 138 beep_sound::onpu(4,0,0.1);
RBH 0:c9832831c73f 139 beep_sound::onpu(4,2,0.1);
RBH 0:c9832831c73f 140 beep_sound::onpu(4,7,0.1);
RBH 0:c9832831c73f 141 wait(0.1);
RBH 0:c9832831c73f 142 }
RBH 0:c9832831c73f 143 }
RBH 0:c9832831c73f 144 void beep_sound::beep_konbini(int nTimes)
RBH 0:c9832831c73f 145 {
RBH 0:c9832831c73f 146 for (int i = 0; i < nTimes; i++) {
RBH 0:c9832831c73f 147 beep_sound::onpu(2,6,0.2);
RBH 0:c9832831c73f 148 beep_sound::onpu(2,2,0.2);
RBH 0:c9832831c73f 149 beep_sound::onpu(1,9,0.2);
RBH 0:c9832831c73f 150 beep_sound::onpu(2,2,0.2);
RBH 0:c9832831c73f 151 beep_sound::onpu(2,4,0.2);
RBH 0:c9832831c73f 152 beep_sound::onpu(2,9,0.4);
RBH 0:c9832831c73f 153 beep_sound::onpu(1,9,0.2);
RBH 0:c9832831c73f 154 beep_sound::onpu(2,4,0.2);
RBH 0:c9832831c73f 155 beep_sound::onpu(2,6,0.2);
RBH 0:c9832831c73f 156 beep_sound::onpu(2,4,0.2);
RBH 0:c9832831c73f 157 beep_sound::onpu(1,9,0.2);
RBH 0:c9832831c73f 158 beep_sound::onpu(2,2,0.6);
RBH 0:c9832831c73f 159 wait(0.1);
RBH 0:c9832831c73f 160 }
RBH 0:c9832831c73f 161 }
RBH 2:259899b723ab 162 void beep_sound::beep_readyGo(int nTimes)
RBH 2:259899b723ab 163 {
RBH 2:259899b723ab 164 for (int i = 0; i < nTimes; i++) {
RBH 2:259899b723ab 165 beep_sound::onpu(1,0,0.5);
RBH 2:259899b723ab 166 wait(0.5);
RBH 2:259899b723ab 167 beep_sound::onpu(1,0,0.5);
RBH 2:259899b723ab 168 wait(0.5);
RBH 2:259899b723ab 169 beep_sound::onpu(1,0,0.5);
RBH 2:259899b723ab 170 wait(0.5);
RBH 2:259899b723ab 171 beep_sound::onpu(2,0,1);
RBH 2:259899b723ab 172 }
RBH 2:259899b723ab 173 }
RBH 0:c9832831c73f 174 void beep_sound::beep_encount(int nTimes)
RBH 0:c9832831c73f 175 {
RBH 0:c9832831c73f 176 for (int i = 0; i < nTimes; i++) {
RBH 0:c9832831c73f 177 beep_sound::onpu(4,0,0.08);
RBH 0:c9832831c73f 178 beep_sound::onpu(3,11,0.08);
RBH 0:c9832831c73f 179 beep_sound::onpu(3,10,0.08);
RBH 0:c9832831c73f 180 beep_sound::onpu(3,9,0.08);
RBH 0:c9832831c73f 181
RBH 0:c9832831c73f 182 beep_sound::onpu(3,10,0.08);
RBH 0:c9832831c73f 183 beep_sound::onpu(3,9,0.08);
RBH 0:c9832831c73f 184 beep_sound::onpu(3,8,0.08);
RBH 0:c9832831c73f 185 beep_sound::onpu(3,7,0.08);
RBH 0:c9832831c73f 186
RBH 0:c9832831c73f 187 beep_sound::onpu(3,8,0.08);
RBH 0:c9832831c73f 188 beep_sound::onpu(3,7,0.08);
RBH 0:c9832831c73f 189 beep_sound::onpu(3,6,0.08);
RBH 0:c9832831c73f 190 beep_sound::onpu(3,5,0.08);
RBH 0:c9832831c73f 191
RBH 0:c9832831c73f 192 beep_sound::onpu(3,6,0.08);
RBH 0:c9832831c73f 193 beep_sound::onpu(3,5,0.08);
RBH 0:c9832831c73f 194 beep_sound::onpu(3,4,0.08);
RBH 0:c9832831c73f 195 beep_sound::onpu(3,3,0.08);
RBH 0:c9832831c73f 196
RBH 0:c9832831c73f 197 beep_sound::onpu(3,4,0.08);
RBH 0:c9832831c73f 198 beep_sound::onpu(3,3,0.08);
RBH 0:c9832831c73f 199 beep_sound::onpu(3,2,0.08);
RBH 0:c9832831c73f 200 beep_sound::onpu(3,1,0.08);
RBH 0:c9832831c73f 201
RBH 0:c9832831c73f 202 beep_sound::onpu(3,2,0.08);
RBH 0:c9832831c73f 203 beep_sound::onpu(3,1,0.08);
RBH 0:c9832831c73f 204 beep_sound::onpu(3,0,0.08);
RBH 0:c9832831c73f 205 beep_sound::onpu(2,11,0.08);
RBH 0:c9832831c73f 206
RBH 0:c9832831c73f 207 beep_sound::onpu(3,0,0.08);
RBH 0:c9832831c73f 208 beep_sound::onpu(2,11,0.08);
RBH 0:c9832831c73f 209 beep_sound::onpu(2,10,0.08);
RBH 0:c9832831c73f 210 beep_sound::onpu(2,9,0.08);
RBH 0:c9832831c73f 211
RBH 0:c9832831c73f 212 beep_sound::onpu(2,10,0.08);
RBH 0:c9832831c73f 213 beep_sound::onpu(2,9,0.08);
RBH 0:c9832831c73f 214 beep_sound::onpu(2,8,0.08);
RBH 0:c9832831c73f 215 beep_sound::onpu(2,7,0.08);
RBH 0:c9832831c73f 216 }
RBH 0:c9832831c73f 217 wait(0.1);
RBH 0:c9832831c73f 218 }