#include #include #include #include #include void wr_str(char *s) { printf("%s", s); fflush(stdout); } void wr_int(int n, int v) /* big endian */ { while(n--) putchar((v >> n*8) & 0xff); fflush(stdout); } void wr_delta(int v) { char buf[5], *bp; if(v == 0){ putchar(0); fflush(stdout); return; } bp = buf; while(v){ *bp++ = v & 0x7f; v >>= 7; } while(--bp != buf) putchar(0x80 | *bp); putchar(*bp); fflush(stdout); } int now_msec(void) { struct timeval tm; gettimeofday(&tm, NULL); return tm.tv_sec * 1000 + tm.tv_usec / 1000; } void wr_delta_now(int st_msec, int *sum, int div) { int msec, t; msec = now_msec() - st_msec; t = div * msec / 500; wr_delta(t - *sum); *sum = t; } void wait_msec(int msec, int st_msec, int *sum, int div) { int st; st = now_msec(); while(now_msec() - st < msec){ wr_delta_now(st_msec, sum, div); wr_int(1, 0xf8); /* clock */ usleep(20*1000); } } int main(int ac, char **av) { int div, st_msec, sum; div = 96; wr_str("MThd"); wr_int(4, 6); wr_int(2, 0); wr_int(2, 1); wr_int(2, div); wr_str("MTrk"); wr_int(4, 0); sum = -30; st_msec = now_msec(); wr_delta_now(st_msec, &sum, div); wr_int(1, (0xc<<4) | 0); /* prog_num ch=0 */ wr_int(1, 50); /* 50 : strings ensamble 2 */ wr_delta_now(st_msec, &sum, div); wr_int(1, (0xb<<4) | 0); /* ctl chg ch=0 */ wr_int(1, 7); /* channel volme msb */ wr_int(1, 64); wr_delta_now(st_msec, &sum, div); wr_int(1, (9<<4) | 0); /* note on ch=0 */ wr_int(1, 69); /* A */ wr_int(1, 64); /* velo */ wait_msec(500, st_msec, &sum, div); wr_delta_now(st_msec, &sum, div); wr_int(1, (9<<4) | 0); /* note on ch=0 */ wr_int(1, 73); /* C# */ wr_int(1, 64); /* velo */ wait_msec(500, st_msec, &sum, div); wr_delta_now(st_msec, &sum, div); wr_int(1, (9<<4) | 0); /* note on ch=0 */ wr_int(1, 76); /* E */ wr_int(1, 64); /* velo */ wait_msec(3000, st_msec, &sum, div); wr_delta_now(st_msec, &sum, div); wr_int(1, (8<<4) | 0); /* noe off ch=0 */ wr_int(1, 69); /* A */ wr_int(1, 0); /* velo */ wr_delta_now(st_msec, &sum, div); wr_int(1, (8<<4) | 0); /* noe off ch=0 */ wr_int(1, 73); /* C# */ wr_int(1, 0); /* velo */ wr_delta_now(st_msec, &sum, div); wr_int(1, (8<<4) | 0); /* noe off ch=0 */ wr_int(1, 76); /* E */ wr_int(1, 0); /* velo */ wait_msec(1000, st_msec, &sum, div); return 0; } /* EOF */