diff -urN midi_prog-/pitdet.c midi_prog/pitdet.c --- midi_prog-/pitdet.c 2015-08-14 00:00:00.000000000 +0900 +++ midi_prog/pitdet.c 2015-08-22 00:00:00.000000000 +0900 @@ -1,32 +1,33 @@ #include "pitdet.h" double -pitdet_note_to_freq(double note) +pitdet_note_to_freq(struct pitdet *pd, double note) { - return 440 * pow(2, (note - 69) / 12); + return 440 * pow(2, (note - 69 + pd->adj_cent * 0.01) / 12); } double -pitdet_freq_to_note(double freq) +pitdet_freq_to_note(struct pitdet *pd, double freq) { - return log(freq / 440) / log(2) * 12 + 69; + return log(freq / 440) / log(2) * 12 + 69 - pd->adj_cent * 0.01; } void -pitdet_init(struct pitdet *pd, double smp_freq, +pitdet_init(struct pitdet *pd, double smp_freq, int adj_cent, int div, double abuf_wsec) { int j; pd->div = div; + pd->adj_cent = adj_cent; pd->m = pd->div * 128; if((pd->arr = malloc(sizeof(*pd->arr) * pd->m)) == NULL) ERR("No Mem"); for(j=0; jm; j++){ - double note = (double)j / pd->div - 0.5; - double next_note = (double)(j+1) / pd->div - 0.5; - double freq = pitdet_note_to_freq(note); - double next_freq = pitdet_note_to_freq(next_note); + double note = (j + 0.5) / pd->div - 0.5; + double next_note = (j + 1 + 0.5) / pd->div - 0.5; + double freq = pitdet_note_to_freq(pd, note); + double next_freq = pitdet_note_to_freq(pd, next_note); int wn = (int) pitch_wn(freq, next_freq); pitch_init(&pd->arr[j], smp_freq, freq, wn, abuf_wsec); diff -urN midi_prog-/pitdet.h midi_prog/pitdet.h --- midi_prog-/pitdet.h 2015-08-14 00:00:00.000000000 +0900 +++ midi_prog/pitdet.h 2015-08-22 00:00:00.000000000 +0900 @@ -5,6 +5,7 @@ struct pitdet{ int div; + int adj_cent; int m; struct pitch *arr; @@ -16,10 +17,10 @@ double max_v; }; -double pitdet_note_to_freq(double note); -double pitdet_freq_to_note(double freq); +double pitdet_note_to_freq(struct pitdet *pd, double note); +double pitdet_freq_to_note(struct pitdet *pd, double freq); -void pitdet_init(struct pitdet *pd, double smp_freq, +void pitdet_init(struct pitdet *pd, double smp_freq, int adj_cent, int div, double abuf_wsec); void pitdet_add(struct pitdet *pd, double v); diff -urN midi_prog-/tool.c midi_prog/tool.c --- midi_prog-/tool.c 2015-08-14 00:00:00.000000000 +0900 +++ midi_prog/tool.c 2015-08-22 00:00:00.000000000 +0900 @@ -55,6 +55,51 @@ int j, js, je; char s[32]; double sec = pd->oldest.sec; + int test_off = opt_idx("-test_off", ac, av) > 0; + struct{ + int stat; + double v; + } *wk; + + if((wk = malloc(sizeof(*wk) * pd->m)) == NULL) ERR("No Mem"); + + for(j=0; jm; j++){ + struct pitch *p = &pd->arr[j]; + wk[j].stat = 0; + wk[j].v = tbuf_get_dbl(&p->ab.tb, sec); + } + + while(!test_off){ + int t = -1, j; + double v_max = 0; + for(j=0; jm; j++){ + if(wk[j].stat != 0) continue; + if(t < 0 || wk[j].v > v_max){ + t = j; + v_max = wk[j].v; + } + } + if(t < 0) break; + wk[t].stat++; + + for(j=0; jm; j++){ + double a, x, k; + + if(wk[j].stat != 0) continue; + + /* + wn/(2*freq) = (wn+a)/(2*freq[j]) + a = wn*freq[j]/freq - wn + = wn*(freq[j]/freq - 1) + */ + a = pd->arr[t].wn * (pd->arr[j].freq / pd->arr[t].freq - 1); + x = a * M_PI; + k = sin(x) / x; + k = k < 0 ? -k : k; + + wk[j].v -= wk[t].v * k; + } + } sprintf(s, "sec=%f ", sec); printf("%s", s); @@ -62,8 +107,7 @@ show_spectre_modify_area(pd, ac, av, s, &js, &je); for(j=js; jarr[j]; - double v = tbuf_get_dbl(&p->ab.tb, sec); + double v = wk[j].v; int iv = (int)(10 * v / pd->max_v); if(iv < 0) iv = -1; @@ -73,6 +117,8 @@ if(pd->div > 1 && j % pd->div == pd->div-1 && j != je-1) putchar(' '); } putchar('\n'); + + free(wk); } int @@ -82,11 +128,12 @@ double v; struct pitdet pd; + int adj_cent = opt_int("-adj_cent", ac, av, 0); int div = opt_int("-div", ac, av, 1); double abuf_wsec = opt_double("-abuf_wsec", ac, av, 2.5); in_init(&in, ac, av); - pitdet_init(&pd, in.smp_freq, div, abuf_wsec); + pitdet_init(&pd, in.smp_freq, adj_cent, div, abuf_wsec); while(in_do_mono(&in, &v) != EOF){ pitdet_add(&pd, v);