diff -urN midi_prog-/Makefile midi_prog/Makefile --- midi_prog-/Makefile 2015-04-21 00:00:00.000000000 +0900 +++ midi_prog/Makefile 2015-04-29 00:00:00.000000000 +0900 @@ -7,8 +7,9 @@ CFLAGS += -Wall -I.. 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 -all: $(TARG) vcd +all: $(TARG) vcd voco $(TARG): $(OBJS) $(CC) -o $@ $(OBJS) $(LIB) @@ -16,8 +17,11 @@ vcd: $(VCD_OBJS) $(CC) -o $@ $(VCD_OBJS) -lm +voco: $(VOCO_OBJS) + $(CC) -o $@ $(VOCO_OBJS) -lm + clean: rm -f $(TARG) $(OBJS) *~ - rm -f vcd $(VCD_OBJS) + rm -f vcd $(VCD_OBJS) voco $(VOCO_OBJS) # EOF diff -urN midi_prog-/in.c midi_prog/in.c --- midi_prog-/in.c 2015-04-20 00:00:00.000000000 +0900 +++ midi_prog/in.c 2015-04-29 00:00:00.000000000 +0900 @@ -11,3 +11,11 @@ *vp = (double)(c - inp->base) / inp->amp; return 0; } + +int +in_do2(in_rec_t *inp, double *vp) +{ + int i; + for(i=0; ich_num; i++) if(in_do(inp, &vp[i]) == EOF) return EOF; + return 0; +} diff -urN midi_prog-/in.h midi_prog/in.h --- midi_prog-/in.h 2015-04-20 00:00:00.000000000 +0900 +++ midi_prog/in.h 2015-04-29 00:00:00.000000000 +0900 @@ -6,5 +6,6 @@ typedef struct out_rec in_rec_t; int in_do(in_rec_t *inp, double *vp); +int in_do2(in_rec_t *inp, double *vp); #endif diff -urN midi_prog-/out.c midi_prog/out.c --- midi_prog-/out.c 2014-04-05 22:00:00.000000000 +0900 +++ midi_prog/out.c 2015-04-29 00:00:00.000000000 +0900 @@ -77,5 +77,11 @@ } } -/* EOF */ +void +out_do2(struct out_rec *ot, double *vp) +{ + int i; + for(i=0; ich_num; i++) out_do(ot, vp[i]); +} +/* EOF */ diff -urN midi_prog-/out.h midi_prog/out.h --- midi_prog-/out.h 2014-01-25 00:00:00.000000000 +0900 +++ midi_prog/out.h 2015-04-29 00:00:00.000000000 +0900 @@ -19,5 +19,6 @@ void out_init(struct out_rec *ot, int ac, char **av); void out_do(struct out_rec *ot, double v); +void out_do2(struct out_rec *ot, double *vp); #endif diff -urN midi_prog-/voco.c midi_prog/voco.c --- midi_prog-/voco.c 1970-01-01 09:00:00.000000000 +0900 +++ midi_prog/voco.c 2015-04-29 00:00:00.000000000 +0900 @@ -0,0 +1,164 @@ +#include "util.h" +#include "vco.h" +#include "in.h" +#include "filter.h" +#include "out.h" +#include "ch.h" + +struct out_rec otr; +in_rec_t in_carrier, in_voice; + +struct band_rec{ + int fl, fh, n; +} band; + +struct voco_rec{ + struct filter_rec bpf, lpf; + struct filter_stat_rec stat_carrier, stat_voice, stat_lpf; + double v_c[2], v_v[2]; +} *voco_inf; + +FILE * +fp_get(char *key, int ac, char **av, char *def_fn, char *mode) +{ + char *fn = opt_str(key, ac, av, def_fn); + if(fn == NULL) return NULL; + if(strcmp(fn, "-") == 0) return strcmp(mode, "r") == 0 ? stdin : stdout; + return fopen(fn, mode); +} + +double * +adj_vol_init(int ac, char **av) +{ + double *adj_vol, v; + char *s, s_idx[8], buf[1024]; + int i; + + if((adj_vol = malloc(sizeof(*adj_vol) * band.n)) == NULL) ERR("No Mem"); + for(i=0; ibpf.type = BPF; + voco->bpf.freq = freq_get(i); + voco->bpf.Q = opt_double("-Q", ac, av, 20); + filter_init(&voco->bpf, &voco->stat_carrier, otr.smp_t); + filter_init(&voco->bpf, &voco->stat_voice, otr.smp_t); + + voco->lpf.type = LPF; + voco->lpf.freq = opt_double("-lpf_freq", ac, av, 20); + voco->lpf.Q = opt_double("-lpf_Q", ac, av, 0.7); + filter_init(&voco->lpf, &voco->stat_lpf, otr.smp_t); +} + +void +vco_init(struct vco_rec *vco, int ac, char **av) +{ + vco->wave1 = opt_int("-wave1", ac, av, vco->wave1); + vco->wave2 = opt_int("-wave2", ac, av, vco->wave2); + vco->tune = opt_int("-tune", ac, av, vco->tune); + vco->mix = opt_double("-mix", ac, av, vco->mix); + vco->ring = opt_int("-mix", ac, av, vco->ring); + vco->alias_noise1 = opt_int("-alias_noise1", ac, av, vco->alias_noise1); + vco->alias_noise2 = opt_int("-alias_noise1", ac, av, vco->alias_noise2); +} + +double +vco_val(struct vco_rec *vco, struct vco_stat_rec *stat, double freq, double sec) +{ + double v1 = vco_out(vco->wave1, vco->alias_noise1, &stat[0], freq, sec, 0); + double v2 = vco_out(vco->wave2, vco->alias_noise2, &stat[1], freq, sec, vco->tune * (1.0 / 1200)); + double v; + if(vco->ring){ + v = v1 * v2; + v1 = (v1 + v2) * 0.5; + v2 = v; + } + return MIX(v1, v2, vco->mix); +} + +int +main(int ac, char **av) +{ + double v_c[2], v_v[2], v_o[2]; + double *adj_vol; + int i, j; + + struct vco_rec vco = { WAVE_SAW, WAVE_SAW, 10, 0.5, 0, 0, 0 }; + double vco_f = opt_double("-vco_f", ac, av, 100); + struct vco_stat_rec stat_vco[2] = { { 0, vco_f, 0 }, { 0, vco_f, 0 } }; + + sscanf(opt_str("-band", ac, av, "500,3000/16"), "%d,%d/%d", &band.fl, &band.fh, &band.n); + + out_init(&otr, ac, av); + otr.fp = fp_get("-o", ac, av, "-", "w"); + in_carrier = in_voice = otr; + if((in_carrier.fp = fp_get("-carrier", ac, av, NULL, "r")) == NULL){ + vco_init(&vco, ac, av); + } + in_voice.fp = fp_get("-voice", ac, av, NULL, "r"); + + if((voco_inf = malloc(sizeof(*voco_inf) * band.n)) == NULL) ERR("No Mem"); + for(i=0; i