diff -urN midi_prog-/Makefile midi_prog/Makefile --- midi_prog-/Makefile 2014-01-25 00:00:00.000000000 +0900 +++ midi_prog/Makefile 2014-01-26 00:00:00.000000000 +0900 @@ -1,6 +1,6 @@ CC = gcc -Wall LIB = -lm -TARG = prog28 +TARG = prog29 OBJS = main.o vcf.o ch.o delay.o stat.o note.o env.o tone.o filter.o lfo.o modu.o vco.o wave.o out.o rd.o util.o all: $(TARG) diff -urN midi_prog-/vco.c midi_prog/vco.c --- midi_prog-/vco.c 2014-01-24 00:00:00.000000000 +0900 +++ midi_prog/vco.c 2014-01-26 00:00:00.000000000 +0900 @@ -11,9 +11,12 @@ double vco_out(int wave, struct vco_stat_rec *stat, double freq, double sec, double modu_v) { + double cycle_prev; + if(modu_v != 0) freq *= pow(2, modu_v); + cycle_prev = stat->cycle; vco_stat_update(stat, freq, sec); - return wave_out(wave, stat->cycle); + return wave_out2(wave, cycle_prev, stat->cycle); } /* EOF */ diff -urN midi_prog-/wave.c midi_prog/wave.c --- midi_prog-/wave.c 2014-01-24 00:00:00.000000000 +0900 +++ midi_prog/wave.c 2014-01-26 00:00:00.000000000 +0900 @@ -16,8 +16,35 @@ return cycle < 0.5 ? 1 : -1; case WAVE_NOISE: return ((double)rand() / RAND_MAX) * 2 - 1; + + case WAVE_INTEGRAL | WAVE_SAW: + return cycle < 0.5 ? cycle * cycle : (1 - cycle) * (1 - cycle); + case WAVE_INTEGRAL | WAVE_SQUARE: + return cycle < 0.5 ? cycle : 1 - cycle; } return 0; } +double +wave_out2(int wave, double cycle_prev, double cycle) +{ + double d, v, v_prev; + + switch(wave){ + case WAVE_SIN: + case WAVE_NOISE: + return wave_out(wave, cycle); + } + cycle -= (int)cycle; + cycle_prev -= (int)cycle_prev; + d = cycle - cycle_prev; + if(d < 0) d += 1; + if(d == 0) return wave_out(wave, cycle); + + wave |= WAVE_INTEGRAL; + v = wave_out(wave, cycle); + v_prev = wave_out(wave, cycle_prev); + return (v - v_prev) / d; +} + /* EOF */ diff -urN midi_prog-/wave.h midi_prog/wave.h --- midi_prog-/wave.h 2014-01-24 00:00:00.000000000 +0900 +++ midi_prog/wave.h 2014-01-26 00:00:00.000000000 +0900 @@ -7,7 +7,9 @@ #define WAVE_SAW 1 #define WAVE_SQUARE 2 #define WAVE_NOISE 3 +#define WAVE_INTEGRAL (1<<8) double wave_out(int wave, double cycle); +double wave_out2(int wave, double cycle_prev, double cycle); #endif