PCM Digital Synthesizer

Dependencies:   LCD mbed

/media/uploads/p_igmon/img_1731-w480.jpg

Committer:
p_igmon
Date:
Fri Sep 02 13:24:16 2016 +0000
Revision:
0:ad6637c36dc7
for Micro Gen4 Synthesizer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p_igmon 0:ad6637c36dc7 1 #include "synthesizer.h"
p_igmon 0:ad6637c36dc7 2
p_igmon 0:ad6637c36dc7 3 #define MIDI_IDLE 0
p_igmon 0:ad6637c36dc7 4 #define MIDI_NOTEON 1
p_igmon 0:ad6637c36dc7 5 #define MIDI_NOTEOFF 2
p_igmon 0:ad6637c36dc7 6 #define MIDI_VELOCITY 3
p_igmon 0:ad6637c36dc7 7 #define MIDI_VELOCITY0 4
p_igmon 0:ad6637c36dc7 8 #define MIDI_PGMCHG 5
p_igmon 0:ad6637c36dc7 9 #define MIDI_CONTCHG 6
p_igmon 0:ad6637c36dc7 10 #define MIDI_VOLH 7
p_igmon 0:ad6637c36dc7 11 #define MIDI_VOLL 8
p_igmon 0:ad6637c36dc7 12 #define MIDI_PORH 9
p_igmon 0:ad6637c36dc7 13 #define MIDI_PORL 10
p_igmon 0:ad6637c36dc7 14 #define MIDI_PORD 24
p_igmon 0:ad6637c36dc7 15 #define MIDI_LFO1H 11
p_igmon 0:ad6637c36dc7 16 #define MIDI_LFO1L 12
p_igmon 0:ad6637c36dc7 17 #define MIDI_NOTECHG 13
p_igmon 0:ad6637c36dc7 18 #define MIDI_OTHER 14
p_igmon 0:ad6637c36dc7 19 #define MIDI_PORSW 15
p_igmon 0:ad6637c36dc7 20 #define MIDI_SETMVOL 16
p_igmon 0:ad6637c36dc7 21 #define MIDI_INCMVOL 17
p_igmon 0:ad6637c36dc7 22 #define MIDI_DECMVOL 18
p_igmon 0:ad6637c36dc7 23 #define MIDI_INCMVOL2 19
p_igmon 0:ad6637c36dc7 24 #define MIDI_DECMVOL2 20
p_igmon 0:ad6637c36dc7 25 #define MIDI_ATTACKTIME 21
p_igmon 0:ad6637c36dc7 26 #define MIDI_RELEASETIME 22
p_igmon 0:ad6637c36dc7 27 #define MIDI_DECAYTIME 23
p_igmon 0:ad6637c36dc7 28 #define MIDI_BUFSIZE 256
p_igmon 0:ad6637c36dc7 29
p_igmon 0:ad6637c36dc7 30 extern DigitalOut myled;
p_igmon 0:ad6637c36dc7 31
p_igmon 0:ad6637c36dc7 32 volatile U8 midi_com;
p_igmon 0:ad6637c36dc7 33 volatile U8 midi_ch;
p_igmon 0:ad6637c36dc7 34 volatile U8 notenum;
p_igmon 0:ad6637c36dc7 35 volatile U8 *midi_rdptr;
p_igmon 0:ad6637c36dc7 36 volatile U8 *midi_wrptr;
p_igmon 0:ad6637c36dc7 37 volatile U16 md_voltemp;
p_igmon 0:ad6637c36dc7 38 volatile U16 md_lfo1depth;
p_igmon 0:ad6637c36dc7 39 volatile S16 md_portemp;
p_igmon 0:ad6637c36dc7 40 volatile U8 midi_receivebuf[MIDI_BUFSIZE];
p_igmon 0:ad6637c36dc7 41
p_igmon 0:ad6637c36dc7 42 extern int portament;
p_igmon 0:ad6637c36dc7 43 extern GENERATOR *pgen;
p_igmon 0:ad6637c36dc7 44 extern GENERATOR *gen;// ProgramChangeによるテンポラリに変更する。
p_igmon 0:ad6637c36dc7 45 extern GENERATOR_TEMP *pgen_temp;// = &dgen_temp[0];
p_igmon 0:ad6637c36dc7 46
p_igmon 0:ad6637c36dc7 47 extern volatile U8 midi_base_ch;
p_igmon 0:ad6637c36dc7 48 extern volatile U8 midi_note_ch;
p_igmon 0:ad6637c36dc7 49 extern volatile U8 midi_prog_ch;
p_igmon 0:ad6637c36dc7 50 extern volatile S16 interpovalue;
p_igmon 0:ad6637c36dc7 51 extern volatile S16 MasterVolume;
p_igmon 0:ad6637c36dc7 52 extern volatile S16 mvoldiv;
p_igmon 0:ad6637c36dc7 53
p_igmon 0:ad6637c36dc7 54 void init_midi(void){
p_igmon 0:ad6637c36dc7 55 midi_com = MIDI_IDLE;
p_igmon 0:ad6637c36dc7 56 midi_wrptr = midi_rdptr = &midi_receivebuf[0];
p_igmon 0:ad6637c36dc7 57 }
p_igmon 0:ad6637c36dc7 58
p_igmon 0:ad6637c36dc7 59 void midi_work(void){
p_igmon 0:ad6637c36dc7 60 GENERATOR *gena;// 110824
p_igmon 0:ad6637c36dc7 61 GENERATOR_TEMP *gena_temp;// 110824
p_igmon 0:ad6637c36dc7 62 U8 i ,data;
p_igmon 0:ad6637c36dc7 63 U16 temp16;
p_igmon 0:ad6637c36dc7 64
p_igmon 0:ad6637c36dc7 65 while(midi_rdptr != midi_wrptr){
p_igmon 0:ad6637c36dc7 66 /* レシーブバッファが空なら、リターン */
p_igmon 0:ad6637c36dc7 67 data = *midi_rdptr;
p_igmon 0:ad6637c36dc7 68 if (++midi_rdptr >&midi_receivebuf[255]) midi_rdptr = &midi_receivebuf[0];//
p_igmon 0:ad6637c36dc7 69 if (data > 0xf7){
p_igmon 0:ad6637c36dc7 70 /* リアルタイムメッセージ */
p_igmon 0:ad6637c36dc7 71 if (data == 0xff){// 110824 システムリセット
p_igmon 0:ad6637c36dc7 72 //prog_enable = 0;
p_igmon 0:ad6637c36dc7 73 MasterVolume = 127 <<8 ;// s7e8f
p_igmon 0:ad6637c36dc7 74 mvoldiv = 0;
p_igmon 0:ad6637c36dc7 75 portament = 0;
p_igmon 0:ad6637c36dc7 76 // gena = pgen;
p_igmon 0:ad6637c36dc7 77 gena_temp = pgen_temp;
p_igmon 0:ad6637c36dc7 78 for(i=0;i<GENMAX;i++){
p_igmon 0:ad6637c36dc7 79 gena_temp->status = GEN_IDLE;
p_igmon 0:ad6637c36dc7 80 // ge_tempna->midich =255;
p_igmon 0:ad6637c36dc7 81 gena_temp->voltemp = 0;
p_igmon 0:ad6637c36dc7 82 // gena++;
p_igmon 0:ad6637c36dc7 83 gena_temp++;
p_igmon 0:ad6637c36dc7 84 }
p_igmon 0:ad6637c36dc7 85 }
p_igmon 0:ad6637c36dc7 86 }else if (data <0x80){
p_igmon 0:ad6637c36dc7 87 /* 何かしらの値 */
p_igmon 0:ad6637c36dc7 88 switch (midi_com){ // 有効になっているMIDIコマンドを適用する。
p_igmon 0:ad6637c36dc7 89 case MIDI_NOTEON:
p_igmon 0:ad6637c36dc7 90 notenum = data;
p_igmon 0:ad6637c36dc7 91 midi_com = MIDI_VELOCITY;
p_igmon 0:ad6637c36dc7 92 break;
p_igmon 0:ad6637c36dc7 93 case MIDI_VELOCITY:
p_igmon 0:ad6637c36dc7 94 midi_com = MIDI_NOTEON;
p_igmon 0:ad6637c36dc7 95 if (midi_ch == midi_base_ch) {
p_igmon 0:ad6637c36dc7 96 if(data >0){
p_igmon 0:ad6637c36dc7 97 /* ノートONの処理 */
p_igmon 0:ad6637c36dc7 98 noteon(notenum ,data);
p_igmon 0:ad6637c36dc7 99 }else{
p_igmon 0:ad6637c36dc7 100 /* ノートOFFの処理 */
p_igmon 0:ad6637c36dc7 101 noteoff(notenum ,0);
p_igmon 0:ad6637c36dc7 102 }
p_igmon 0:ad6637c36dc7 103 }
p_igmon 0:ad6637c36dc7 104 break;
p_igmon 0:ad6637c36dc7 105 case MIDI_NOTEOFF:
p_igmon 0:ad6637c36dc7 106 notenum = data;
p_igmon 0:ad6637c36dc7 107 midi_com = MIDI_VELOCITY0;
p_igmon 0:ad6637c36dc7 108 break;
p_igmon 0:ad6637c36dc7 109 case MIDI_VELOCITY0:
p_igmon 0:ad6637c36dc7 110 midi_com = MIDI_NOTEON;
p_igmon 0:ad6637c36dc7 111 if (midi_ch == midi_base_ch){
p_igmon 0:ad6637c36dc7 112 /* ノートOFFの処理 */
p_igmon 0:ad6637c36dc7 113 noteoff(notenum ,0);
p_igmon 0:ad6637c36dc7 114 }
p_igmon 0:ad6637c36dc7 115 break;
p_igmon 0:ad6637c36dc7 116 case MIDI_PGMCHG:
p_igmon 0:ad6637c36dc7 117 midi_com = MIDI_PGMCHG;
p_igmon 0:ad6637c36dc7 118 if (midi_ch == midi_base_ch){ //やはり 戻す 131230
p_igmon 0:ad6637c36dc7 119 // if (midi_ch == midi_prog_ch){
p_igmon 0:ad6637c36dc7 120 /* 音色変更の処理 */
p_igmon 0:ad6637c36dc7 121 pgmchg(data);
p_igmon 0:ad6637c36dc7 122 }
p_igmon 0:ad6637c36dc7 123 break;
p_igmon 0:ad6637c36dc7 124 case MIDI_CONTCHG:
p_igmon 0:ad6637c36dc7 125 switch(data){
p_igmon 0:ad6637c36dc7 126 case 90:// 121125
p_igmon 0:ad6637c36dc7 127 // if ((midi_ch == midi_base_ch)||(midi_ch == midi_base_ch2)) midi_com = MIDI_NOTECHG;
p_igmon 0:ad6637c36dc7 128 if (midi_ch == midi_base_ch) midi_com = MIDI_NOTECHG;
p_igmon 0:ad6637c36dc7 129 break;
p_igmon 0:ad6637c36dc7 130 case 1:
p_igmon 0:ad6637c36dc7 131 midi_com = MIDI_LFO1H;
p_igmon 0:ad6637c36dc7 132 break;
p_igmon 0:ad6637c36dc7 133 case 1+32:
p_igmon 0:ad6637c36dc7 134 midi_com = MIDI_LFO1L;
p_igmon 0:ad6637c36dc7 135 break;
p_igmon 0:ad6637c36dc7 136 case 5:
p_igmon 0:ad6637c36dc7 137 midi_com = MIDI_PORH;
p_igmon 0:ad6637c36dc7 138 break;
p_igmon 0:ad6637c36dc7 139 case 5+32:
p_igmon 0:ad6637c36dc7 140 midi_com = MIDI_PORL;
p_igmon 0:ad6637c36dc7 141 break;
p_igmon 0:ad6637c36dc7 142 case 38:
p_igmon 0:ad6637c36dc7 143 midi_com = MIDI_PORD;
p_igmon 0:ad6637c36dc7 144 break;
p_igmon 0:ad6637c36dc7 145 case 65:
p_igmon 0:ad6637c36dc7 146 if (midi_ch == midi_base_ch) midi_com = MIDI_PORSW;
p_igmon 0:ad6637c36dc7 147 break;
p_igmon 0:ad6637c36dc7 148 case 70:
p_igmon 0:ad6637c36dc7 149 if (midi_ch == midi_base_ch) midi_com = MIDI_SETMVOL;
p_igmon 0:ad6637c36dc7 150 break;
p_igmon 0:ad6637c36dc7 151 case 71:
p_igmon 0:ad6637c36dc7 152 if (midi_ch == midi_base_ch) midi_com = MIDI_INCMVOL;
p_igmon 0:ad6637c36dc7 153 break;
p_igmon 0:ad6637c36dc7 154 case 72:
p_igmon 0:ad6637c36dc7 155 if (midi_ch == midi_base_ch) midi_com = MIDI_DECMVOL;
p_igmon 0:ad6637c36dc7 156 break;
p_igmon 0:ad6637c36dc7 157 case 73:
p_igmon 0:ad6637c36dc7 158 if (midi_ch == midi_base_ch) midi_com = MIDI_INCMVOL2;
p_igmon 0:ad6637c36dc7 159 break;
p_igmon 0:ad6637c36dc7 160 case 74:
p_igmon 0:ad6637c36dc7 161 if (midi_ch == midi_base_ch) midi_com = MIDI_DECMVOL2;
p_igmon 0:ad6637c36dc7 162 break;
p_igmon 0:ad6637c36dc7 163 case 50:
p_igmon 0:ad6637c36dc7 164 if (midi_ch == midi_base_ch) midi_com = MIDI_ATTACKTIME;
p_igmon 0:ad6637c36dc7 165 break;
p_igmon 0:ad6637c36dc7 166 case 51:
p_igmon 0:ad6637c36dc7 167 if (midi_ch == midi_base_ch) midi_com = MIDI_RELEASETIME;
p_igmon 0:ad6637c36dc7 168 break;
p_igmon 0:ad6637c36dc7 169 case 52:
p_igmon 0:ad6637c36dc7 170 if (midi_ch == midi_base_ch) midi_com = MIDI_DECAYTIME;
p_igmon 0:ad6637c36dc7 171 break;
p_igmon 0:ad6637c36dc7 172
p_igmon 0:ad6637c36dc7 173 case 7:
p_igmon 0:ad6637c36dc7 174 midi_com = MIDI_VOLH;
p_igmon 0:ad6637c36dc7 175 break;
p_igmon 0:ad6637c36dc7 176 case 7+32:
p_igmon 0:ad6637c36dc7 177 midi_com = MIDI_VOLL;
p_igmon 0:ad6637c36dc7 178 break;
p_igmon 0:ad6637c36dc7 179 default:
p_igmon 0:ad6637c36dc7 180 midi_com = MIDI_OTHER;
p_igmon 0:ad6637c36dc7 181 break;
p_igmon 0:ad6637c36dc7 182 }
p_igmon 0:ad6637c36dc7 183 break;
p_igmon 0:ad6637c36dc7 184 case MIDI_NOTECHG:
p_igmon 0:ad6637c36dc7 185 midi_note_ch = data & 0x0f;
p_igmon 0:ad6637c36dc7 186 break;
p_igmon 0:ad6637c36dc7 187 case MIDI_LFO1H:
p_igmon 0:ad6637c36dc7 188 md_lfo1depth = data<<7;
p_igmon 0:ad6637c36dc7 189 break;
p_igmon 0:ad6637c36dc7 190 case MIDI_LFO1L:
p_igmon 0:ad6637c36dc7 191 md_lfo1depth |= data;
p_igmon 0:ad6637c36dc7 192 gena = gen;
p_igmon 0:ad6637c36dc7 193 for(i=0;i<PRGGENMAX;i++){
p_igmon 0:ad6637c36dc7 194 gena->lfo1depth = md_lfo1depth;
p_igmon 0:ad6637c36dc7 195 gena++;
p_igmon 0:ad6637c36dc7 196 }
p_igmon 0:ad6637c36dc7 197 break;
p_igmon 0:ad6637c36dc7 198 case MIDI_PORSW:
p_igmon 0:ad6637c36dc7 199 if(data < 64){
p_igmon 0:ad6637c36dc7 200 portament = 0;
p_igmon 0:ad6637c36dc7 201 }else{
p_igmon 0:ad6637c36dc7 202 portament = -1;
p_igmon 0:ad6637c36dc7 203 }
p_igmon 0:ad6637c36dc7 204 break;
p_igmon 0:ad6637c36dc7 205 case MIDI_SETMVOL:
p_igmon 0:ad6637c36dc7 206 mvoldiv = 0;
p_igmon 0:ad6637c36dc7 207 MasterVolume = data<<8;
p_igmon 0:ad6637c36dc7 208 break;
p_igmon 0:ad6637c36dc7 209 case MIDI_INCMVOL:
p_igmon 0:ad6637c36dc7 210 MasterVolume += (data<<16);
p_igmon 0:ad6637c36dc7 211 if(MasterVolume >(127<<8)) MasterVolume = (127<<8);
p_igmon 0:ad6637c36dc7 212 break;
p_igmon 0:ad6637c36dc7 213 case MIDI_DECMVOL:
p_igmon 0:ad6637c36dc7 214 MasterVolume -= (data<<16);
p_igmon 0:ad6637c36dc7 215 if(MasterVolume < 0) MasterVolume = 0;
p_igmon 0:ad6637c36dc7 216 break;
p_igmon 0:ad6637c36dc7 217 case MIDI_INCMVOL2:
p_igmon 0:ad6637c36dc7 218 mvoldiv = data;
p_igmon 0:ad6637c36dc7 219 break;
p_igmon 0:ad6637c36dc7 220 case MIDI_DECMVOL2:
p_igmon 0:ad6637c36dc7 221 mvoldiv = data * (-1);
p_igmon 0:ad6637c36dc7 222 break;
p_igmon 0:ad6637c36dc7 223
p_igmon 0:ad6637c36dc7 224 case MIDI_ATTACKTIME:
p_igmon 0:ad6637c36dc7 225 // gena = pgen;// 実体のほうで
p_igmon 0:ad6637c36dc7 226 // for(i=0;i<GENMAX;i++){
p_igmon 0:ad6637c36dc7 227 gena = gen;
p_igmon 0:ad6637c36dc7 228 for(i=0;i<PRGGENMAX;i++){
p_igmon 0:ad6637c36dc7 229 gena->attacktime = (1<<data);
p_igmon 0:ad6637c36dc7 230 gena++;
p_igmon 0:ad6637c36dc7 231 }
p_igmon 0:ad6637c36dc7 232 break;
p_igmon 0:ad6637c36dc7 233
p_igmon 0:ad6637c36dc7 234 case MIDI_RELEASETIME:
p_igmon 0:ad6637c36dc7 235 temp16 = (528 + data) * 100;
p_igmon 0:ad6637c36dc7 236 // gena = pgen;// 実体のほうで
p_igmon 0:ad6637c36dc7 237 // for(i=0;i<GENMAX;i++){
p_igmon 0:ad6637c36dc7 238 gena = gen;
p_igmon 0:ad6637c36dc7 239 for(i=0;i<PRGGENMAX;i++){
p_igmon 0:ad6637c36dc7 240 gena->releasetime = temp16;
p_igmon 0:ad6637c36dc7 241 gena++;
p_igmon 0:ad6637c36dc7 242 }
p_igmon 0:ad6637c36dc7 243 break;
p_igmon 0:ad6637c36dc7 244
p_igmon 0:ad6637c36dc7 245 case MIDI_DECAYTIME:
p_igmon 0:ad6637c36dc7 246 // gena = pgen;// 実体のほうで
p_igmon 0:ad6637c36dc7 247 // for(i=0;i<GENMAX;i++){
p_igmon 0:ad6637c36dc7 248 gena = gen;
p_igmon 0:ad6637c36dc7 249 for(i=0;i<PRGGENMAX;i++){
p_igmon 0:ad6637c36dc7 250 gena->decaytime = (1<<data);
p_igmon 0:ad6637c36dc7 251 gena++;
p_igmon 0:ad6637c36dc7 252 }
p_igmon 0:ad6637c36dc7 253 break;
p_igmon 0:ad6637c36dc7 254
p_igmon 0:ad6637c36dc7 255 case MIDI_PORH:
p_igmon 0:ad6637c36dc7 256 md_portemp = data<<9;
p_igmon 0:ad6637c36dc7 257 break;
p_igmon 0:ad6637c36dc7 258 case MIDI_PORL:
p_igmon 0:ad6637c36dc7 259 // md_portemp |= data<<1;
p_igmon 0:ad6637c36dc7 260 gena = pgen;
p_igmon 0:ad6637c36dc7 261 // gena_temp = pgen_temp;
p_igmon 0:ad6637c36dc7 262 for(i=0;i<GENMAX;i++){
p_igmon 0:ad6637c36dc7 263 gena_temp->dpf = (gena_temp->df >>14)* data;
p_igmon 0:ad6637c36dc7 264 // gena++;
p_igmon 0:ad6637c36dc7 265 gena_temp++;
p_igmon 0:ad6637c36dc7 266 }
p_igmon 0:ad6637c36dc7 267 break;
p_igmon 0:ad6637c36dc7 268 case MIDI_PORD:// Portament Down
p_igmon 0:ad6637c36dc7 269 // gena = pgen;
p_igmon 0:ad6637c36dc7 270 gena_temp = pgen_temp;
p_igmon 0:ad6637c36dc7 271 for(i=0;i<GENMAX;i++){
p_igmon 0:ad6637c36dc7 272 gena_temp->dpf = (gena_temp->df >>14)* data;
p_igmon 0:ad6637c36dc7 273 gena_temp->dpf *= -1;
p_igmon 0:ad6637c36dc7 274 // gena++;
p_igmon 0:ad6637c36dc7 275 gena_temp++;
p_igmon 0:ad6637c36dc7 276 }
p_igmon 0:ad6637c36dc7 277 break;
p_igmon 0:ad6637c36dc7 278 case MIDI_VOLH:
p_igmon 0:ad6637c36dc7 279 md_voltemp = data<<9;
p_igmon 0:ad6637c36dc7 280 break;
p_igmon 0:ad6637c36dc7 281 case MIDI_VOLL:
p_igmon 0:ad6637c36dc7 282 md_voltemp |= data<<1;
p_igmon 0:ad6637c36dc7 283 gena = gen;
p_igmon 0:ad6637c36dc7 284 for(i=0;i<PRGGENMAX;i++){
p_igmon 0:ad6637c36dc7 285 gena->lfo1depth = md_lfo1depth;
p_igmon 0:ad6637c36dc7 286 gena++;
p_igmon 0:ad6637c36dc7 287 }
p_igmon 0:ad6637c36dc7 288 break;
p_igmon 0:ad6637c36dc7 289 case MIDI_OTHER:
p_igmon 0:ad6637c36dc7 290 default:
p_igmon 0:ad6637c36dc7 291 break;
p_igmon 0:ad6637c36dc7 292 }
p_igmon 0:ad6637c36dc7 293 }else{
p_igmon 0:ad6637c36dc7 294 switch (data & 0xf0){
p_igmon 0:ad6637c36dc7 295 case 0x80:// NOTEOFF コマンド
p_igmon 0:ad6637c36dc7 296 midi_com = MIDI_NOTEOFF;
p_igmon 0:ad6637c36dc7 297 midi_ch = data & 0x0f;
p_igmon 0:ad6637c36dc7 298 break;
p_igmon 0:ad6637c36dc7 299 case 0x90:// NOTEON コマンド
p_igmon 0:ad6637c36dc7 300 midi_com = MIDI_NOTEON;
p_igmon 0:ad6637c36dc7 301 midi_ch = data & 0x0f;
p_igmon 0:ad6637c36dc7 302 break;
p_igmon 0:ad6637c36dc7 303 case 0xc0:// プログラムチェンジコマンド
p_igmon 0:ad6637c36dc7 304 midi_com = MIDI_PGMCHG;
p_igmon 0:ad6637c36dc7 305 midi_ch = data & 0x0f;
p_igmon 0:ad6637c36dc7 306 break;
p_igmon 0:ad6637c36dc7 307 case 0xb0:// コントロールチェンジコマンド
p_igmon 0:ad6637c36dc7 308 midi_com = MIDI_CONTCHG;
p_igmon 0:ad6637c36dc7 309 midi_ch = data & 0x0f;
p_igmon 0:ad6637c36dc7 310 break;
p_igmon 0:ad6637c36dc7 311 case 0xa0:// ポリフォニックキープレッシャーコマンド
p_igmon 0:ad6637c36dc7 312 case 0xd0:// チャンネルプレッシャーコマンド
p_igmon 0:ad6637c36dc7 313 case 0xe0:// ピッチベンドコマンド
p_igmon 0:ad6637c36dc7 314 default:// エクスクルーシブメッセージ
p_igmon 0:ad6637c36dc7 315 midi_com = MIDI_OTHER;
p_igmon 0:ad6637c36dc7 316 break;
p_igmon 0:ad6637c36dc7 317 }
p_igmon 0:ad6637c36dc7 318 }
p_igmon 0:ad6637c36dc7 319 }
p_igmon 0:ad6637c36dc7 320 }
p_igmon 0:ad6637c36dc7 321
p_igmon 0:ad6637c36dc7 322