diff -urN midi_prog-/Makefile midi_prog/Makefile --- midi_prog-/Makefile Wed Apr 1 03:00:00 2015 +++ midi_prog/Makefile Thu Apr 2 00:00:00 2015 @@ -1,6 +1,6 @@ CC = gcc LIB = -lm -lpthread -L../cui -lcui -TARG = prog50 +TARG = prog51 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 OBJS += cui_tone.o CFLAGS += -Wall -I.. diff -urN midi_prog-/tone.c midi_prog/tone.c --- midi_prog-/tone.c Wed Apr 1 03:00:00 2015 +++ midi_prog/tone.c Thu Apr 2 00:00:00 2015 @@ -3,7 +3,7 @@ #include "vcf.h" #include "stat.h" -static struct tone_rec tone_inf[] = { +static struct tone_rec tone_inf_default[] = { { "strings", { WAVE_SAW, WAVE_SAW, 12, 0.5, OFF }, @@ -106,14 +106,16 @@ },{ NULL, } -}; +}, +*tone_inf = tone_inf_default; +static int tone_inf_n; #define PROG_DRUM 0 static struct{ int prog, note; /* note for ch 9 */ struct tone_compo_rec *tone_compo; -} tones_lst[] = { +} tones_lst_default[] = { { PROG_DRUM, 36, /* bass drum1 */ (struct tone_compo_rec []){ @@ -288,7 +290,9 @@ },{ -1, /* tail */ } -}; +}, +*tones_lst = tones_lst_default; +static int tones_lst_n; struct name_lst{ char *name; @@ -506,6 +510,131 @@ save_n_data(name_inf.area_sz, 1, name_inf.area, fp); fclose(fp); +} + +static void * +load_n_data(int *np, int usz, FILE *fp) +{ + int n; + void *p = NULL; + + if(fread(np, sizeof(n), 1, fp) != 1){ + fprintf(stderr, "error read\n"); + return p; + } + n = *np; + if((p = malloc(usz * n)) == NULL){ + fprintf(stderr, "No mem\n"); + return p; + } + if(fread(p, usz, n, fp) != n){ + fprintf(stderr, "error read\n"); + free(p); + return NULL; + } + return p; +} + +static char * +id_to_name(char *id) +{ + int i; + + for(i=0; iname; tone++){ + tone->name = id_to_name(tone->name); + } + + for(i=0; tones_lst[i].prog >= 0; i++){ + tones_lst[i].tone_compo = id_to_compo(tones_lst[i].tone_compo); + if(tones_lst[i].tone_compo == NULL) continue; + for(tone_compo=tones_lst[i].tone_compo; tone_compo->name; tone_compo++){ + tone_compo->name = id_to_name(tone_compo->name); + tone_compo->tone = name_search(tone_compo->name); + } + } +} + +void +tone_load(char *path) +{ + FILE *fp; + int sz_lst[] = { + sizeof(tone_inf[0]), sizeof(tones_lst[0]), + sizeof(compo_inf.lst[0]), sizeof(compo_inf.arr[0]), + sizeof(name_inf.lst[0]), 1 }; + int n_lst[6], i; + void *p[6]; + + if((fp = fopen(path, "r")) == NULL){ + fprintf(stderr, "Can't open '%s'\n", path); + return; + } + for(i=0; i<6; i++){ + if((p[i] = load_n_data(&n_lst[i], sz_lst[i], fp)) == NULL){ + fprintf(stderr, "error load\n"); + fclose(fp); + return; + } + } + fclose(fp); + + i = 0; + if(tone_inf != tone_inf_default) free(tone_inf); + tone_inf = p[i]; + tone_inf_n = n_lst[i]; + i++; + + if(tones_lst != tones_lst_default) free(tones_lst); + tones_lst = p[i]; + tones_lst_n = n_lst[i]; + i++; + + if(compo_inf.lst) free(compo_inf.lst); + compo_inf.lst = p[i]; + compo_inf.n = n_lst[i]; + i++; + + if(compo_inf.arr) free(compo_inf.arr); + compo_inf.arr = p[i]; + compo_inf.arr_n = n_lst[i]; + i++; + + if(name_inf.lst) free(name_inf.lst); + name_inf.lst = p[i]; + name_inf.n = n_lst[i]; + i++; + + if(name_inf.area) free(name_inf.area); + name_inf.area = p[i]; + name_inf.area_sz = n_lst[i]; + + load_setup(); } /* EOF */ diff -urN midi_prog-/tone.h midi_prog/tone.h --- midi_prog-/tone.h Wed Apr 1 03:00:00 2015 +++ midi_prog/tone.h Thu Apr 2 00:00:00 2015 @@ -32,5 +32,6 @@ struct tone_compo_rec *tone_compo_get(int ch, int note, int *ret_n); double tone_out(struct stat_rec *stat, double freq, double env_v); void tone_save(char *path); +void tone_load(char *path); #endif