#include #include #include #include #define MSG(s) fprintf(stderr, "%s() %s L%d : %s\n", __func__, __FILE__, __LINE__, s) #define ERR(s) do{ fprintf(stderr, "ERR "); MSG(s); exit(1); }while(0) int bk_buf = -1; int rd(void) { int v; if((v = bk_buf) < 0) return getchar(); bk_buf = -1; return v; } void bk(int v) { if(bk_buf >= 0) ERR("give up"); bk_buf = v; } void rd_str(int n, char *s) { int i; for(i=0; i iv_max) iv = iv_max; if(iv < iv_min) iv = iv_min; switch(bit_len){ case 8: putchar(iv); break; case 16: putchar(iv & 0xff); putchar((iv >> 8) & 0xff); break; } smp_cnt++; } if(onoff){ if((i = note_buf_search(-1, 0)) < 0){ MSG("note_buf full"); return; } note_buf[i].note = note; note_buf[i].ch = ch; note_buf[i].on_sec = evt_sec; }else{ if((i = note_buf_search(ch, note)) < 0) return; note_buf_free(i); } } int opt_idx(char *key, int ac, char **av) { int i; for(i=1; i= ac) return def; return strtol(av[i+1], NULL, 0); } int main(int ac, char **av) { int div4, delta_sum; int i, n, v, hi, low, note; double sec; smp_freq = opt_int("-r", ac, av, 8000); smp_cnt = 0; bit_len = opt_int("-b", ac, av, 8); if(bit_len != 8 && bit_len != 16) ERR("bit_len"); sign = (opt_idx("-s", ac, av) >= 0); note_buf_init(); div4 = header(); if(!rd_str_chk(4, "MTrk")) ERR("track id"); v = rd_int(4); /* skip */ hi = low = 0; delta_sum = 0; while((v = rd_delta()) != EOF){ delta_sum += v; sec = (double)delta_sum / div4 * 0.5; if((v = rd()) & 0x80){ hi = (v >> 4) & 0xf; low = v & 0xf; }else bk(v); switch(hi){ case 8: case 9: note = rd(); rd(); /* skip velo */ note_onoff(hi == 9, sec, low, note); break; case 0xa: case 0xb: case 0xe: rd(); rd(); break; case 0xc: case 0xd: rd(); break; case 0xf: rd(); switch(low){ case 0: while(rd() != 0xf7); break; case 1: case 3: rd(); break; case 2: rd(); rd(); break; case 0xf: n = rd(); for(i=0; i