⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sndfont.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 4 页
字号:
     utils/  libarc/  additional sources (for -f option)     filter.c  freq.c  resample.c  MACRO      CFG_FOR_SF *********************************************************************/#include "freq.h"#define CFG_FOR_SF_SUPPORT_FFT	1static FILE *x_out;static char x_sf_file_name[1024];static int x_pre_bank = -1;static int x_pre_preset = -1;static int x_sort = 1;static int x_comment = 1;#if CFG_FOR_SF_SUPPORT_FFTstatic int x_fft = 0;#endiftypedef struct x_cfg_info_t_ {	char m_bank[128][128];	char m_preset[128][128];	char m_rom[128][128];	char *m_str[128][128];	char d_preset[128][128];	char d_keynote[128][128];	char d_rom[128][128];	char *d_str[128][128];} x_cfg_info_t;static x_cfg_info_t x_cfg_info;static int x_cfg_info_init_flag = 0;static void x_cfg_info_init(void){	if(!x_cfg_info_init_flag){		int i,j;		for(i=0;i<128;i++){			for(j=0;j<128;j++){				x_cfg_info.m_bank[i][j] = -1;				x_cfg_info.m_preset[i][j] = -1;				x_cfg_info.m_rom[i][j] = -1;				x_cfg_info.m_str[i][j] = NULL;				x_cfg_info.d_preset[i][j] = -1;				x_cfg_info.d_keynote[i][j] = -1;				x_cfg_info.d_rom[i][j] = -1;				x_cfg_info.d_str[i][j] = NULL;			}		}	}	x_cfg_info_init_flag = 1;}static int cfg_for_sf_scan(char *x_name, int x_bank, int x_preset, int x_keynote_from, int x_keynote_to, int romflag){	int x_keynote;	x_cfg_info_init();	if(x_sort){		/*if(x_bank!=x_pre_bank || x_preset!=x_pre_preset){*/		{			char *str;			char buff[256];			if(x_bank==128){				for(x_keynote=x_keynote_from;x_keynote<=x_keynote_from;x_keynote++){					x_cfg_info.d_preset[x_preset][x_keynote] = x_preset;					x_cfg_info.d_keynote[x_preset][x_keynote] = x_keynote;					if(romflag && x_cfg_info.d_rom[x_preset][x_keynote])						x_cfg_info.d_rom[x_preset][x_keynote] = 1;					else						x_cfg_info.d_rom[x_preset][x_keynote] = 0;					str = x_cfg_info.d_str[x_preset][x_keynote];					str = (char *)safe_realloc(str,(str==NULL?0:strlen(str))+strlen(x_name)+30);					if(x_cfg_info.d_str[x_preset][x_keynote]==NULL){						str[0] = '\0';					}					sprintf(buff," %s",x_name);					strcat(str,buff);					x_cfg_info.d_str[x_preset][x_keynote] = str;				}			} else {				char *strROM;				str = x_cfg_info.m_str[x_bank][x_preset];				x_cfg_info.m_bank[x_bank][x_preset] = x_bank;				x_cfg_info.m_preset[x_bank][x_preset] = x_preset;				if(romflag)					strROM = " (ROM)";				else					strROM = "";				if(romflag && x_cfg_info.m_rom[x_bank][x_preset])					x_cfg_info.m_rom[x_bank][x_preset] = 1;				else					x_cfg_info.m_rom[x_bank][x_preset] = 0;				str = (char *)safe_realloc(str,(str==NULL?0:strlen(str))+strlen(x_name)+30);				if(x_cfg_info.m_str[x_bank][x_preset]==NULL){					str[0] = '\0';				}				if(x_comment){					if(x_keynote_from!=x_keynote_to)						sprintf(buff,"        # %d-%d:%s%s\n",x_keynote_from,x_keynote_to,x_name,strROM);					else						sprintf(buff,"        # %d:%s%s\n",x_keynote_from,x_name,strROM);					strcat(str,buff);				}				x_cfg_info.m_str[x_bank][x_preset] = str;			}		}	} else {		if(x_bank==128){			if(x_preset!=x_pre_preset)				fprintf(x_out,"drumset %d\n",x_preset);		} else {			if(x_bank!=x_pre_bank)				fprintf(x_out,"bank %d\n",x_bank);		}		if(romflag){			if(x_bank==128){				for(x_keynote=x_keynote_from;x_keynote<=x_keynote_from;x_keynote++){					if(x_comment)						fprintf(x_out,"#  %d %%font %s %d %d %d # %s (ROM)\n",x_keynote,x_sf_file_name,x_bank,x_preset,x_keynote,x_name);					else						fprintf(x_out,"#  %d %%font %s %d %d %d # (ROM)\n",x_keynote,x_sf_file_name,x_bank,x_preset,x_keynote);				}			} else {				if(x_keynote_from==x_keynote_to) {					if(x_comment)						fprintf(x_out,"#   %d %%font %s %d %d # %d:%s (ROM)\n",x_preset,x_sf_file_name,x_bank,x_preset,x_keynote_from,x_name);					else						fprintf(x_out,"#   %d %%font %s %d %d # (ROM)\n",x_preset,x_sf_file_name,x_bank,x_preset);				} else {					if(x_comment)						fprintf(x_out,"#   %d %%font %s %d %d # %d-%d:%s (ROM)\n",x_preset,x_sf_file_name,x_bank,x_preset,x_keynote_from,x_keynote_to,x_name);					else						fprintf(x_out,"#   %d %%font %s %d %d # (ROM)\n",x_preset,x_sf_file_name,x_bank,x_preset);				}			}		} else {			if(x_bank==128){				for(x_keynote=x_keynote_from;x_keynote<=x_keynote_from;x_keynote++){					if(x_comment)						fprintf(x_out,"    %d %%font %s %d %d %d # %s\n",x_keynote,x_sf_file_name,x_bank,x_preset,x_keynote,x_name);					else						fprintf(x_out,"    %d %%font %s %d %d %d\n",x_keynote,x_sf_file_name,x_bank,x_preset,x_keynote);				}			} else {				if(x_keynote_from==x_keynote_to){					if(x_comment)						fprintf(x_out,"    %d %%font %s %d %d # %d:%s\n",x_preset,x_sf_file_name,x_bank,x_preset,x_keynote_from,x_name);					else						fprintf(x_out,"    %d %%font %s %d %d\n",x_preset,x_sf_file_name,x_bank,x_preset);				} else {					if(x_comment)						fprintf(x_out,"    %d %%font %s %d %d # %d-%d:%s\n",x_preset,x_sf_file_name,x_bank,x_preset,x_keynote_from,x_keynote_to,x_name);					else						fprintf(x_out,"    %d %%font %s %d %d\n",x_preset,x_sf_file_name,x_bank,x_preset);				}			}		}	}	x_pre_bank = x_bank;	x_pre_preset = x_preset;	return 0;}PlayMode dpm = {    DEFAULT_RATE, PE_16BIT|PE_SIGNED, PF_PCM_STREAM,    -1,    {0,0,0,0,0},    "null", 'n',    NULL,		NULL,		NULL,		NULL,		NULL};PlayMode *play_mode = &dpm;#if !CFG_FOR_SF_SUPPORT_FFTint32 freq_table[1];FLOAT_T bend_fine[1];FLOAT_T bend_coarse[1];void pre_resample(Sample *sp) {}void antialiasing(int16 *data, int32 data_length,int32 sample_rate, int32 output_rate) {}#endifchar *wrdt = NULL; /* :-P */#ifdef WIN32static int ctl_open(int using_stdin, int using_stdout) { return 0;}static void ctl_close(void) {}static int ctl_read(int32 *valp) { return 0; } #include <stdarg.h>static int cmsg(int type, int verbosity_level, char *fmt, ...){  va_list ap;  if ((type==CMSG_TEXT || type==CMSG_INFO || type==CMSG_WARNING) &&      ctl->verbosity<verbosity_level)    return 0;  va_start(ap, fmt);  vfprintf(stderr, fmt, ap);  fputs(NLS, stderr);  va_end(ap);  return 0;}static void ctl_event(CtlEvent *e) {}ControlMode w32gui_control_mode ={	"w32gui interface", 'd',    1,0,0,    0,    ctl_open,    ctl_close,    dumb_pass_playing_list,    ctl_read,    cmsg,    ctl_event};#endifextern struct URL_module URL_module_file;#ifndef __MACOS__extern struct URL_module URL_module_dir;#endif /* __MACOS__ */#ifdef SUPPORT_SOCKETextern struct URL_module URL_module_http;extern struct URL_module URL_module_ftp;extern struct URL_module URL_module_news;extern struct URL_module URL_module_newsgroup;#endif /* SUPPORT_SOCKET */#ifdef HAVE_POPENextern struct URL_module URL_module_pipe;#endif /* HAVE_POPEN */static struct URL_module *url_module_list[] ={    &URL_module_file,#ifndef __MACOS__    &URL_module_dir,#endif /* __MACOS__ */#ifdef SUPPORT_SOCKET    &URL_module_http,    &URL_module_ftp,    &URL_module_news,    &URL_module_newsgroup,#endif /* SUPPORT_SOCKET */#if !defined(__MACOS__) && defined(HAVE_POPEN)    &URL_module_pipe,#endif#if defined(main) || defined(ANOTHER_MAIN)    /* You can put some other modules */    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,#endif /* main */    NULL};static void cfgforsf_usage(const char *program_name, int status){	printf("USAGE: %s [options] soundfont [cfg_output]\n""  Options:\n""    -s: sort by bank/program. (default)\n""    -S or -s-: do not sort by bank/program.\n""    -c: output comment. (default)\n""    -C or -c-: do not output comment.\n"#if CFG_FOR_SF_SUPPORT_FFT"    -f drumset note: calculate sample frequency.\n""    -F drumset note: do not calculate sample frequency. (default = -F - -)\n"#endif		, program_name );	exit(status);}#if CFG_FOR_SF_SUPPORT_FFT#define SET_PROG_MAP(map, bank, prog)		((map)[(bank << (7 - 3)) | (prog >> 3)] |= (1 << (prog & 7)))#define UNSET_PROG_MAP(map, bank, prog)		((map)[(bank << (7 - 3)) | (prog >> 3)] &= ~(1 << (prog & 7)))#define IS_SET_PROG_MAP(map, bank, prog)	((map)[(bank << (7 - 3)) | (prog >> 3)] & (1 << (prog & 7)))#endif#if CFG_FOR_SF_SUPPORT_FFTint check_apply_control(void) { return 0; } // not passvoid dumb_pass_playing_list(int number_of_files, char *list_of_files[]) {}void recompute_freq(int v) {} // not passint32 control_ratio = 0;int reduce_quality_flag = 0;Voice *voice = NULL;Channel channel[MAX_CHANNELS];// from playmidi.cint32 get_note_freq(Sample *sp, int note){	int32 f;	int16 sf, sn;	double ratio;		f = freq_table[note];	/* GUS/SF2 - Scale Tuning */	if ((sf = sp->scale_factor) != 1024) {		sn = sp->scale_freq;		ratio = pow(2.0, (note - sn) * (sf - 1024) / 12288.0);		f = f * ratio + 0.5;	}	return f;}#endifint main(int argc, char **argv){    SFInsts *sf;	int i, x_bank, x_preset, x_keynote;	int initial = 0;	#if CFG_FOR_SF_SUPPORT_FFT	uint8 fft_range[128 * 128 / 8];	int8 x_playnote[128 + 1];	char playnote_str[272], *p;	/* ,0,1,3,4,6,7,9,10,...,126,127 */	#endif	const char *program_name;	argc--, program_name = *argv++;	#if CFG_FOR_SF_SUPPORT_FFT	memset(fft_range, 0, sizeof fft_range);	#endif	while(argc > 0 && argv[0][0] == '-' && isalpha(argv[0][1])) {		int opt_switch = 1;		if(argv[0][2] == '\0')			opt_switch = 1;		else if(argv[0][2] == '-' && argv[0][3] == '\0')			opt_switch = 0;		else			break;		switch(argv[0][1]) {			case 's':				x_sort = 1; if(!opt_switch) x_sort = 0; break;			case 'S':				x_sort = 0; break;			case 'c':				x_comment = 1; if(!opt_switch) x_comment = 0; break;			case 'C':				x_comment = 0; break;			#if CFG_FOR_SF_SUPPORT_FFT			case 'f': case 'F':				if(argc < 3)					cfgforsf_usage(program_name, EXIT_FAILURE);				else {					const char *mask_string;					int8 mask[128];					int flag, start, end;										flag = argv[0][1] == 'f';					memset(mask, 0, sizeof mask);					mask_string = argv[2];					do {						if(string_to_7bit_range(mask_string, &start, &end)) {							for(i = start; i <= end; i++)								mask[i] = 1;						}						mask_string = strchr(mask_string, ',');					} while(mask_string++ != NULL);					mask_string = argv[1];					do {						if(string_to_7bit_range(mask_string, &start, &end)) {							x_fft = 1;							while(start <= end) {								for(i = 0; i < 128; i++) {									if (!mask[i])										continue;									if(flag)										SET_PROG_MAP(fft_range, start, i);									else										UNSET_PROG_MAP(fft_range, start, i);								}								start++;							}						}						mask_string = strchr(mask_string, ',');					} while(mask_string++ != NULL);					argc -= 2, argv += 2;				}				break;			#endif			default:				fprintf(stderr, "Error: Invalid option %s.\n", argv[0]);				cfgforsf_usage(program_name, EXIT_FAILURE);		}		argc--, argv++;	}	if(argc <= 0 || argc > 2)		cfgforsf_usage(program_name, EXIT_SUCCESS);	x_out = (argc < 2) ? stdout : fopen(argv[1], "w");	if (x_out == NULL) {		fprintf(stderr, "Error: Unable to open %s.\n", argv[1]);		exit(EXIT_FAILURE);	}	#if CFG_FOR_SF_SUPPORT_FFT	if (!x_sort && x_fft) {		fprintf(stderr, "Error: -f option should be used with -s option.\n");		exit(EXIT_FAILURE);	}	memset(x_playnote, -1, sizeof x_playnote);	#endif	ctl->verbosity = -1;#ifdef SUPPORT_SOCKET	/*init_mail_addr();*/	if(url_user_agent == NULL){	    url_user_agent = (char *)safe_malloc(10 + strlen(timidity_version));	    strcpy(url_user_agent, "TiMidity-");	    strcat(url_user_agent, timidity_version);	}#endif /* SUPPORT_SOCKET */	for(i = 0; url_module_list[i]; i++)	    url_add_module(url_module_list[i]);	init_freq_table();	init_bend_fine();	init_bend_coarse();	initialize_resampler_coeffs();	control_ratio = play_mode->rate / CONTROLS_PER_SECOND;	strncpy(x_sf_file_name, argv[0], 1024);    sf = new_soundfont(x_sf_file_name);    sf->next = NULL;    sf->def_order = 2;    sfrecs = sf;	x_cfg_info_init();	init_sf(sf);	if(strchr(x_sf_file_name, ' ') != NULL) {		char quote = strchr(x_sf_file_name, '"') == NULL ? '"' : '\'';		sprintf(x_sf_file_name, "%c%s%c", quote, argv[0], quote);	}	if(x_sort){	for(x_bank=0;x_bank<=127;x_bank++){		int flag = 0;		for(x_preset=0;x_preset<=127;x_preset++){			if(x_cfg_info.m_bank[x_bank][x_preset] >= 0 && x_cfg_info.m_preset[x_bank][x_preset] >= 0){				flag = 1;			}		}		if(!flag)			continue;		if(!initial){			initial = 1;			fprintf(x_out,"bank %d\n",x_bank);		} else			fprintf(x_out,"\nbank %d\n",x_bank);		for(x_preset=0;x_preset<=127;x_preset++){			if(x_cfg_info.m_bank[x_bank][x_preset] >= 0 && x_cfg_info.m_preset[x_bank][x_preset] >= 0){				if(x_cfg_info.m_rom[x_bank][x_preset])					fprintf(x_out,"#   %d %%font %s %d %d # (ROM)\n%s",x_preset,x_sf_file_name,x_cfg_info.m_bank[x_bank][x_preset],x_cfg_info.m_preset[x_bank][x_preset],x_cfg_info.m_str[x_bank][x_preset]);				else					fprintf(x_out,"    %d %%font %s %d %d\n%s",x_preset,x_sf_file_name,x_cfg_info.m_bank[x_bank][x_preset],x_cfg_info.m_preset[x_bank][x_preset],x_cfg_info.m_str[x_bank][x_preset]);			}		}	}	for(x_preset=0;x_preset<=127;x_preset++){		int flag = 0, start;		for(x_keynote=0;x_keynote<=127;x_keynote++){			if(x_cfg_info.d_preset[x_preset][x_keynote] >= 0 && x_cfg_info.d_keynote[x_preset][x_keynote] >= 0){				flag = 1;			}		}		if(!flag)			continue;		if(!initial){			initial = 1;			fprintf(x_out,"drumset %d\n",x_preset);		} else			fprintf(x_out,"\ndrumset %d\n",x_preset);		for(x_keynote=0;x_keynote<=127;x_keynote++){			if(x_cfg_info.d_preset[x_preset][x_keynote] >= 0 && x_cfg_info.d_keynote[x_preset][x_keynote] >= 0){				if(x_cfg_info.d_rom[x_preset][x_keynote]){					if(x_comment)						fprintf(x_out,"#   %d %%font %s 128 %d %d #%s (ROM)\n",x_keynote,x_sf_file_name,x_cfg_info.d_preset[x_preset][x_keynote],x_cfg_info.d_keynote[x_preset][x_keynote],x_cfg_info.d_str[x_preset][x_keynote]);					else						fprintf(x_out,"#   %d %%font %s 128 %d %d # (ROM)\n",x_keynote,x_sf_file_name,x_cfg_info.d_preset[x_preset][x_keynote],x_cfg_info.d_keynote[x_preset][x_keynote]);				} else {					if(x_comment)						fprintf(x_out,"    %d %%font %s 128 %d %d #%s\n",x_keynote,x_sf_file_name,x_cfg_info.d_preset[x_preset][x_keynote],x_cfg_info.d_keynote[x_preset][x_keynote],x_cfg_info.d_str[x_preset][x_keynote]);					else						fprintf(x_out,"    %d %%font %s 128 %d %d\n",x_keynote,x_sf_file_name,x_cfg_info.d_preset[x_preset][x_keynote],x_cfg_info.d_keynote[x_preset][x_keynote]);					#if CFG_FOR_SF_SUPPORT_FFT					if(IS_SET_PROG_MAP(fft_range, x_preset, x_keynote)) {						Instrument *inst;						float freq;						int chord, note;												inst = try_load_soundfont(sf, -1, 128, x_preset, x_keynote);						if(inst != NULL) {							freq = freq_fourier(inst->sample, &chord);							if (freq != 260) { /* 260 Hz is only returned when pitch is uncertain */								x_playnote[x_keynote] = assign_pitch_to_freq(freq);							}							free_instrument(inst);						}					}					#endif				}			}		}		#if CFG_FOR_SF_SUPPORT_FFT		for(x_keynote = 0; x_keynote <= 127;) {			if (x_playnote[x_keynote] == -1) {				x_keynote++;				continue;			}			p = playnote_str;			flag = x_playnote[x_keynote];			do {				start = x_keynote;				while (x_playnote[x_keynote] = -1, ++x_keynote <= 127) {					if (x_playnote[x_keynote] != flag)						break;				}				if (x_keynote - start == 1)					p += sprintf(p, ",%d", start);				else					p += sprintf(p, ",%d%c%d", start, (x_keynote - start > 2) ? '-' : ',', x_keynote - 1);				while (x_keynote <= 127 && x_playnote[x_keynote] == -1)					x_keynote++;			} while(x_keynote <= 127 && x_playnote[x_keynote] == flag);			fprintf(x_out, "#extension playnote %s %d\n", &playnote_str[1], flag);		}		#endif	}	}	if(x_out!=stdout)		fclose(x_out);	return 0;}#endif /* CFG_FOR_SF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -