Hirotaka Yoneda / beep_sound

Dependents:   kiokuryoku_game escapeFromYou junirobo_sample001 ROBOX_Sample_IRcon ... more

Committer:
RBH
Date:
Sat Jul 09 11:39:11 2016 +0000
Revision:
4:237b642c2ffa
Parent:
3:86238dba1529
Child:
5:a64e653b0ce1
bugfix

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