Logibotのサンプルプログラミングです

Dependencies:   mbed

Committer:
natuga117
Date:
Fri Mar 03 18:32:40 2017 +0000
Revision:
0:66a643c36c9e
Logibot????????????

Who changed what in which revision?

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