diff -urN midi_prog-/Makefile midi_prog/Makefile --- midi_prog-/Makefile Thu Apr 2 02:00:00 2015 +++ midi_prog/Makefile Fri Apr 3 00:00:00 2015 @@ -5,12 +5,15 @@ OBJS += cui_tone.o CFLAGS += -Wall -I.. -all: $(TARG) +all: $(TARG) txprm $(TARG): $(OBJS) $(CC) -o $@ $(OBJS) $(LIB) +txprm: txprm.c util.o + $(CC) -o $@ txprm.c util.o -lm + clean: - rm -f $(TARG) $(OBJS) *~ + rm -f $(TARG) $(OBJS) txprm *~ # EOF diff -urN midi_prog-/prmfmt.txt midi_prog/prmfmt.txt --- midi_prog-/prmfmt.txt Thu Jan 1 09:00:00 1970 +++ midi_prog/prmfmt.txt Fri Apr 3 00:00:00 2015 @@ -0,0 +1,52 @@ +int tone_inf_n + addr name + int wave1 + int wave2 + int tune + double mix + int ring + int alias_noise1 + int alias_noise2 + int fl_type1 + double freq1 + double Q1 + int fl_type2 + double freq2 + double Q2 + double attack + double decay + double sustain + double release + double level + int lfo_modu_pitch1 + int lfo_modu_pitch2 + int lfo_modu_filter1 + int lfo_modu_filter2 + int lfo_wave + double lfo_freq + double lfo_delay + int env_modu_pitch1 + int env_modu_pitch2 + int env_modu_filter1 + int env_modu_filter2 + int delay_onoff + double delay_sec + double delay_gain + int chorus +int tones_lst_n + int prog + int note + addr tone_compo +int compo_inf_n + addr tone_compo + int idx +int compo_arr_n + addr name + int note + double rate + addr tone +int name_info_n + addr name + int offset +int name_info_area_sz + str name_str diff -urN midi_prog-/txprm.c midi_prog/txprm.c --- midi_prog-/txprm.c Thu Jan 1 09:00:00 1970 +++ midi_prog/txprm.c Fri Apr 3 00:00:00 2015 @@ -0,0 +1,104 @@ +#include <fcntl.h> +#include <sys/mman.h> +#include "util.h" + +char *work(char *fmt, int idt, int idx, int *p_cnt); + +void +cnv(char *type, char *name, int *np, int idx, int *p_cnt) +{ + printf("%s %s_%d ", type, name, idx); + if(strcmp(type, "int") == 0){ + int v = 0; + fread(&v, sizeof(v), 1, stdin); + printf("%d\n", v); + *np = v; + }else if(strcmp(type, "double") == 0){ + double v = 0; + fread(&v, sizeof(v), 1, stdin); + printf("%lf\n", v); + }else if(strcmp(type, "addr") == 0){ + void *v = NULL; + fread(&v, sizeof(v), 1, stdin); + printf("%p\n", v); + }else if(strcmp(type, "str") == 0){ + int ch, len = 0; + putchar('"'); + while((ch = getchar()) != '\0'){ + putchar(ch); + len++; + } + putchar('"'); + putchar('\n'); + if(p_cnt) *p_cnt += len + 1; + }else{ + MSG(type); + MSG(name); + ERR("cnv"); + } +} + +char * +loop(char *fmt, int idt, int n) +{ + int i, cnt = 0; + char *next = fmt; + + for(i=0; i<n; i = cnt ? cnt : i+1) next = work(fmt, idt, i, &cnt); + return next; +} + +char * +work(char *fmt, int idt, int idx, int *p_cnt) +{ + char type[32], name[32]; + int i, n = 0; + + while(*fmt){ + for(i=0; fmt[i]==' '; i++); + if(i < idt) return fmt; + if(i > idt){ + fmt = loop(fmt, i, n); + continue; + } + sscanf(fmt+i, "%s %s\n", type, name); + + for(i=0; i<idt; i++) putchar(' '); + cnv(type, name, &n, idx, p_cnt); + + while(*fmt && *fmt!='\n') fmt++; + if(*fmt) fmt++; + } + + return fmt; +} + +int +main(int ac, char **av) +{ + char *fn = opt_str("-f", ac, av, "prmfmt.txt"); + int fd_fmt = open(fn, O_RDONLY); + struct stat sb; + size_t len; + char *fmt; + + if(fd_fmt == -1){ + MSG(fn); + ERR("open"); + } + if(fstat(fd_fmt, &sb) == -1){ + ERR("fstat"); + } + len = sb.st_size; + + fmt = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd_fmt, 0); + if(fmt == MAP_FAILED){ + ERR("mmap"); + } + + work(fmt, 0, 0, NULL); + + munmap(fmt, len); + close(fd_fmt); + return 0; +}