Logibotの動作用の基本ライブラリです

Dependents:   Logibot_Temp Motor_Temp

Committer:
Jrobo
Date:
Fri Mar 03 20:36:06 2017 +0000
Revision:
0:a75357df7c88
publish

Who changed what in which revision?

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