diff -urN midi_prog-/Makefile midi_prog/Makefile --- midi_prog-/Makefile Thu Jun 25 00:00:00 2015 +++ midi_prog/Makefile Fri Aug 7 00:00:00 2015 @@ -9,8 +9,9 @@ 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 -all: $(TARG) vcd voco midtxt +all: $(TARG) vcd voco midtxt tool $(TARG): $(OBJS) $(CC) -o $@ $(OBJS) $(LIB) @@ -24,9 +25,13 @@ midtxt: $(MIDTXT_OBJS) $(CC) -o $@ $(MIDTXT_OBJS) +tool: $(TOOL_OBJS) + $(CC) -o $@ $(TOOL_OBJS) -lm + clean: rm -f $(TARG) $(OBJS) *~ rm -f vcd $(VCD_OBJS) voco $(VOCO_OBJS) rm -f midtxt $(MIDTXT_OBJS) + rm -f tool $(TOOL_OBJS) # EOF diff -urN midi_prog-/buf.c midi_prog/buf.c --- midi_prog-/buf.c Thu Jan 1 09:00:00 1970 +++ midi_prog/buf.c Fri Aug 7 00:00:00 2015 @@ -0,0 +1,153 @@ +#include "buf.h" + +void +rbuf_init_alloc(struct rbuf *rb, int n, int is_complex) +{ + int sz = ( is_complex ? sizeof(rb->c[0]) : sizeof(rb->d[0]) ) * n; + rb->n = n; + rb->n_bak = rb->n; + rb->is_cpx = is_complex; + if((rb->buf = malloc(sz)) == NULL) ERR("No Mem"); + rb->d = !is_complex ? rb->buf : NULL; + rb->c = is_complex ? rb->buf : NULL; + + rbuf_init(rb); +} + +void +rbuf_init_alloc_dbl(struct rbuf *rb, int n) +{ + rbuf_init_alloc(rb, n, 0); +} + +void +rbuf_init_alloc_cpx(struct rbuf *rb, int n) +{ + rbuf_init_alloc(rb, n, 1); +} + +void +rbuf_init(struct rbuf *rb) +{ + int i; + rb->n = rb->n_bak; + rb->cnt = 0; + for(i=0; in; i++){ + if(rb->is_cpx) rb->c[i] = 0; + else rb->d[i] = 0; + } +} + +void +rbuf_init_n(struct rbuf *rb, int n) +{ + rbuf_init(rb); + rb->n = n; +} + +void +rbuf_copy_init(struct rbuf *rb, struct rbuf *src) +{ + int i; + rb->cnt = src->cnt; + for(i=0; in; i++){ + if(rb->is_cpx) rb->c[i] = src->c[i]; + else rb->d[i] = src->d[i]; + } +} + +void +rbuf_free(struct rbuf *rb) +{ + if(rb->buf){ + free(rb->buf); + rb->buf = NULL; + rb->d = NULL; + rb->c = NULL; + } +} + + +double +rbuf_get_arr_dbl(struct rbuf *rb, int i) +{ + if(rb->is_cpx) ERR("is_cpx"); + return rb->d[i]; +} + +double complex +rbuf_get_arr_cpx(struct rbuf *rb, int i) +{ + if(!rb->is_cpx) ERR("not is_cpx"); + return rb->c[i]; +} + +void +rbuf_set_arr_dbl(struct rbuf *rb, int i, double v) +{ + if(rb->is_cpx) ERR("is_cpx"); + rb->d[i] = v; +} + +void +rbuf_set_arr_cpx(struct rbuf *rb, int i, double complex v) +{ + if(!rb->is_cpx) ERR("not is_cpx"); + rb->c[i] = v; +} + +void +rbuf_add_dbl(struct rbuf *rb, double v) +{ + rbuf_set_arr_dbl(rb, rb->cnt++ % rb->n, v); +} + +void +rbuf_add_cpx(struct rbuf *rb, double complex v) +{ + rbuf_set_arr_cpx(rb, rb->cnt++ % rb->n, v); +} + +int +rbuf_oldest(struct rbuf *rb) +{ + return rb->cnt - rb->n; +} + +int +rbuf_newest(struct rbuf *rb) +{ + return rb->cnt - 1; +} + +int +rbuf_next(struct rbuf *rb) +{ + return rb->cnt; +} + +static int +arr_idx(int si, int n) +{ + return (si + (si < 0 ? n : 0)) % n; +} + +double +rbuf_get_dbl(struct rbuf *rb, double sridx) +{ + int si = (int) sridx; + double d = sridx - si; + double v = rbuf_get_arr_dbl(rb, arr_idx(si, rb->n)); + if(d == 0) return v; + return v + (rbuf_get_arr_dbl(rb, arr_idx((si + 1), rb->n)) - v) * d; +} + +double complex +rbuf_get_cpx(struct rbuf *rb, double sridx) +{ + int si = (int) sridx; + double d = sridx - si; + double complex v = rbuf_get_arr_cpx(rb, arr_idx(si, rb->n)); + if(d == 0) return v; + return v + (rbuf_get_arr_cpx(rb, arr_idx((si + 1), rb->n)) - v) * d; +} diff -urN midi_prog-/buf.h midi_prog/buf.h --- midi_prog-/buf.h Thu Jan 1 09:00:00 1970 +++ midi_prog/buf.h Fri Aug 7 00:00:00 2015 @@ -0,0 +1,39 @@ +#ifndef __BUF_H__ +#define __BUF_H__ + +#include +#include "util.h" + +struct rbuf{ + int n, cnt, is_cpx, n_bak; + void *buf; + double *d; + double complex *c; +}; + +void rbuf_init_alloc(struct rbuf *rb, int n, int is_complex); +void rbuf_init_alloc_dbl(struct rbuf *rb, int n); +void rbuf_init_alloc_cpx(struct rbuf *rb, int n); + +void rbuf_init(struct rbuf *rb); +void rbuf_init_n(struct rbuf *rb, int n); +void rbuf_copy_init(struct rbuf *rb, struct rbuf *src); +void rbuf_free(struct rbuf *rb); + +double rbuf_get_arr_dbl(struct rbuf *rb, int i); +double complex rbuf_get_arr_cpx(struct rbuf *rb, int i); +void rbuf_set_arr_dbl(struct rbuf *rb, int i, double v); +void rbuf_set_arr_cpx(struct rbuf *rb, int i, double complex v); + +void rbuf_add_dbl(struct rbuf *rb, double v); +void rbuf_add_cpx(struct rbuf *rb, double complex v); + +/* return sridx : serial index */ +int rbuf_oldest(struct rbuf *rb); +int rbuf_newest(struct rbuf *rb); +int rbuf_next(struct rbuf *rb); + +double rbuf_get_dbl(struct rbuf *rb, double sridx); +double complex rbuf_get_cpx(struct rbuf *rb, double sridx); + +#endif diff -urN midi_prog-/in.c midi_prog/in.c --- midi_prog-/in.c Wed Apr 29 00:00:00 2015 +++ midi_prog/in.c Fri Aug 7 00:00:00 2015 @@ -1,5 +1,14 @@ #include "in.h" +void +in_init(in_rec_t *inp, int ac, char **av) +{ + struct out_rec otr; + out_init(&otr, ac, av); + *inp = otr; + inp->fp = stdin; +} + int in_do(in_rec_t *inp, double *vp) { @@ -17,5 +26,17 @@ { int i; for(i=0; ich_num; i++) if(in_do(inp, &vp[i]) == EOF) return EOF; + return 0; +} + +int +in_do_mono(in_rec_t *inp, double *vp) +{ + double v[2]; + int i; + if(in_do2(inp, v) == EOF) return EOF; + *vp = 0; + for(i=0; ich_num; i++) *vp += v[i]; + *vp /= inp->ch_num; return 0; } diff -urN midi_prog-/in.h midi_prog/in.h --- midi_prog-/in.h Wed Apr 29 00:00:00 2015 +++ midi_prog/in.h Fri Aug 7 00:00:00 2015 @@ -5,7 +5,9 @@ typedef struct out_rec in_rec_t; +void in_init(in_rec_t *inp, int ac, char **av); int in_do(in_rec_t *inp, double *vp); int in_do2(in_rec_t *inp, double *vp); +int in_do_mono(in_rec_t *inp, double *vp); #endif diff -urN midi_prog-/tool.c midi_prog/tool.c --- midi_prog-/tool.c Thu Jan 1 09:00:00 1970 +++ midi_prog/tool.c Fri Aug 7 00:00:00 2015 @@ -0,0 +1,16 @@ +#include "util.h" +#include "in.h" + +int +main(int ac, char **av) +{ + in_rec_t in; + double v; + + in_init(&in, ac, av); + + while(in_do_mono(&in, &v) != EOF){ + printf("v=%f\n", v); + } + return 0; +}