mbedでmidi(Format 0)を再生

Committer:
Naoto_111
Date:
Tue Jul 15 09:45:03 2014 +0000
Revision:
0:7c17c3b3a8d7
Child:
1:250e7251f8fc
????; ????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Naoto_111 0:7c17c3b3a8d7 1 #include "mbed.h"
Naoto_111 0:7c17c3b3a8d7 2 #include "midi.h"
Naoto_111 0:7c17c3b3a8d7 3 #define STEP 8
Naoto_111 0:7c17c3b3a8d7 4 Serial pc(USBTX,USBRX);//tx,rx
Naoto_111 0:7c17c3b3a8d7 5 midi::midi(PinName _bzr):bzr(_bzr)
Naoto_111 0:7c17c3b3a8d7 6 {
Naoto_111 0:7c17c3b3a8d7 7 //frequency of equal temperament(octave:4)
Naoto_111 0:7c17c3b3a8d7 8 freq[0]=261.626;//C(do)
Naoto_111 0:7c17c3b3a8d7 9 freq[1]=277.183;//C#
Naoto_111 0:7c17c3b3a8d7 10 freq[2]=293.665;//D
Naoto_111 0:7c17c3b3a8d7 11 freq[3]=311.127;//D#
Naoto_111 0:7c17c3b3a8d7 12 freq[4]=329.628;//E
Naoto_111 0:7c17c3b3a8d7 13 freq[5]=349.228;//F
Naoto_111 0:7c17c3b3a8d7 14 freq[6]=369.994;//F#
Naoto_111 0:7c17c3b3a8d7 15 freq[7]=391.995;//G
Naoto_111 0:7c17c3b3a8d7 16 freq[8]=415.305;//G#
Naoto_111 0:7c17c3b3a8d7 17 freq[9]=440.000;//A
Naoto_111 0:7c17c3b3a8d7 18 freq[10]=466.164;//A#
Naoto_111 0:7c17c3b3a8d7 19 freq[11]=493.883;//B
Naoto_111 0:7c17c3b3a8d7 20
Naoto_111 0:7c17c3b3a8d7 21 table=new float[STEP];
Naoto_111 0:7c17c3b3a8d7 22 for(int i=0; i<STEP; i++)table[i]=sin(i/(STEP/8.0)*atan(1.0));
Naoto_111 0:7c17c3b3a8d7 23
Naoto_111 0:7c17c3b3a8d7 24
Naoto_111 0:7c17c3b3a8d7 25
Naoto_111 0:7c17c3b3a8d7 26 }
Naoto_111 0:7c17c3b3a8d7 27 /*
Naoto_111 0:7c17c3b3a8d7 28 midi::~midi(){
Naoto_111 0:7c17c3b3a8d7 29 delete(cache);
Naoto_111 0:7c17c3b3a8d7 30 }
Naoto_111 0:7c17c3b3a8d7 31 */
Naoto_111 0:7c17c3b3a8d7 32 template<class X>
Naoto_111 0:7c17c3b3a8d7 33 void midi::change_endian(X *raw,int byte)
Naoto_111 0:7c17c3b3a8d7 34 {
Naoto_111 0:7c17c3b3a8d7 35 X tmp=0;
Naoto_111 0:7c17c3b3a8d7 36 for(int i=0; i<byte; i++)for(int j=0; j<8; j++)tmp+=((*raw&(1<<((byte-i-1)*8+j)))>>((byte-i-1)*8+j))<<(i*8+j);
Naoto_111 0:7c17c3b3a8d7 37 *raw=tmp;
Naoto_111 0:7c17c3b3a8d7 38 }
Naoto_111 0:7c17c3b3a8d7 39
Naoto_111 0:7c17c3b3a8d7 40 void midi::read(const char *path)
Naoto_111 0:7c17c3b3a8d7 41 {
Naoto_111 0:7c17c3b3a8d7 42
Naoto_111 0:7c17c3b3a8d7 43 FILE *mid,*cache;
Naoto_111 0:7c17c3b3a8d7 44 short int pbend;
Naoto_111 0:7c17c3b3a8d7 45 long int dtime,len;
Naoto_111 0:7c17c3b3a8d7 46 int time,ch;
Naoto_111 0:7c17c3b3a8d7 47 float frequency[16];
Naoto_111 0:7c17c3b3a8d7 48 char note,ctrl,value,prgm,prsr;
Naoto_111 0:7c17c3b3a8d7 49 unsigned char tmp2[64];
Naoto_111 0:7c17c3b3a8d7 50 char vel;
Naoto_111 0:7c17c3b3a8d7 51 unsigned char tmp;
Naoto_111 0:7c17c3b3a8d7 52 char prev;
Naoto_111 0:7c17c3b3a8d7 53 time=tmp=prev=tempo=chmax=0;
Naoto_111 0:7c17c3b3a8d7 54
Naoto_111 0:7c17c3b3a8d7 55 if((mid = fopen(path, "rb")) == NULL)goto end1;
Naoto_111 0:7c17c3b3a8d7 56
Naoto_111 0:7c17c3b3a8d7 57
Naoto_111 0:7c17c3b3a8d7 58
Naoto_111 0:7c17c3b3a8d7 59
Naoto_111 0:7c17c3b3a8d7 60
Naoto_111 0:7c17c3b3a8d7 61
Naoto_111 0:7c17c3b3a8d7 62
Naoto_111 0:7c17c3b3a8d7 63
Naoto_111 0:7c17c3b3a8d7 64
Naoto_111 0:7c17c3b3a8d7 65
Naoto_111 0:7c17c3b3a8d7 66
Naoto_111 0:7c17c3b3a8d7 67
Naoto_111 0:7c17c3b3a8d7 68
Naoto_111 0:7c17c3b3a8d7 69
Naoto_111 0:7c17c3b3a8d7 70 fseek(mid, 10, SEEK_SET);
Naoto_111 0:7c17c3b3a8d7 71 fread(&tracks,2,1,mid);
Naoto_111 0:7c17c3b3a8d7 72 //fseek(mid, 2, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 73 fread(&crochet,2,1,mid);
Naoto_111 0:7c17c3b3a8d7 74
Naoto_111 0:7c17c3b3a8d7 75 change_endian(&tracks,2);
Naoto_111 0:7c17c3b3a8d7 76 change_endian(&crochet,2);
Naoto_111 0:7c17c3b3a8d7 77
Naoto_111 0:7c17c3b3a8d7 78
Naoto_111 0:7c17c3b3a8d7 79
Naoto_111 0:7c17c3b3a8d7 80
Naoto_111 0:7c17c3b3a8d7 81
Naoto_111 0:7c17c3b3a8d7 82 fseek(mid, 4, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 83 fread(&len,4,1,mid);
Naoto_111 0:7c17c3b3a8d7 84 change_endian(&len,4);
Naoto_111 0:7c17c3b3a8d7 85 while(1) {
Naoto_111 0:7c17c3b3a8d7 86 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 87 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 88
Naoto_111 0:7c17c3b3a8d7 89 dtime=0;
Naoto_111 0:7c17c3b3a8d7 90 int i;
Naoto_111 0:7c17c3b3a8d7 91 for(i=0; i<4; i++) {
Naoto_111 0:7c17c3b3a8d7 92 int flag= (tmp&128)==0 ? 1:0;
Naoto_111 0:7c17c3b3a8d7 93
Naoto_111 0:7c17c3b3a8d7 94 if(tmp&128)tmp2[i]=tmp-0x80;
Naoto_111 0:7c17c3b3a8d7 95 else tmp2[i]=tmp;
Naoto_111 0:7c17c3b3a8d7 96 if(flag)break;
Naoto_111 0:7c17c3b3a8d7 97 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 98 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 99 }
Naoto_111 0:7c17c3b3a8d7 100 for(int j=0; j<=i; j++)dtime+=((long int)tmp2[j]<<(7*(i-j)));
Naoto_111 0:7c17c3b3a8d7 101 time+=(int)tempo*((float)dtime/crochet);
Naoto_111 0:7c17c3b3a8d7 102
Naoto_111 0:7c17c3b3a8d7 103
Naoto_111 0:7c17c3b3a8d7 104 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 105 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 106 //pc.printf("%d %d\r\n",time,tm.size()*4*1+fq.size()*4*1+ca.size());
Naoto_111 0:7c17c3b3a8d7 107 if(tm.size()>640){
Naoto_111 0:7c17c3b3a8d7 108 pc.printf("Memory shortage!\r\n");
Naoto_111 0:7c17c3b3a8d7 109 goto end1;
Naoto_111 0:7c17c3b3a8d7 110
Naoto_111 0:7c17c3b3a8d7 111 }
Naoto_111 0:7c17c3b3a8d7 112 if(tmp==0xF0) {
Naoto_111 0:7c17c3b3a8d7 113 len=0;
Naoto_111 0:7c17c3b3a8d7 114 i=0;
Naoto_111 0:7c17c3b3a8d7 115 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 116
Naoto_111 0:7c17c3b3a8d7 117 for(i=0; i<4; i++) {
Naoto_111 0:7c17c3b3a8d7 118 int flag= (tmp&128)==0 ? 1:0;
Naoto_111 0:7c17c3b3a8d7 119
Naoto_111 0:7c17c3b3a8d7 120 tmp2[i]=((tmp<<1)>>1);
Naoto_111 0:7c17c3b3a8d7 121 if(flag)break;
Naoto_111 0:7c17c3b3a8d7 122 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 123 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 124
Naoto_111 0:7c17c3b3a8d7 125 }
Naoto_111 0:7c17c3b3a8d7 126
Naoto_111 0:7c17c3b3a8d7 127 for(int j=i; j>=0; j--)len+=((long int)tmp2[j]<<(7*j));
Naoto_111 0:7c17c3b3a8d7 128
Naoto_111 0:7c17c3b3a8d7 129 fseek(mid, len, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 130
Naoto_111 0:7c17c3b3a8d7 131 } else if(tmp==0xF7) {
Naoto_111 0:7c17c3b3a8d7 132 len=0;
Naoto_111 0:7c17c3b3a8d7 133 i=0;
Naoto_111 0:7c17c3b3a8d7 134 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 135 for(i=0; i<4; i++) {
Naoto_111 0:7c17c3b3a8d7 136 int flag= (tmp&128)==0 ? 1:0;
Naoto_111 0:7c17c3b3a8d7 137 tmp2[i]=((tmp<<1)>>1);
Naoto_111 0:7c17c3b3a8d7 138 if(flag)break;
Naoto_111 0:7c17c3b3a8d7 139 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 140 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 141 }
Naoto_111 0:7c17c3b3a8d7 142 for(int j=i; j>=0; j--)len+=((long int)tmp2[j]<<(7*j));
Naoto_111 0:7c17c3b3a8d7 143 fseek(mid, len, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 144 } else if(tmp==0xFF) {
Naoto_111 0:7c17c3b3a8d7 145 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 146 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 147 switch(tmp) {
Naoto_111 0:7c17c3b3a8d7 148 case 0x00:
Naoto_111 0:7c17c3b3a8d7 149 case 0x59:
Naoto_111 0:7c17c3b3a8d7 150 fseek(mid, 3, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 151 break;
Naoto_111 0:7c17c3b3a8d7 152
Naoto_111 0:7c17c3b3a8d7 153 case 0x20:
Naoto_111 0:7c17c3b3a8d7 154 case 0x21:
Naoto_111 0:7c17c3b3a8d7 155 fseek(mid, 2, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 156 break;
Naoto_111 0:7c17c3b3a8d7 157
Naoto_111 0:7c17c3b3a8d7 158 case 0x54:
Naoto_111 0:7c17c3b3a8d7 159 fseek(mid, 6, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 160 break;
Naoto_111 0:7c17c3b3a8d7 161
Naoto_111 0:7c17c3b3a8d7 162 case 0x2F://End of Track
Naoto_111 0:7c17c3b3a8d7 163
Naoto_111 0:7c17c3b3a8d7 164 goto end1;
Naoto_111 0:7c17c3b3a8d7 165 break;
Naoto_111 0:7c17c3b3a8d7 166
Naoto_111 0:7c17c3b3a8d7 167 case 0x51://Tempo
Naoto_111 0:7c17c3b3a8d7 168 fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 169 fread(&tempo,3,1,mid);
Naoto_111 0:7c17c3b3a8d7 170 change_endian(&tempo,3);
Naoto_111 0:7c17c3b3a8d7 171 //pc.printf("tempo=%x\r\n",tempo);
Naoto_111 0:7c17c3b3a8d7 172 break;
Naoto_111 0:7c17c3b3a8d7 173
Naoto_111 0:7c17c3b3a8d7 174 case 0x58://Time Signature
Naoto_111 0:7c17c3b3a8d7 175 fseek(mid, 5, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 176 break;
Naoto_111 0:7c17c3b3a8d7 177
Naoto_111 0:7c17c3b3a8d7 178 /*case 0x59://Key Signature
Naoto_111 0:7c17c3b3a8d7 179
Naoto_111 0:7c17c3b3a8d7 180 break;
Naoto_111 0:7c17c3b3a8d7 181 */
Naoto_111 0:7c17c3b3a8d7 182 case 0x01:
Naoto_111 0:7c17c3b3a8d7 183 case 0x02:
Naoto_111 0:7c17c3b3a8d7 184 case 0x03:
Naoto_111 0:7c17c3b3a8d7 185 case 0x04:
Naoto_111 0:7c17c3b3a8d7 186 case 0x05:
Naoto_111 0:7c17c3b3a8d7 187 case 0x06:
Naoto_111 0:7c17c3b3a8d7 188 case 0x07:
Naoto_111 0:7c17c3b3a8d7 189 case 0x08:
Naoto_111 0:7c17c3b3a8d7 190 case 0x09:
Naoto_111 0:7c17c3b3a8d7 191 case 0x7F:
Naoto_111 0:7c17c3b3a8d7 192 len=0;
Naoto_111 0:7c17c3b3a8d7 193 i=0;
Naoto_111 0:7c17c3b3a8d7 194 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 195
Naoto_111 0:7c17c3b3a8d7 196 for(i=0; i<4; i++) {
Naoto_111 0:7c17c3b3a8d7 197 int flag= (tmp&128)==0 ? 1:0;
Naoto_111 0:7c17c3b3a8d7 198 tmp2[i]=((tmp<<1)>>1);
Naoto_111 0:7c17c3b3a8d7 199 if(flag)break;
Naoto_111 0:7c17c3b3a8d7 200 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 201 fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 202
Naoto_111 0:7c17c3b3a8d7 203 }
Naoto_111 0:7c17c3b3a8d7 204
Naoto_111 0:7c17c3b3a8d7 205 for(int j=i; j>=0; j--)len+=((unsigned long int)tmp2[j]<<(7*j));
Naoto_111 0:7c17c3b3a8d7 206
Naoto_111 0:7c17c3b3a8d7 207 fseek(mid, len, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 208
Naoto_111 0:7c17c3b3a8d7 209 break;
Naoto_111 0:7c17c3b3a8d7 210
Naoto_111 0:7c17c3b3a8d7 211 default:
Naoto_111 0:7c17c3b3a8d7 212 break;
Naoto_111 0:7c17c3b3a8d7 213 }
Naoto_111 0:7c17c3b3a8d7 214 } else {
Naoto_111 0:7c17c3b3a8d7 215
Naoto_111 0:7c17c3b3a8d7 216
Naoto_111 0:7c17c3b3a8d7 217 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 218 //fread(&tmp,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 219
Naoto_111 0:7c17c3b3a8d7 220 MIDIEVENT:
Naoto_111 0:7c17c3b3a8d7 221 if(0x80<=tmp&&tmp<=0xEF)prev=tmp;
Naoto_111 0:7c17c3b3a8d7 222 if(0x80<=tmp&&tmp<=0x8F) { //note off
Naoto_111 0:7c17c3b3a8d7 223 ch=tmp-0x80;
Naoto_111 0:7c17c3b3a8d7 224 if(chmax<ch)chmax=ch;
Naoto_111 0:7c17c3b3a8d7 225 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 226 fread(&note,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 227 fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 228
Naoto_111 0:7c17c3b3a8d7 229 tm.push_back(time);
Naoto_111 0:7c17c3b3a8d7 230 //ev.push_back(109);
Naoto_111 0:7c17c3b3a8d7 231 ca.push_back(ch);
Naoto_111 0:7c17c3b3a8d7 232 fq.push_back(0);
Naoto_111 0:7c17c3b3a8d7 233 //vo.push_back(0);
Naoto_111 0:7c17c3b3a8d7 234 } else if(0x90<=tmp&&tmp<=0x9F) { //note on
Naoto_111 0:7c17c3b3a8d7 235 ch=tmp-0x90;
Naoto_111 0:7c17c3b3a8d7 236 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 237 fread(&note,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 238 frequency[ch]=freq[note%12]*pow(2.0,(note/12-5.0));
Naoto_111 0:7c17c3b3a8d7 239
Naoto_111 0:7c17c3b3a8d7 240 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 241 fread(&vel,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 242
Naoto_111 0:7c17c3b3a8d7 243
Naoto_111 0:7c17c3b3a8d7 244 tm.push_back(time);
Naoto_111 0:7c17c3b3a8d7 245 //ev.push_back(109);
Naoto_111 0:7c17c3b3a8d7 246 ca.push_back(ch);
Naoto_111 0:7c17c3b3a8d7 247 fq.push_back(frequency[ch]);
Naoto_111 0:7c17c3b3a8d7 248 //vo.push_back(vel/127.0);
Naoto_111 0:7c17c3b3a8d7 249 }
Naoto_111 0:7c17c3b3a8d7 250
Naoto_111 0:7c17c3b3a8d7 251 else if(0xA0<=tmp&&tmp<=0xAF) { //polyphonic key pressure
Naoto_111 0:7c17c3b3a8d7 252 ch=tmp-0xA0;
Naoto_111 0:7c17c3b3a8d7 253 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 254 fread(&note,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 255
Naoto_111 0:7c17c3b3a8d7 256 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 257 fread(&vel,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 258 } else if(0xB0<=tmp&&tmp<=0xBF) { //control change
Naoto_111 0:7c17c3b3a8d7 259 ch=tmp-0xB0;
Naoto_111 0:7c17c3b3a8d7 260 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 261 fread(&ctrl,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 262
Naoto_111 0:7c17c3b3a8d7 263 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 264 fread(&value,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 265 } else if(0xC0<=tmp&&tmp<=0xCF) { //program change
Naoto_111 0:7c17c3b3a8d7 266 ch=tmp-0xC0;
Naoto_111 0:7c17c3b3a8d7 267 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 268 fread(&prgm,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 269 } else if(0xD0<=tmp&&tmp<=0xDF) { //channel pressure
Naoto_111 0:7c17c3b3a8d7 270 ch=tmp-0x90;
Naoto_111 0:7c17c3b3a8d7 271 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 272 fread(&prsr,1,1,mid);
Naoto_111 0:7c17c3b3a8d7 273 } else if(0xE0<=tmp&&tmp<=0xEF) { //pitch bend
Naoto_111 0:7c17c3b3a8d7 274 ch=tmp-0xE0;
Naoto_111 0:7c17c3b3a8d7 275 //fseek(mid, 1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 276 fread(&pbend,2,1,mid);
Naoto_111 0:7c17c3b3a8d7 277 } else { //running status
Naoto_111 0:7c17c3b3a8d7 278 tmp=prev;
Naoto_111 0:7c17c3b3a8d7 279 fseek(mid, -1, SEEK_CUR);
Naoto_111 0:7c17c3b3a8d7 280 pc.printf(" ->%x\r\n",tmp);
Naoto_111 0:7c17c3b3a8d7 281 goto MIDIEVENT;
Naoto_111 0:7c17c3b3a8d7 282 }
Naoto_111 0:7c17c3b3a8d7 283 }
Naoto_111 0:7c17c3b3a8d7 284 }
Naoto_111 0:7c17c3b3a8d7 285 end1:
Naoto_111 0:7c17c3b3a8d7 286 fclose(mid);
Naoto_111 0:7c17c3b3a8d7 287
Naoto_111 0:7c17c3b3a8d7 288 pc.printf("Loading complete.\r\n");
Naoto_111 0:7c17c3b3a8d7 289 }
Naoto_111 0:7c17c3b3a8d7 290
Naoto_111 0:7c17c3b3a8d7 291
Naoto_111 0:7c17c3b3a8d7 292
Naoto_111 0:7c17c3b3a8d7 293
Naoto_111 0:7c17c3b3a8d7 294 void midi::play()
Naoto_111 0:7c17c3b3a8d7 295 {
Naoto_111 0:7c17c3b3a8d7 296
Naoto_111 0:7c17c3b3a8d7 297 //FILE *fp;
Naoto_111 0:7c17c3b3a8d7 298 AnalogOut buzzer(bzr);
Naoto_111 0:7c17c3b3a8d7 299 int time, /*event, */ch;
Naoto_111 0:7c17c3b3a8d7 300 float *frequency/*,tmp,tmp2,vel[16]*/;
Naoto_111 0:7c17c3b3a8d7 301 //if((fp = fopen(path, "r")) == NULL)goto end;
Naoto_111 0:7c17c3b3a8d7 302 //if(fscanf(fp,"%d\n",&tracks)==EOF)goto end;
Naoto_111 0:7c17c3b3a8d7 303 frequency=new float[chmax+1];
Naoto_111 0:7c17c3b3a8d7 304 for(int i=0; i<=chmax; i++)frequency[i]=0;
Naoto_111 0:7c17c3b3a8d7 305
Naoto_111 0:7c17c3b3a8d7 306 /*
Naoto_111 0:7c17c3b3a8d7 307 if(!tm.empty())goto end;
Naoto_111 0:7c17c3b3a8d7 308
Naoto_111 0:7c17c3b3a8d7 309
Naoto_111 0:7c17c3b3a8d7 310 pi=tm.begin();
Naoto_111 0:7c17c3b3a8d7 311 time=*pi;
Naoto_111 0:7c17c3b3a8d7 312 tm.pop_front();
Naoto_111 0:7c17c3b3a8d7 313
Naoto_111 0:7c17c3b3a8d7 314 pi=ev.begin();
Naoto_111 0:7c17c3b3a8d7 315 event=*pi;
Naoto_111 0:7c17c3b3a8d7 316 ev.pop_front();
Naoto_111 0:7c17c3b3a8d7 317
Naoto_111 0:7c17c3b3a8d7 318 pi=ca.begin();
Naoto_111 0:7c17c3b3a8d7 319 ch=*pi;
Naoto_111 0:7c17c3b3a8d7 320 ca.pop_front();
Naoto_111 0:7c17c3b3a8d7 321
Naoto_111 0:7c17c3b3a8d7 322 pd=fq.begin();
Naoto_111 0:7c17c3b3a8d7 323 frequency[ch]=*pd;
Naoto_111 0:7c17c3b3a8d7 324 fq.pop_front();
Naoto_111 0:7c17c3b3a8d7 325
Naoto_111 0:7c17c3b3a8d7 326 pd=vo.begin();
Naoto_111 0:7c17c3b3a8d7 327 vel[ch]=*pd;
Naoto_111 0:7c17c3b3a8d7 328 vo.pop_front();
Naoto_111 0:7c17c3b3a8d7 329 */
Naoto_111 0:7c17c3b3a8d7 330
Naoto_111 0:7c17c3b3a8d7 331 t.reset();
Naoto_111 0:7c17c3b3a8d7 332 t.start();
Naoto_111 0:7c17c3b3a8d7 333 time=0;
Naoto_111 0:7c17c3b3a8d7 334 while(1) {
Naoto_111 0:7c17c3b3a8d7 335 //static int count=0;
Naoto_111 0:7c17c3b3a8d7 336 //pc.printf("%d\r\n",count++);
Naoto_111 0:7c17c3b3a8d7 337 int now=t.read_us();
Naoto_111 0:7c17c3b3a8d7 338 while(1) {
Naoto_111 0:7c17c3b3a8d7 339 if(time<=now) {
Naoto_111 0:7c17c3b3a8d7 340
Naoto_111 0:7c17c3b3a8d7 341 if(tm.empty())return;
Naoto_111 0:7c17c3b3a8d7 342
Naoto_111 0:7c17c3b3a8d7 343 pi=tm.begin();
Naoto_111 0:7c17c3b3a8d7 344 time=*pi;
Naoto_111 0:7c17c3b3a8d7 345 if(time>=now)break;
Naoto_111 0:7c17c3b3a8d7 346 tm.pop_front();
Naoto_111 0:7c17c3b3a8d7 347 /*
Naoto_111 0:7c17c3b3a8d7 348 pi=ev.begin();
Naoto_111 0:7c17c3b3a8d7 349 event=*pi;
Naoto_111 0:7c17c3b3a8d7 350 ev.pop_front();
Naoto_111 0:7c17c3b3a8d7 351 */
Naoto_111 0:7c17c3b3a8d7 352 pch=ca.begin();
Naoto_111 0:7c17c3b3a8d7 353 ch=*pch;
Naoto_111 0:7c17c3b3a8d7 354 ca.pop_front();
Naoto_111 0:7c17c3b3a8d7 355
Naoto_111 0:7c17c3b3a8d7 356
Naoto_111 0:7c17c3b3a8d7 357
Naoto_111 0:7c17c3b3a8d7 358 pf=fq.begin();
Naoto_111 0:7c17c3b3a8d7 359 frequency[ch]=*pf;
Naoto_111 0:7c17c3b3a8d7 360 fq.pop_front();
Naoto_111 0:7c17c3b3a8d7 361 /*
Naoto_111 0:7c17c3b3a8d7 362 pd=vo.begin();
Naoto_111 0:7c17c3b3a8d7 363 vel[ch]=*pd;
Naoto_111 0:7c17c3b3a8d7 364 vo.pop_front();
Naoto_111 0:7c17c3b3a8d7 365 */
Naoto_111 0:7c17c3b3a8d7 366 //pc.printf("%d %d %d %lf %lf\r\n",time,event,ch,frequency[ch],vel[ch]);
Naoto_111 0:7c17c3b3a8d7 367 } else break;
Naoto_111 0:7c17c3b3a8d7 368 }
Naoto_111 0:7c17c3b3a8d7 369 float voltage=0;
Naoto_111 0:7c17c3b3a8d7 370 for(int i=0; i<=chmax; i++)voltage+=/*vel[i]*/(0.5/(chmax+1))*table[(int)(STEP*frequency[i]*now/1000000)%STEP];
Naoto_111 0:7c17c3b3a8d7 371 //for(int i=0;i<tracks;i++)voltage+=(0.5/tracks)*sin(2*pi*frequency[i]*now/1000000);
Naoto_111 0:7c17c3b3a8d7 372 buzzer=0.5+voltage;
Naoto_111 0:7c17c3b3a8d7 373
Naoto_111 0:7c17c3b3a8d7 374 }
Naoto_111 0:7c17c3b3a8d7 375 //end:
Naoto_111 0:7c17c3b3a8d7 376 //fclose(fp);
Naoto_111 0:7c17c3b3a8d7 377 }