11 FDIV = 1048576 * 2 * 144,
14 #define min(a, b) ((a)<=(b)?(a):(b))
16 typedef struct oper oper;
20 enum {OFF, ATTACK, DECAY, SUSTAIN, RELEASE} st;
23 u8int ar, sr, dr, rs, rr, mult;
25 u8int keyon, keyoff, rate;
34 u8int st, alg, en, fbs;
42 static short sbuf[2 * 2000], *sbufp;
44 static int sint[256], expt[256];
54 tima = (tima + 1) & 0x3ff;
55 if(tima == 0 && (m & 4) != 0){
57 tima = ym[0x24] | ym[0x25] << 8 & 0x300;
64 if(timb == 0 && (m & 8) != 0){
79 static u8int det[4][32] = {
81 {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
82 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8},
83 {1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
84 5, 6, 6, 7, 8, 8, 9,10,11,12,13,14,16,16,16,16},
85 {2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
86 8, 8, 9,10,11,12,13,14,16,17,19,20,22,22,22,22}
95 fr = r[0xa0 + n] | r[0xa4 + n] << 8 & 0x3f00;
96 for(i = 0; i < 3; i++){
98 if(n == 2 && (ym[MODE] & 0xc0) == 0x40 && i != 0)
99 fr = r[0xa7+i] | r[0xab+i] << 8 & 0x3f00;
100 p->kc = fr >> 9 & 0x1e;
101 if((fr & 0x780) >= 0x380 && (fr & 0x780) != 0x400)
103 p->dp = ((fr & 0x7ff) << (fr >> 11)) >> 1;
104 if((p->det & 4) != 0)
105 p->dp -= det[p->det & 3][p->kc];
107 p->dp += det[p->det][p->kc];
109 p->dp = (p->dp & 0x1ffff) * p->mult;
111 p->dp = (u16int)(p->dp >> 1);
117 ymwrite(u8int a, u8int v, u8int c)
123 ym[c ? a|0x100 : a] = v;
124 if(a >= 0x30 && a < 0xa0){
130 i = a >> 3 & 1 | a >> 1 & 2;
139 p->tl = v << 3 & 0x3f8;
142 p->ar = v << 1 & 0x3e;
143 p->rs = 3 - (v >> 6);
146 p->dr = v << 1 & 0x3e;
149 p->sr = v << 1 & 0x3e;
152 p->sl = v << 2 & 0x3c0;
153 p->rr = v << 2 & 0x3c | 0x02;
174 for(i = 0; i < 4; i++){
176 if((v & 1<<4+i) != 0){
177 if(p->st == OFF || p->st == RELEASE)
184 case 0xa0: case 0xa1: case 0xa2:
185 case 0xa4: case 0xa5: case 0xa6:
188 case 0xa8: case 0xa9: case 0xaa:
189 case 0xac: case 0xad: case 0xae:
190 calcfreq((a & 0x100) != 0 ? 5 : 2);
192 case 0xb0: case 0xb1: case 0xb2:
194 fms[ch].fbs = 7 - (v >> 3 & 7);
196 case 0xb4: case 0xb5: case 0xb6:
209 for(i = 0; i < 256; i++){
210 x = sin(((i << 1) + 1) * PI / 1024);
212 sint[i] = x * 256 + 0.5;
214 for(i = 0; i < 256; i++){
215 x = pow(2, -(i+1)/256.0);
216 expt[i] = x * 2048 + 0.5;
225 for(i = 0; i < 6; i++){
227 for(j = 0; j < 4; j++)
234 rate(oper *p, u8int r)
248 static u8int ait[64][8] = {
249 {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,1,0,1,0,1,0,1}, {0,1,0,1,0,1,0,1},
250 {0,1,0,1,0,1,0,1}, {0,1,0,1,0,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,0,1,1,1},
251 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
252 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
253 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
254 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
255 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
256 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
257 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
258 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
259 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
260 {0,1,0,1,0,1,0,1}, {0,1,0,1,1,1,0,1}, {0,1,1,1,0,1,1,1}, {0,1,1,1,1,1,1,1},
261 {1,1,1,1,1,1,1,1}, {1,1,1,2,1,1,1,2}, {1,2,1,2,1,2,1,2}, {1,2,2,2,1,2,2,2},
262 {2,2,2,2,2,2,2,2}, {2,2,2,4,2,2,2,4}, {2,4,2,4,2,4,2,4}, {2,4,4,4,2,4,4,4},
263 {4,4,4,4,4,4,4,4}, {4,4,4,8,4,4,4,8}, {4,8,4,8,4,8,4,8}, {4,8,8,8,4,8,8,8},
264 {8,8,8,8,8,8,8,8}, {8,8,8,8,8,8,8,8}, {8,8,8,8,8,8,8,8}, {8,8,8,8,8,8,8,8},
268 p->rate = rate(p, p->ar);
271 }else if(p->keyoff > 0){
273 p->rate = rate(p, p->rr);
282 if((cyc & (1 << sh) - 1) == 0){
283 ai = ait[p->rate][(cyc >> sh) & 7];
286 p->env += ai * ((1024 - p->env >> 4) + 1);
290 p->rate = rate(p, p->dr);
299 p->rate = rate(p, p->sr);
329 opr(oper *p, int inp)
334 v = (p->phi >> 10) + inp;
337 x = sint[v & 0xff] + (p->amp << 2);
338 r = expt[x & 0xff] << 2 >> (x >> 8);
349 static int ymch, ymop, ymcyc;
359 x = p->val + p->val0 >> f->fbs + 2;
361 switch(f->alg << 4 | ymop){
362 default: x = p[-1].val; break;
364 case 0x12: x = f->op[0].val + f->op[1].val; break;
366 case 0x23: x = f->op[0].val + f->op[2].val; break;
368 case 0x33: x = f->op[1].val + f->op[2].val; break;
370 case 0x52: case 0x53: x = f->op[0].val; break;
371 case 0x62: case 0x63: break;
372 case 0x71: case 0x72: case 0x73: break;
381 default: x = p->val >> 5; break;
382 case 4: x = (f->op[1].val >> 5) + (p->val >> 5); break;
383 case 5: case 6: x = (f->op[1].val >> 5) + (f->op[2].val >> 5) + (p->val >> 5); break;
384 case 7: x = (f->op[0].val >> 5) + (f->op[1].val >> 5) + (f->op[2].val >> 5) + (p->val >> 5); break;
387 if(x < -256) x = -256;
412 for(i = 0; i < 6; i++){
413 if(i == 5 && (ym[0x2b] & 0x80) != 0)
414 v = ym[0x2a] / 255.0;
423 if(sbufp < sbuf + nelem(sbuf) - 1){
424 *sbufp++ = vl * 5000;
425 *sbufp++ = vr * 5000;
438 rc = warp10 ? (sbufp - sbuf) * 2 : write(fd, sbuf, (sbufp - sbuf) * 2);
449 fd = open("/dev/audio", OWRITE);