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

📄 sndfont.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 4 页
字号:
	   (keynote < 0 || keynote == ip->pat.keynote))	    break;    }    if(ip == NULL)    {	ip = (InstList*)SFMalloc(current_sfrec, sizeof(InstList));	memset(ip, 0, sizeof(InstList));	ip->pr_idx = pridx;	ip->pat.bank = bank;	ip->pat.preset = preset;	ip->pat.keynote = keynote;	ip->order = order;	ip->samples = 0;	ip->slist = NULL;	ip->next = current_sfrec->instlist[addr];	current_sfrec->instlist[addr] = ip;    }    /* new sample */    sp = (SampleList *)SFMalloc(current_sfrec, sizeof(SampleList));    memset(sp, 0, sizeof(SampleList));	sp->bank = bank;	sp->keynote = keynote;	if(tbl->set[SF_keynum]) {		sp->v.note_to_use = (int)tbl->val[SF_keynum];	} else if(bank == 128) {		sp->v.note_to_use = keynote;	}    make_info(sf, sp, tbl);    /* add a sample */    if(ip->slist == NULL)	ip->slist = sp;    else    {	SampleList *cur, *prev;	int32 start;	/* Insert sample */	start = sp->start;	cur = ip->slist;	prev = NULL;	while(cur && cur->start <= start)	{	    prev = cur;	    cur = cur->next;	}	if(prev == NULL)	{	    sp->next = ip->slist;	    ip->slist = sp;	}	else	{	    prev->next = sp;	    sp->next = cur;	}    }    ip->samples++;	} /* for(;;) */	if(done==0)	return AWE_RET_SKIP;	else	return AWE_RET_OK;}/*---------------------------------------------------------------- * * Modified for TiMidity *//* conver to Sample parameter */static void make_info(SFInfo *sf, SampleList *vp, LayerTable *tbl){	set_sample_info(sf, vp, tbl);	set_init_info(sf, vp, tbl);	set_rootkey(sf, vp, tbl);	set_rootfreq(vp);	/* tremolo & vibrato */#ifndef SF_SUPPRESS_TREMOLO	convert_tremolo(vp, tbl);#endif /* SF_SUPPRESS_TREMOLO */#ifndef SF_SUPPRESS_VIBRATO	convert_vibrato(vp, tbl);#endif /* SF_SUPPRESS_VIBRATO */}static void set_envelope_parameters(SampleList *vp){		/* convert envelope parameters */		vp->v.envelope_offset[0] = to_offset(65535);		vp->v.envelope_rate[0] = vp->attack;		vp->v.envelope_offset[1] = to_offset(65534);		vp->v.envelope_rate[1] = vp->hold;		vp->v.envelope_offset[2] = to_offset(vp->sustain);		vp->v.envelope_rate[2] = vp->decay;		vp->v.envelope_offset[3] = 0;		vp->v.envelope_rate[3] = vp->release;		vp->v.envelope_offset[4] = 0;		vp->v.envelope_rate[4] = vp->release;		vp->v.envelope_offset[5] = 0;		vp->v.envelope_rate[5] = vp->release;		/* convert modulation envelope parameters */		vp->v.modenv_offset[0] = to_offset(65535);		vp->v.modenv_rate[0] = vp->modattack;		vp->v.modenv_offset[1] = to_offset(65534);		vp->v.modenv_rate[1] = vp->modhold;		vp->v.modenv_offset[2] = to_offset(vp->modsustain);		vp->v.modenv_rate[2] = vp->moddecay;		vp->v.modenv_offset[3] = 0;		vp->v.modenv_rate[3] = vp->modrelease;		vp->v.modenv_offset[4] = 0;		vp->v.modenv_rate[4] = vp->modrelease;		vp->v.modenv_offset[5] = 0;		vp->v.modenv_rate[5] = vp->modrelease;}/* set sample address */static void set_sample_info(SFInfo *sf, SampleList *vp, LayerTable *tbl){    SFSampleInfo *sp = &sf->sample[tbl->val[SF_sampleId]];    /* set sample position */    vp->start = (tbl->val[SF_startAddrsHi] << 15)	+ tbl->val[SF_startAddrs]	+ sp->startsample;    vp->len = (tbl->val[SF_endAddrsHi] << 15)	+ tbl->val[SF_endAddrs]	+ sp->endsample - vp->start;	vp->start = abs(vp->start);	vp->len = abs(vp->len);    /* set loop position */    vp->v.loop_start = (tbl->val[SF_startloopAddrsHi] << 15)	+ tbl->val[SF_startloopAddrs]	+ sp->startloop - vp->start;    vp->v.loop_end = (tbl->val[SF_endloopAddrsHi] << 15)	+ tbl->val[SF_endloopAddrs]	+ sp->endloop - vp->start;    /* set data length */    vp->v.data_length = vp->len + 1;    if (vp->v.loop_end > vp->len + 1)	vp->v.loop_end = vp->len + 1;	if (vp->v.loop_start > vp->len)	vp->v.loop_start = vp->len;    /* Sample rate */	if(sp->samplerate > 50000) {sp->samplerate = 50000;}	else if(sp->samplerate < 400) {sp->samplerate = 400;}    vp->v.sample_rate = sp->samplerate;    /* sample mode */    vp->v.modes = MODES_16BIT;    /* volume envelope & total volume */    vp->v.volume = calc_volume(tbl) * current_sfrec->amptune;#ifndef SF_SUPPRESS_ENVELOPE	convert_volume_envelope(vp, tbl);#endif /* SF_SUPPRESS_ENVELOPE */	set_envelope_parameters(vp);    if(tbl->val[SF_sampleFlags] == 1 || tbl->val[SF_sampleFlags] == 3)    {		/* looping */		vp->v.modes |= MODES_LOOPING | MODES_SUSTAIN;		if(tbl->val[SF_sampleFlags] == 3)			vp->v.data_length = vp->v.loop_end; /* strip the tail */	}    else    {		/* set a small blank loop at the tail for avoiding abnormal loop. */		vp->v.loop_start = vp->len;		vp->v.loop_end = vp->len + 1;    }    /* convert to fractional samples */    vp->v.data_length <<= FRACTION_BITS;    vp->v.loop_start <<= FRACTION_BITS;    vp->v.loop_end <<= FRACTION_BITS;    /* point to the file position */    vp->start = vp->start * 2 + sf->samplepos;    vp->len *= 2;	vp->v.vel_to_fc = -2400;	/* SF2 default value */	vp->v.key_to_fc = vp->v.vel_to_resonance = 0;	vp->v.envelope_velf_bpo = vp->v.modenv_velf_bpo =		vp->v.vel_to_fc_threshold = 64;	vp->v.key_to_fc_bpo = 60;	memset(vp->v.envelope_velf, 0, sizeof(vp->v.envelope_velf));	memset(vp->v.modenv_velf, 0, sizeof(vp->v.modenv_velf));	vp->v.inst_type = INST_SF2;}/*----------------------------------------------------------------*//* set global information */static void set_init_info(SFInfo *sf, SampleList *vp, LayerTable *tbl){    int val;    SFSampleInfo *sample;    sample = &sf->sample[tbl->val[SF_sampleId]];    /* key range */    if(tbl->set[SF_keyRange])    {	vp->low = LOWNUM(tbl->val[SF_keyRange]);	vp->high = HIGHNUM(tbl->val[SF_keyRange]);    }    else    {	vp->low = 0;	vp->high = 127;    }    vp->v.low_freq = freq_table[(int)vp->low];    vp->v.high_freq = freq_table[(int)vp->high];    /* velocity range */    if(tbl->set[SF_velRange]) {		vp->v.low_vel = LOWNUM(tbl->val[SF_velRange]);		vp->v.high_vel = HIGHNUM(tbl->val[SF_velRange]);    } else {		vp->v.low_vel = 0;		vp->v.high_vel = 127;	}    /* fixed key & velocity */    if(tbl->set[SF_keynum])		vp->v.note_to_use = (int)tbl->val[SF_keynum];	if(tbl->set[SF_velocity] && (int)tbl->val[SF_velocity] != 0) {		ctl->cmsg(CMSG_INFO,VERB_DEBUG,"error: fixed-velocity is not supported.");	}	vp->v.sample_type = sample->sampletype;	vp->v.sf_sample_index = tbl->val[SF_sampleId];	if (sample->sampletype == SF_SAMPLETYPE_MONO) {		vp->v.sf_sample_link = -1;	} else {		vp->v.sf_sample_link = sample->samplelink;	}	/* panning position: 0 to 127 */	val = (int)tbl->val[SF_panEffectsSend];    if(sample->sampletype == SF_SAMPLETYPE_MONO || val != 0) {	/* monoSample = 1 */		if(val < -500)		vp->v.panning = 0;		else if(val > 500)		vp->v.panning = 127;		else		vp->v.panning = (int8)((val + 500) * 127 / 1000);	} else if(sample->sampletype == SF_SAMPLETYPE_RIGHT) {	/* rightSample = 2 */		vp->v.panning = 127;	} else if(sample->sampletype == SF_SAMPLETYPE_LEFT) {	/* leftSample = 4 */		vp->v.panning = 0;	} else if(sample->sampletype == SF_SAMPLETYPE_LINKED) {	/* linkedSample = 8 */		ctl->cmsg(CMSG_ERROR,VERB_NOISY,"error: linkedSample is not supported.");	}	memset(vp->v.envelope_keyf, 0, sizeof(vp->v.envelope_keyf));	memset(vp->v.modenv_keyf, 0, sizeof(vp->v.modenv_keyf));	if(tbl->set[SF_autoHoldEnv2]) {		vp->v.envelope_keyf[1] = (int16)tbl->val[SF_autoHoldEnv2];	}	if(tbl->set[SF_autoDecayEnv2]) {		vp->v.envelope_keyf[2] = (int16)tbl->val[SF_autoDecayEnv2];	}	if(tbl->set[SF_autoHoldEnv1]) {		vp->v.modenv_keyf[1] = (int16)tbl->val[SF_autoHoldEnv1];	}	if(tbl->set[SF_autoDecayEnv1]) {		vp->v.modenv_keyf[2] = (int16)tbl->val[SF_autoDecayEnv1];	}#ifndef CFG_FOR_SF	current_sfrec->def_cutoff_allowed = 1;	current_sfrec->def_resonance_allowed = 1;#endif    /* initial cutoff & resonance */    vp->cutoff_freq = 0;    if((int)tbl->val[SF_initialFilterFc] < 0)	tbl->set[SF_initialFilterFc] = tbl->val[SF_initialFilterFc] = 0;    if(current_sfrec->def_cutoff_allowed && tbl->set[SF_initialFilterFc]		&& (int)tbl->val[SF_initialFilterFc] >= 1500 && (int)tbl->val[SF_initialFilterFc] <= 13500)    {    val = (int)tbl->val[SF_initialFilterFc];	val = abscent_to_Hz(val);#ifndef CFG_FOR_SF	if(!opt_modulation_envelope) {		if(tbl->set[SF_env1ToFilterFc] && (int)tbl->val[SF_env1ToFilterFc] > 0)		{			val *= pow(2.0,(double)tbl->val[SF_env1ToFilterFc] / 1200.0f);			if(val > 20000) {val = 20000;}		}	}#endif	vp->cutoff_freq = val;    }	vp->v.cutoff_freq = vp->cutoff_freq;	vp->resonance = 0;    if(current_sfrec->def_resonance_allowed && tbl->set[SF_initialFilterQ])    {	val = (int)tbl->val[SF_initialFilterQ];	vp->resonance = val;	}	vp->v.resonance = vp->resonance;#if 0 /* Not supported */    /* exclusive class key */    vp->exclusiveClass = tbl->val[SF_keyExclusiveClass];#endif}static int abscent_to_Hz(int abscents){	return (int)(8.176 * pow(2.0, (double)abscents / 1200.0));}/*----------------------------------------------------------------*/#define SF_MODENV_CENT_MAX 1200	/* Live! allows only +-1200cents. *//* calculate root key & fine tune */static void set_rootkey(SFInfo *sf, SampleList *vp, LayerTable *tbl){	SFSampleInfo *sp = &sf->sample[tbl->val[SF_sampleId]];	int temp;		/* scale factor */	vp->v.scale_factor = 1024 * (double) tbl->val[SF_scaleTuning] / 100 + 0.5;	/* set initial root key & fine tune */	if (sf->version == 1 && tbl->set[SF_samplePitch]) {		/* set from sample pitch */		vp->root = tbl->val[SF_samplePitch] / 100;		vp->tune = -tbl->val[SF_samplePitch] % 100;		if (vp->tune <= -50)			vp->root++, vp->tune += 100;	} else {		/* from sample info */		vp->root = sp->originalPitch;		vp->tune = (int8) sp->pitchCorrection;	}	/* orverride root key */	if (tbl->set[SF_rootKey])		vp->root = tbl->val[SF_rootKey];	else if (vp->bank == 128 && vp->v.scale_factor != 0)		vp->tune += (vp->keynote - sp->originalPitch)				* 100 * (double) vp->v.scale_factor / 1024;	vp->tune += tbl->val[SF_coarseTune] * 100 + tbl->val[SF_fineTune];	/* correct too high pitch */	if (vp->root >= vp->high + 60)		vp->root -= 60;	vp->v.tremolo_to_pitch =			(tbl->set[SF_lfo1ToPitch]) ? tbl->val[SF_lfo1ToPitch] : 0;	vp->v.tremolo_to_fc =			(tbl->set[SF_lfo1ToFilterFc]) ? tbl->val[SF_lfo1ToFilterFc] : 0;	vp->v.modenv_to_pitch =			(tbl->set[SF_env1ToPitch]) ? tbl->val[SF_env1ToPitch] : 0;	/* correct tune with the sustain level of modulation envelope */	temp = vp->v.modenv_to_pitch			* (double) (1000 - tbl->val[SF_sustainEnv1]) / 1000 + 0.5;	vp->tune += temp, vp->v.modenv_to_pitch -= temp;	vp->v.modenv_to_fc =			(tbl->set[SF_env1ToFilterFc]) ? tbl->val[SF_env1ToFilterFc] : 0;}static void set_rootfreq(SampleList *vp){	int root = vp->root;	int tune = 0.5 - 256 * (double) vp->tune / 100;		/* 0 <= tune < 255 */	while (tune < 0)		root--, tune += 256;	while (tune > 255)		root++, tune -= 256;	if (root < 0) {		vp->v.root_freq = freq_table[0] * (double) bend_fine[tune]				/ bend_coarse[-root] + 0.5;		vp->v.scale_freq = 0;		/* scale freq */	} else if (root > 127) {		vp->v.root_freq = freq_table[127] * (double) bend_fine[tune]				* bend_coarse[root - 127] + 0.5;		vp->v.scale_freq = 127;		/* scale freq */	} else {		vp->v.root_freq = freq_table[root] * (double) bend_fine[tune] + 0.5;		vp->v.scale_freq = root;	/* scale freq */	}}/*----------------------------------------------------------------*//*Pseudo Reverb*/extern int32 modify_release;/* volume envelope parameters */static void convert_volume_envelope(SampleList *vp, LayerTable *tbl){    vp->attack  = to_rate(65535, tbl->val[SF_attackEnv2]);    vp->hold    = to_rate(1, tbl->val[SF_holdEnv2]);    vp->sustain = calc_sustain(tbl->val[SF_sustainEnv2]);    vp->decay   = to_rate(65533 - vp->sustain, tbl->val[SF_decayEnv2]);    if(modify_release) /* Pseudo Reverb */	vp->release = calc_rate(65535, modify_release);    else	vp->release = to_rate(65535, tbl->val[SF_releaseEnv2]);	vp->v.envelope_delay = play_mode->rate * 		to_msec(tbl->val[SF_delayEnv2]) * 0.001;	/* convert modulation envelope */    vp->modattack  = to_rate(65535, tbl->val[SF_attackEnv1]);    vp->modhold    = to_rate(1, tbl->val[SF_holdEnv1]);    vp->modsustain = calc_sustain(tbl->val[SF_sustainEnv1]);    vp->moddecay   = to_rate(65533 - vp->modsustain, tbl->val[SF_decayEnv1]);    if(modify_release) /* Pseudo Reverb */	vp->modrelease = calc_rate(65535, modify_release);    else	vp->modrelease = to_rate(65535, tbl->val[SF_releaseEnv1]);	vp->v.modenv_delay = play_mode->rate * 		to_msec(tbl->val[SF_delayEnv1]) * 0.001;    vp->v.modes |= MODES_ENVELOPE;}#ifndef SF_SUPPRESS_TREMOLO/*---------------------------------------------------------------- * tremolo (LFO1) conversion *----------------------------------------------------------------*/static void convert_tremolo(SampleList *vp, LayerTable *tbl){    int32 freq;	double level;    if(!tbl->set[SF_lfo1ToVolume])	return;    level = pow(10.0, (double)abs(tbl->val[SF_lfo1ToVolume]) / -200.0);    vp->v.tremolo_depth = 256 * (1.0 - level);	if((int)tbl->val[SF_lfo1ToVolume] < 0) {vp->v.tremolo_depth = -vp->v.tremolo_depth;}    /* frequency in mHz */    if(!tbl->set[SF_freqLfo1])	freq = 0;    else    {	freq = (int)tbl->val[SF_freqLfo1];	freq = TO_MHZ(freq);    }    /* convert mHz to sine table increment; 1024<<rate_shift=1wave */    vp->v.tremolo_phase_increment = ((play_mode->rate / 1000 * freq) >> RATE_SHIFT) / control_ratio;    vp->v.tremolo_delay = play_mode->rate * 		to_msec(tbl->val[SF_delayLfo1]) * 0.001;}#endif#ifndef SF_SUPPRESS_VIBRATO/*---------------------------------------------------------------- * vibrato (LFO2) conversion *----------------------------------------------------------------*/static void convert_vibrato(SampleList *vp, LayerTable *tbl){    int32 shift, freq;    if(!tbl->set[SF_lfo2ToPitch]) {		vp->v.vibrato_control_ratio = 0;		return;	}    shift = (int)tbl->val[SF_lfo2ToPitch];    /* cents to linear; 400cents = 256 */    shift = shift * 256 / 400;	if(shift > 255) {shift = 255;}    else if(shift < -255) {shift = -255;}    vp->v.vibrato_depth = (int16)shift;    /* frequency in mHz */    if(!tbl->set[SF_freqLfo2])	freq = 0;    else    {	freq = (int)tbl->val[SF_freqLfo2];	freq = TO_MHZ(freq);	if(freq == 0) {freq = 1;}	/* convert mHz to control ratio */	vp->v.vibrato_control_ratio = (1000 * play_mode->rate) /			(freq * 2 * VIBRATO_SAMPLE_INCREMENTS);    }    vp->v.vibrato_delay = play_mode->rate * 		to_msec(tbl->val[SF_delayLfo2]) * 0.001;}#endif#ifdef CFG_FOR_SF/*********************************************************************    cfg for soundfont utility.  demanded sources.     common.c  controls.c  dumb_c.c  instrum.c  sbkconv.c  sffile.c     sfitem.c  sndfont.c  tables.c  version.c		 mt19937ar.c quantity.c smplfile.c

⌨️ 快捷键说明

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