4 typedef struct Trk Trk;
22 uchar *mcmd, *mp, *me;
25 #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8
26 #define BBIT32(p,v) (p)[3]=(v);(p)[2]=(v)>>8;(p)[1]=(v)>>16;(p)[0]=(v)>>24
29 eread(int fd, void *u, long n)
31 if(readn(fd, u, n) != n)
32 sysfatal("readn: %r");
50 t = t << 7 | v & 0x7f;
57 putcmd(uchar *cmd, int n)
61 mcmd = realloc(mcmd, me - mcmd);
63 sysfatal("realloc: %r");
90 c->n[v] = r8() & 0x7f;
101 PBIT16(p, c->pitch << 7 & 0x7f7f);
125 memset(c->n, 0, sizeof c->n);
126 memset(c->ctl, 0, sizeof c->ctl);
136 sysfatal("unknown system event %ux\n", v);
143 sysfatal("unknown controller %ux\n", v);
144 c->ctl[v] = r8() & 0x7f;
145 *p++ = 0xb0 | e & 15;
147 case 1: *p++ = 0x00; break;
148 case 2: *p++ = 0x01; break;
149 case 3: *p++ = 0x07; break;
150 case 4: *p++ = 0x0a; break;
151 case 5: *p++ = 0x0b; break;
152 case 6: *p++ = 0x5b; break;
153 case 7: *p++ = 0x5d; break;
154 case 8: *p++ = 0x40; break;
155 case 9: *p++ = 0x43; break;
168 sysfatal("unknown event %ux\n", e >> 4 & 7);
188 while(c < t.c + nelem(t.c)){
195 mcmd = mallocz(t.len * 2, 1);
197 sysfatal("mallocz: %r");
199 me = mcmd + t.len * 2;
205 static uchar hdr[] = {
207 0x00, 0x00, 0x00, 0x06,
212 0x00, 0x00, 0x00, 0x00,
213 0x00, 0xb0, 0x07, 0x7f,
214 0x00, 0xb1, 0x07, 0x7f,
215 0x00, 0xb2, 0x07, 0x7f,
216 0x00, 0xb3, 0x07, 0x7f,
217 0x00, 0xb4, 0x07, 0x7f,
218 0x00, 0xb5, 0x07, 0x7f,
219 0x00, 0xb6, 0x07, 0x7f,
220 0x00, 0xb7, 0x07, 0x7f,
221 0x00, 0xb8, 0x07, 0x7f,
222 0x00, 0xb9, 0x07, 0x7f,
223 0x00, 0xba, 0x07, 0x7f,
224 0x00, 0xff, 0x51, 0x03, 0x1b, 0x8a, 0x06,
229 n = sizeof(hdr) - 22 + mp - mcmd;
231 write(1, hdr, sizeof hdr);
232 write(1, mcmd, mp - mcmd);
236 main(int argc, char *argv[])
242 fd = open(argv[1], OREAD);
244 sysfatal("open: %r");
246 eread(fd, s, sizeof s);
247 if(memcmp(s, "MUS\x1a", 4) != 0)
248 sysfatal("invalid mus file: %r");
249 t.len = s[5] << 8 | s[4];
250 ofs = (s[7] << 8 | s[6]) - 8;
252 n = ofs > sizeof b ? sizeof b : ofs;
256 t.dat = malloc(t.len);
258 sysfatal("malloc: %r");
260 t.end = t.dat + t.len;
261 eread(fd, t.dat, t.len);
263 while(!t.done && t.p < t.end)