diff -urN midi_prog-/main.c midi_prog/main.c --- midi_prog-/main.c Wed Jun 3 00:00:00 2015 +++ midi_prog/main.c Tue Sep 8 00:00:00 2015 @@ -75,6 +75,7 @@ int tempo, tempo_delta_sum; double tempo_sec; pthread_t pth; + int verb = opt_idx("-v", ac, av) > 0; tone_init(); out_init(&otr, ac, av); @@ -100,6 +101,14 @@ while((v = rd_delta()) != EOF){ delta_sum += v; sec = tempo_sec + (double)(delta_sum - tempo_delta_sum) / div4 * tempo * 0.000001; + if(verb){ + static int bs = -1; + int s = (int)sec; + if(s != bs){ + bs = s; + fprintf(stderr, "%d sec \r", s); + } + } if((v = rd()) & 0x80){ hi = (v >> 4) & 0xf; diff -urN midi_prog-/pitdet.c midi_prog/pitdet.c --- midi_prog-/pitdet.c Sat Sep 5 00:00:00 2015 +++ midi_prog/pitdet.c Tue Sep 8 00:00:00 2015 @@ -48,6 +48,9 @@ pd->max_v = -1; if((pd->wk = malloc(sizeof(*pd->wk) * pd->m)) == NULL) ERR("No Mem"); + + pd->save = fp_get("-pd_save", ac, av, NULL, "w", NULL); + pd->load = fp_get("-pd_load", ac, av, NULL, "r", NULL); } void @@ -56,15 +59,13 @@ int j; for(j=0; jm; j++){ - double v = tbuf_get_dbl(&pd->arr[j].ab.tb, sec); + double v = pitdet_get(pd, j, sec); int onoff = pitdet_onoff_judge(pd, v); pd->wk[j].stat = onoff ? 0 : -1; pd->wk[j].v = onoff ? v : -1; } - if(!pd->shadow_cut_en) return; - - while(1){ + while(pd->shadow_cut_en){ int t = -1; double v_max = 0; for(j=0; jm; j++){ @@ -99,9 +100,16 @@ k = ABS(k); pd->wk[j].v -= pd->wk[t].v * k; - if(!pitdet_onoff_judge(pd, pd->wk[j].v)) pd->wk[j].stat = -1; + if(!pitdet_onoff_judge(pd, pd->wk[j].v)){ + pd->wk[j].stat = -1; + pd->wk[j].v = -1; + } } } + + for(j=0; jm; j++){ + tbuf_set_dbl(&pd->arr[j].ab.tb, sec, pd->wk[j].v); + } } void @@ -127,7 +135,59 @@ if((pd->oldest.update = (pd->oldest.sec != osec)) != 0) pd->oldest.sec = osec; if((pd->newest.update = (pd->newest.sec != nsec)) != 0) pd->newest.sec = nsec; - if(pd->newest.update && pd->newest.sec >= 0) pitdet_shadow_cut(pd, pd->newest.sec); + if(!pd->newest.update || pd->newest.sec < 0) return; + + if(pd->save) pitdet_save(pd); + + pitdet_shadow_cut(pd, pd->newest.sec); +} + +double +pitdet_get(struct pitdet *pd, int j, double sec) +{ + struct pitch *p = &pd->arr[j]; + return tbuf_get_dbl(&p->ab.tb, sec); +} + +static void +wrt_dbl(FILE *fp, double v) +{ + fwrite(&v, sizeof(v), 1, fp); +} + +static int +rd_dbl(FILE *fp, double *ret_v) +{ + return fread(ret_v, sizeof(*ret_v), 1, fp) <= 0 ? EOF : 0; +} + +void +pitdet_save(struct pitdet *pd) +{ + int j; + double sec = pd->newest.sec; + + wrt_dbl(pd->save, sec); + wrt_dbl(pd->save, pd->max_v); + for(j=0; jm; j++){ + wrt_dbl(pd->save, pitdet_get(pd, j, sec)); + } +} + +int +pitdet_load(struct pitdet *pd) +{ + int j; + + if(rd_dbl(pd->load, &pd->newest.sec) == EOF) return EOF; + if(rd_dbl(pd->load, &pd->max_v) == EOF) return EOF; + for(j=0; jm; j++){ + struct pitch *p = &pd->arr[j]; + double v; + if(rd_dbl(pd->load, &v) == EOF) return EOF; + abuf_add(&p->ab, v); + } + return 0; } int @@ -135,6 +195,12 @@ { struct tbuf *tb = &pd->arr[0].ab.tb; return (int) tbuf_sec_to_sridx(tb, sec); +} + +int +pitdet_eq_sec(struct pitdet *pd, double sec1, double sec2) +{ + return pitdet_sec_to_tick(pd, sec1) == pitdet_sec_to_tick(pd, sec2); } int diff -urN midi_prog-/pitdet.h midi_prog/pitdet.h --- midi_prog-/pitdet.h Sat Sep 5 00:00:00 2015 +++ midi_prog/pitdet.h Tue Sep 8 00:00:00 2015 @@ -28,6 +28,8 @@ int stat; double v; } *wk; + + FILE *save, *load; }; double pitdet_note_to_freq(struct pitdet *pd, double note); @@ -36,8 +38,13 @@ void pitdet_init(struct pitdet *pd, double smp_freq, int ac, char **av); void pitdet_shadow_cut(struct pitdet *pd, double sec); void pitdet_add(struct pitdet *pd, double v); +double pitdet_get(struct pitdet *pd, int j, double sec); + +void pitdet_save(struct pitdet *pd); +int pitdet_load(struct pitdet *pd); int pitdet_sec_to_tick(struct pitdet *pd, double sec); +int pitdet_eq_sec(struct pitdet *pd, double sec1, double sec2); int pitdet_onoff_judge(struct pitdet *pd, double v); #endif diff -urN midi_prog-/tool.c midi_prog/tool.c --- midi_prog-/tool.c Sat Sep 5 00:00:00 2015 +++ midi_prog/tool.c Tue Sep 8 00:00:00 2015 @@ -55,6 +55,8 @@ int j, js, je; char s[32]; double sec = pd->newest.sec; + double detail_sec = opt_double("-show_detail_sec", ac, av, -1); + int detail = detail_sec >= 0 && pitdet_eq_sec(pd, detail_sec, sec); sprintf(s, "sec=%f ", sec); printf("%s", s); @@ -62,7 +64,7 @@ show_spectre_modify_area(pd, ac, av, s, &js, &je); for(j=js; jwk[j].v; + double v = pitdet_get(pd, j, sec); int iv = (int)(10 * v / pd->max_v); if(iv < 0) iv = -1; @@ -72,6 +74,29 @@ if(pd->div > 1 && j % pd->div == pd->div-1 && j != je-1) putchar(' '); } putchar('\n'); + + if(detail){ + int show_w = opt_int("-show_w", ac, av, -1); + char buf[1024]; + int x = 0, l; + + putchar('\n'); + for(j=0; jm; j++){ + sprintf(buf, "%d:%f%s", j, pitdet_get(pd, j, sec), + pd->div > 1 && j % pd->div == pd->div-1 ? " | " : " "); + if(show_w >= 0){ + l = strlen(buf); + if(x + l > show_w){ + putchar('\n'); + x = 0; + } + x += l; + } + printf("%s", buf); + } + putchar('\n'); + putchar('\n'); + } } struct note_onoff{ @@ -97,10 +122,16 @@ nto->cut_over_tone = opt_idx("-cut_over_tone", ac, av) > 0; } +double +note_onoff_v(struct note_onoff *nto, double on_sec, double off_sec) +{ + return abuf_mean(&nto->ab, on_sec, off_sec); +} + int note_onoff_velo(struct note_onoff *nto, double on_sec, double off_sec) { - double v = abuf_mean(&nto->ab, on_sec, off_sec); + double v = note_onoff_v(nto, on_sec, off_sec); int velo = (int)(128 * v / nto->pd->max_v); if(velo < 0) velo = 0; if(velo > 127) velo = 127; @@ -108,23 +139,25 @@ } int -note_onoff_is_overtone(struct note_onoff *nto, double on_sec, double off_sec, int velo) +note_onoff_is_overtone(struct note_onoff *nto, double on_sec, double off_sec) { /* Fundamental, Overtone */ - int lst[] = { 12, 12+7, 12*2, 12*2+4, 12*2+7 }; + int lst[] = { 12, 12+7, 12*2 }; int lst_n = ARR_N(lst); int i, t; + double v = note_onoff_v(nto, on_sec, off_sec); for(i=0; inote - lst[i]) < 0) continue; funda = ¬e_onoff[t]; /* ! */ - velo_f = note_onoff_velo(funda, on_sec, off_sec); + v_f = note_onoff_v(funda, on_sec, off_sec); - if(velo_f >= velo * 0.7) return 1; + if(v_f >= v * n * 0.7) return 1; } return 0; } @@ -157,7 +190,7 @@ } if((velo = note_onoff_velo(nto, on_sec, off_sec)) == 0) return; - if(nto->cut_over_tone && note_onoff_is_overtone(nto, on_sec, off_sec, velo)) return; + if(nto->cut_over_tone && note_onoff_is_overtone(nto, on_sec, off_sec)) return; tick = pitdet_sec_to_tick(nto->pd, on_sec); printf("abs=%08d %s ch=%d note=%d velo=%d\n", @@ -182,7 +215,7 @@ double sum = 0, v; for(k=0; kdiv; k++){ int j = i * pd->div + k; - v = pd->wk[j].v; + v = pitdet_get(pd, j, sec); int o = pitdet_onoff_judge(pd, v); onoff |= o; if(o) sum += v; @@ -205,7 +238,6 @@ int abuf_wsec_chk = opt_idx("-abuf_wsec_chk", ac, av) > 0; int sec, s; FILE *pd_load = fp_get("-pd_load", ac, av, NULL, "r", NULL); - FILE *pd_save = fp_get("-pd_save", ac, av, NULL, "w", NULL); in_init(&in, ac, av, NULL); pitdet_init(&pd, in.smp_freq, ac, av); @@ -222,15 +254,8 @@ } while(pd_load){ - int j; - if(fread(&pd.newest.sec, sizeof(double), 1, pd_load) <= 0) return 0; - fread(&pd.max_v, sizeof(double), 1, pd_load); - for(j=0; jab, v); - } + if(pitdet_load(&pd) == EOF) return 0; + pitdet_shadow_cut(&pd, pd.newest.sec); if((s = (int)pd.newest.sec) != sec){ @@ -252,17 +277,6 @@ } if(pd.newest.sec < 0) continue; - - if(pd_save){ - int j; - fwrite(&pd.newest.sec, sizeof(double), 1, pd_save); - fwrite(&pd.max_v, sizeof(double), 1, pd_save); - for(j=0; jab.tb, pd.newest.sec); - fwrite(&v, sizeof(double), 1, pd_save); - } - } if(show) show_spectre(&pd, ac, av); if(midi) midi_out(&pd);