4 typedef struct Trk Trk;
14 uchar *mcmd, *mp, *me;
17 #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8
18 #define BBIT32(p,v) (p)[3]=(v);(p)[2]=(v)>>8;(p)[1]=(v)>>16;(p)[0]=(v)>>24
21 eread(int fd, void *u, long n)
23 if(readn(fd, u, n) != n)
24 sysfatal("readn: %r");
45 putcmd(uchar *cmd, int n)
49 mcmd = realloc(mcmd, me - mcmd);
51 sysfatal("realloc: %r");
60 uchar e, v, cmd[3], *p;
76 t.v[e & 15] = r8() & 0x7f;
82 PBIT16(p, v << 7 & 0x7f7f);
89 case 10: *p++ = 0x78; break;
90 case 11: *p++ = 0x7b; break;
91 case 12: *p++ = 0x7e; break;
92 case 13: *p++ = 0x7f; break;
93 case 14: *p++ = 0x79; break;
94 default: sysfatal("unknown system event %ux\n", v);
101 sysfatal("unknown controller %ux\n", v);
102 *p++ = 0xb0 | e & 15;
104 case 1: *p++ = 0x00; break;
105 case 2: *p++ = 0x01; break;
106 case 3: *p++ = 0x07; break;
107 case 4: *p++ = 0x0a; break;
108 case 5: *p++ = 0x0b; break;
109 case 6: *p++ = 0x5b; break;
110 case 7: *p++ = 0x5d; break;
111 case 8: *p++ = 0x40; break;
112 case 9: *p++ = 0x43; break;
125 sysfatal("unknown event %ux\n", e >> 4 & 7);
141 memset(t.v, 0x7f, sizeof t.v);
142 mcmd = mallocz(t.len * 2, 1);
144 sysfatal("mallocz: %r");
146 me = mcmd + t.len * 2;
152 static uchar hdr[] = {
154 0x00, 0x00, 0x00, 0x06,
159 0x00, 0x00, 0x00, 0x00,
160 0x00, 0xb0, 0x07, 0x7f,
161 0x00, 0xb1, 0x07, 0x7f,
162 0x00, 0xb2, 0x07, 0x7f,
163 0x00, 0xb3, 0x07, 0x7f,
164 0x00, 0xb4, 0x07, 0x7f,
165 0x00, 0xb5, 0x07, 0x7f,
166 0x00, 0xb6, 0x07, 0x7f,
167 0x00, 0xb7, 0x07, 0x7f,
168 0x00, 0xb8, 0x07, 0x7f,
169 0x00, 0xb9, 0x07, 0x7f,
170 0x00, 0xba, 0x07, 0x7f,
171 0x00, 0xbb, 0x07, 0x7f,
172 0x00, 0xbc, 0x07, 0x7f,
173 0x00, 0xbd, 0x07, 0x7f,
174 0x00, 0xbe, 0x07, 0x7f,
175 0x00, 0xbf, 0x07, 0x7f,
176 0x00, 0xff, 0x51, 0x03, 0x1b, 0x8a, 0x06,
181 n = sizeof(hdr) - 22 + mp - mcmd;
183 write(1, hdr, sizeof hdr);
184 write(1, mcmd, mp - mcmd);
188 main(int argc, char *argv[])
194 fd = open(argv[1], OREAD);
196 sysfatal("open: %r");
198 eread(fd, s, sizeof s);
199 if(memcmp(s, "MUS\x1a", 4) != 0)
200 sysfatal("invalid mus file: %r");
201 t.len = s[5] << 8 | s[4];
202 ofs = (s[7] << 8 | s[6]) - 8;
204 n = ofs > sizeof b ? sizeof b : ofs;
208 t.dat = malloc(t.len);
210 sysfatal("malloc: %r");
212 t.end = t.dat + t.len;
213 eread(fd, t.dat, t.len);
215 while(!t.done && t.p < t.end)