📄 sndfont.c
字号:
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 + -