Hirotaka Yoneda / beep_sound

Dependents:   kiokuryoku_game escapeFromYou junirobo_sample001 ROBOX_Sample_IRcon ... more

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