diff -urN midi_prog-/pitdet.c midi_prog/pitdet.c --- midi_prog-/pitdet.c Fri Aug 28 00:00:00 2015 +++ midi_prog/pitdet.c Sat Sep 5 00:00:00 2015 @@ -50,8 +50,8 @@ if((pd->wk = malloc(sizeof(*pd->wk) * pd->m)) == NULL) ERR("No Mem"); } -static void -shadow_cut(struct pitdet *pd, double sec) +void +pitdet_shadow_cut(struct pitdet *pd, double sec) { int j; @@ -127,7 +127,7 @@ 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) shadow_cut(pd, pd->newest.sec); + if(pd->newest.update && pd->newest.sec >= 0) pitdet_shadow_cut(pd, pd->newest.sec); } int diff -urN midi_prog-/pitdet.h midi_prog/pitdet.h --- midi_prog-/pitdet.h Fri Aug 28 00:00:00 2015 +++ midi_prog/pitdet.h Sat Sep 5 00:00:00 2015 @@ -34,6 +34,7 @@ double pitdet_freq_to_note(struct pitdet *pd, double freq); 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); int pitdet_sec_to_tick(struct pitdet *pd, double sec); diff -urN midi_prog-/tool.c midi_prog/tool.c --- midi_prog-/tool.c Tue Sep 1 00:00:00 2015 +++ midi_prog/tool.c Sat Sep 5 00:00:00 2015 @@ -80,7 +80,7 @@ struct pitdet *pd; int note; double on_sec; - int pre_release; + double pre_release; int cut_over_tone; } note_onoff[ NOTE_N ]; @@ -151,7 +151,7 @@ nto->on_sec = -1; if(nto->pre_release > 0){ - int off_lmt = on_sec + nto->ct.lmt_sec; + double off_lmt = on_sec + 1.0 / nto->pd->tick_freq; off_sec -= nto->pre_release; if(off_sec < off_lmt) off_sec = off_lmt; } @@ -204,6 +204,8 @@ int midi = opt_idx("-midi", ac, av) > 0; 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); @@ -219,6 +221,27 @@ } } + 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); + } + pitdet_shadow_cut(&pd, pd.newest.sec); + + if((s = (int)pd.newest.sec) != sec){ + sec = s; + fprintf(stderr, "%d sec \r", sec); + } + + if(show) show_spectre(&pd, ac, av); + if(midi) midi_out(&pd); + } + while(in_do_mono(&in, &v) != EOF){ pitdet_add(&pd, v); if(!pd.newest.update) continue; @@ -229,6 +252,17 @@ } 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); diff -urN midi_prog-/util.c midi_prog/util.c --- midi_prog-/util.c Sat Aug 29 00:00:00 2015 +++ midi_prog/util.c Sat Sep 5 00:00:00 2015 @@ -179,8 +179,6 @@ ct->chg_try_sec = -1; return 0; } - if(sec - ct->sec < ct->lmt_sec) return 0; - if(ct->chg_try_sec < 0){ ct->chg_try_sec = sec; return 0;