diff -urN midi_prog-/Makefile midi_prog/Makefile --- midi_prog-/Makefile Wed Aug 12 00:00:00 2015 +++ midi_prog/Makefile Thu Aug 13 00:00:00 2015 @@ -9,7 +9,7 @@ VCD_OBJS = vcd.o in.o filter.o out.o wrt.o util.o VOCO_OBJS = voco.o vco.o wave.o in.o filter.o out.o util.o MIDTXT_OBJS = midtxt.o rd.o wrt.o util.o -TOOL_OBJS = tool.o in.o out.o util.o buf.o pitch.o +TOOL_OBJS = tool.o in.o out.o util.o buf.o pitch.o pitdet.o all: $(TARG) vcd voco midtxt tool diff -urN midi_prog-/pitdet.c midi_prog/pitdet.c --- midi_prog-/pitdet.c Thu Jan 1 09:00:00 1970 +++ midi_prog/pitdet.c Thu Aug 13 00:00:00 2015 @@ -0,0 +1,58 @@ +#include "pitdet.h" + +double +pitdet_note_to_freq(double note) +{ + return 440 * pow(2, (note - 69) / 12); +} + +double +pitdet_freq_to_note(double freq) +{ + return log(freq / 440) / log(2) * 12 + 69; +} + +void +pitdet_init(struct pitdet *pd, double smp_freq, + int div, double abuf_wsec) +{ + int j; + + pd->div = div; + 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); + int wn = (int) pitch_wn(freq, next_freq); + + pitch_init(&pd->arr[j], smp_freq, freq, wn, abuf_wsec); + } + + pd->oldest_sec = -1; + pd->newest_sec = -1; +} + +void +pitdet_add(struct pitdet *pd, double v) +{ + int j; + double sec; + + pd->oldest_sec = -1; + pd->newest_sec = -1; + + for(j=0; jm; j++){ + struct pitch *p = &pd->arr[j]; + pitch_add(p, v); + + sec = tbuf_oldest_sec(&p->ab.tb); + if(pd->oldest_sec < 0 || sec > pd->oldest_sec) pd->oldest_sec = sec; + + sec = tbuf_newest_sec(&p->ab.tb); + if(pd->newest_sec < 0 || sec < pd->newest_sec) pd->newest_sec = sec; + } +} diff -urN midi_prog-/pitdet.h midi_prog/pitdet.h --- midi_prog-/pitdet.h Thu Jan 1 09:00:00 1970 +++ midi_prog/pitdet.h Thu Aug 13 00:00:00 2015 @@ -0,0 +1,21 @@ +#ifndef __PITDET_H__ +#define __PITDET_H__ + +#include "pitch.h" + +struct pitdet{ + int div; + int m; + struct pitch *arr; + double oldest_sec, newest_sec; +}; + +double pitdet_note_to_freq(double note); +double pitdet_freq_to_note(double freq); + +void pitdet_init(struct pitdet *pd, double smp_freq, + int div, double abuf_wsec); + +void pitdet_add(struct pitdet *pd, double v); + +#endif diff -urN midi_prog-/tool.c midi_prog/tool.c --- midi_prog-/tool.c Wed Aug 12 00:00:00 2015 +++ midi_prog/tool.c Thu Aug 13 00:00:00 2015 @@ -1,6 +1,6 @@ #include "util.h" #include "in.h" -#include "pitch.h" +#include "pitdet.h" int main(int ac, char **av) @@ -8,22 +8,22 @@ in_rec_t in; double v; - struct pitch p; - double freq = 440.0; - double next_freq = 440 * pow(2, (70-69)/12.0); - int wn = (int) pitch_wn(freq, next_freq); + struct pitdet pd; + int div = opt_int("-div", ac, av, 1); double abuf_wsec = opt_double("-abuf_wsec", ac, av, 0.5); - double sec, sec_bak = -1; + double old_bak = 0, new_bak = 0; in_init(&in, ac, av); - pitch_init(&p, in.smp_freq, freq, wn, abuf_wsec); + pitdet_init(&pd, in.smp_freq, div, abuf_wsec); while(in_do_mono(&in, &v) != EOF){ - pitch_add(&p, v); - sec = tbuf_newest_sec(&p.ab.tb); - if(sec <= sec_bak) continue; - printf("sec=%f v=%f\n", sec, p.ab.sum); - sec_bak = sec; + pitdet_add(&pd, v); + if( pd.oldest_sec > 0 && pd.newest_sec > 0 && + (pd.oldest_sec > old_bak || pd.newest_sec > new_bak) ){ + printf("%f %f\n", pd.oldest_sec, pd.newest_sec); + old_bak = pd.oldest_sec; + new_bak = pd.newest_sec; + } } return 0; }