Hirotaka Yoneda / beep_sound

Dependents:   kiokuryoku_game escapeFromYou junirobo_sample001 ROBOX_Sample_IRcon ... more

Committer:
RBH
Date:
Sat Oct 08 17:05:44 2016 +0000
Revision:
7:5f1b0adb25ec
Parent:
6:adb925f93199
Child:
8:26cb94806201
???????????????

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