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

📄 mix.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 4 页
字号:
			MIXATION(left);			DELAYED_MIXATION(right);			if (vp->left_mix_offset) {				vp->left_mix_offset += vp->left_mix_inc;				linear_left += vp->left_mix_inc;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			if (vp->right_mix_offset) {				vp->right_mix_offset += vp->right_mix_inc;				linear_right += vp->right_mix_inc;				if (linear_right > MAX_AMP_VALUE) {					linear_right = MAX_AMP_VALUE;					vp->right_mix_offset = 0;				}				right = FINAL_VOLUME(linear_right);			}		}	} else {		for (i = 0; (vp->left_mix_offset | vp->right_mix_offset)				&& i < count; i++) {			s = *sp++;			DELAYED_MIXATION(left);			MIXATION(right);			if (vp->left_mix_offset) {				vp->left_mix_offset += vp->left_mix_inc;				linear_left += vp->left_mix_inc;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			if (vp->right_mix_offset) {				vp->right_mix_offset += vp->right_mix_inc;				linear_right += vp->right_mix_inc;				if (linear_right > MAX_AMP_VALUE) {					linear_right = MAX_AMP_VALUE;					vp->right_mix_offset = 0;				}				right = FINAL_VOLUME(linear_right);			}		}	}	vp->old_left_mix = linear_left;	vp->old_right_mix = linear_right;	count -= i;#endif	if(vp->pan_delay_rpt == 0) {		for (i = 0; i < count; i++) {			s = *sp++;			MIXATION(left);			MIXATION(right);		}	} else if(vp->panning < 64) {		for (i = 0; i < count; i++) {			s = *sp++;			MIXATION(left);			DELAYED_MIXATION(right);		}	} else {		for (i = 0; i < count; i++) {			s = *sp++;			DELAYED_MIXATION(left);			MIXATION(right);		}	}	vp->pan_delay_wpt = pan_delay_wpt;	vp->pan_delay_spt = pan_delay_spt;}#else	/* ENABLE_PAN_DELAY */static inline void mix_mystery(mix_t *sp, int32 *lp, int v, int count){	final_volume_t left = voice[v].left_mix, right = voice[v].right_mix;	mix_t s;	int i;#ifdef SMOOTH_MIXING	Voice *vp = voice + v;	int32 linear_left, linear_right;#endif#ifdef SMOOTH_MIXING	compute_mix_smoothing(vp);	linear_left = FROM_FINAL_VOLUME(left);	if (vp->left_mix_offset) {		linear_left += vp->left_mix_offset;		if (linear_left > MAX_AMP_VALUE) {			linear_left = MAX_AMP_VALUE;			vp->left_mix_offset = 0;		}		left = FINAL_VOLUME(linear_left);	}	linear_right = FROM_FINAL_VOLUME(right);	if (vp->right_mix_offset) {		linear_right += vp->right_mix_offset;		if (linear_right > MAX_AMP_VALUE) {			linear_right = MAX_AMP_VALUE;			vp->right_mix_offset = 0;		}		right = FINAL_VOLUME(linear_right);	}	for (i = 0; (vp->left_mix_offset | vp->right_mix_offset)			&& i < count; i++) {		s = *sp++;		MIXATION(left);		MIXATION(right);		if (vp->left_mix_offset) {			vp->left_mix_offset += vp->left_mix_inc;			linear_left += vp->left_mix_inc;			if (linear_left > MAX_AMP_VALUE) {				linear_left = MAX_AMP_VALUE;				vp->left_mix_offset = 0;			}			left = FINAL_VOLUME(linear_left);		}		if (vp->right_mix_offset) {			vp->right_mix_offset += vp->right_mix_inc;			linear_right += vp->right_mix_inc;			if (linear_right > MAX_AMP_VALUE) {				linear_right = MAX_AMP_VALUE;				vp->right_mix_offset = 0;			}			right = FINAL_VOLUME(linear_right);		}	}	vp->old_left_mix = linear_left;	vp->old_right_mix = linear_right;	count -= i;#endif	for (i = 0; i < count; i++) {		s = *sp++;		MIXATION(left);		MIXATION(right);	}}#endif	/* ENABLE_PAN_DELAY */static inline void mix_center_signal(		mix_t *sp, int32 *lp, int v, int count){	Voice *vp = voice + v;	final_volume_t left=vp->left_mix;	int cc, i;	mix_t s;#ifdef SMOOTH_MIXING	int32 linear_left;#endif		if (! (cc = vp->control_counter)) {		cc = control_ratio;		if (update_signal(v))			/* Envelope ran out */			return;		left = vp->left_mix;	}#ifdef SMOOTH_MIXING	compute_mix_smoothing(vp);#endif	while (count)		if (cc < count) {			count -= cc;#ifdef SMOOTH_MIXING			linear_left = FROM_FINAL_VOLUME(left);			if (vp->left_mix_offset) {				linear_left += vp->left_mix_offset;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			for (i = 0; vp->left_mix_offset && i < cc; i++) {				s = *sp++;				MIXATION(left);				MIXATION(left);				vp->left_mix_offset += vp->left_mix_inc;				linear_left += vp->left_mix_inc;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			vp->old_left_mix = vp->old_right_mix = linear_left;			cc -= i;#endif			for (i = 0; i < cc; i++) {				s = *sp++;				MIXATION(left);				MIXATION(left);			}			cc = control_ratio;			if (update_signal(v))				/* Envelope ran out */				return;			left = vp->left_mix;#ifdef SMOOTH_MIXING			compute_mix_smoothing(vp);#endif		} else {			vp->control_counter = cc - count;#ifdef SMOOTH_MIXING			linear_left = FROM_FINAL_VOLUME(left);			if (vp->left_mix_offset) {				linear_left += vp->left_mix_offset;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			for (i = 0; vp->left_mix_offset && i < count; i++) {				s = *sp++;				MIXATION(left);				MIXATION(left);				vp->left_mix_offset += vp->left_mix_inc;				linear_left += vp->left_mix_inc;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			vp->old_left_mix = vp->old_right_mix = linear_left;			count -= i;#endif			for (i = 0; i < count; i++) {				s = *sp++;				MIXATION(left);				MIXATION(left);			}			return;		}}static inline void mix_center(mix_t *sp, int32 *lp, int v, int count){	final_volume_t left = voice[v].left_mix;	mix_t s;	int i;#ifdef SMOOTH_MIXING	Voice *vp = voice + v;	int32 linear_left;#endif	#ifdef SMOOTH_MIXING	compute_mix_smoothing(vp);	linear_left = FROM_FINAL_VOLUME(left);	if (vp->left_mix_offset) {		linear_left += vp->left_mix_offset;		if (linear_left > MAX_AMP_VALUE) {			linear_left = MAX_AMP_VALUE;			vp->left_mix_offset = 0;		}		left = FINAL_VOLUME(linear_left);	}	for (i = 0; vp->left_mix_offset && i < count; i++) {		s = *sp++;		MIXATION(left);		MIXATION(left);		vp->left_mix_offset += vp->left_mix_inc;		linear_left += vp->left_mix_inc;		if (linear_left > MAX_AMP_VALUE) {			linear_left = MAX_AMP_VALUE;			vp->left_mix_offset = 0;		}		left = FINAL_VOLUME(linear_left);	}	vp->old_left_mix = vp->old_right_mix = linear_left;	count -= i;#endif	for (i = 0; i < count; i++) {		s = *sp++;		MIXATION(left);		MIXATION(left);	}}static inline void mix_single_signal(		mix_t *sp, int32 *lp, int v, int count){	Voice *vp = voice + v;	final_volume_t left = vp->left_mix;	int cc, i;	mix_t s;#ifdef SMOOTH_MIXING	int32 linear_left;#endif		if (!(cc = vp->control_counter)) {		cc = control_ratio;		if (update_signal(v))			/* Envelope ran out */			return;		left = vp->left_mix;	}#ifdef SMOOTH_MIXING	compute_mix_smoothing(vp);#endif	while (count)		if (cc < count) {			count -= cc;#ifdef SMOOTH_MIXING			linear_left = FROM_FINAL_VOLUME(left);			if (vp->left_mix_offset) {				linear_left += vp->left_mix_offset;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			for (i = 0; vp->left_mix_offset && i < cc; i++) {				s = *sp++;				MIXATION(left);				lp++;				vp->left_mix_offset += vp->left_mix_inc;				linear_left += vp->left_mix_inc;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			vp->old_left_mix = linear_left;			cc -= i;#endif			for (i = 0; i < cc; i++) {				s = *sp++;				MIXATION(left);				lp++;			}			cc = control_ratio;			if (update_signal(v))				/* Envelope ran out */				return;			left = vp->left_mix;#ifdef SMOOTH_MIXING			compute_mix_smoothing(vp);#endif		} else {			vp->control_counter = cc - count;#ifdef SMOOTH_MIXING			linear_left = FROM_FINAL_VOLUME(left);			if (vp->left_mix_offset) {				linear_left += vp->left_mix_offset;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			for (i = 0; vp->left_mix_offset && i < count; i++) {				s = *sp++;				MIXATION(left);				lp++;				vp->left_mix_offset += vp->left_mix_inc;				linear_left += vp->left_mix_inc;				if (linear_left > MAX_AMP_VALUE) {					linear_left = MAX_AMP_VALUE;					vp->left_mix_offset = 0;				}				left = FINAL_VOLUME(linear_left);			}			vp->old_left_mix = linear_left;			count -= i;#endif			for (i = 0; i < count; i++) {				s = *sp++;				MIXATION(left);				lp++;			}			return;		}}static inline void mix_single(mix_t *sp, int32 *lp, int v, int count){	final_volume_t left = voice[v].left_mix;	mix_t s;	int i;#ifdef SMOOTH_MIXING	Voice *vp = voice + v;	int32 linear_left;#endif	#ifdef SMOOTH_MIXING	compute_mix_smoothing(vp);	linear_left = FROM_FINAL_VOLUME(left);	if (vp->left_mix_offset) {		linear_left += vp->left_mix_offset;		if (linear_left > MAX_AMP_VALUE) {			linear_left = MAX_AMP_VALUE;			vp->left_mix_offset = 0;		}		left = FINAL_VOLUME(linear_left);	}	for (i = 0; vp->left_mix_offset && i < count; i++) {		s = *sp++;		MIXATION(left);		lp++;		vp->left_mix_offset += vp->left_mix_inc;		linear_left += vp->left_mix_inc;		if (linear_left > MAX_AMP_VALUE) {			linear_left = MAX_AMP_VALUE;			vp->left_mix_offset = 0;		}		left = FINAL_VOLUME(linear_left);	}	vp->old_left_mix = linear_left;	count -= i;#endif	for (i = 0; i < count; i++) {		s = *sp++;		MIXATION(left);		lp++;	}}/* Returns 1 if the note died */static inline int update_signal(int v){	Voice *vp = &voice[v];	if (vp->envelope_increment && update_envelope(v))		return 1;	if (vp->tremolo_phase_increment)		update_tremolo(v);	if (opt_modulation_envelope && vp->sample->modes & MODES_ENVELOPE)		update_modulation_envelope(v);	return apply_envelope_to_amp(v);}static inline int update_envelope(int v){	Voice *vp = &voice[v];		vp->envelope_volume += vp->envelope_increment;	if ((vp->envelope_increment < 0)			^ (vp->envelope_volume > vp->envelope_target)) {		vp->envelope_volume = vp->envelope_target;		if (recompute_envelope(v))			return 1;	}	return 0;}static int get_eg_stage(int v, int stage){	int eg_stage;	Voice *vp = &voice[v];	eg_stage = stage;	if (vp->sample->inst_type == INST_SF2) {		if (stage >= EG_SF_RELEASE) {			eg_stage = EG_RELEASE;		}	} else {		if (stage == EG_GUS_DECAY) {			eg_stage = EG_DECAY;		} else if (stage == EG_GUS_SUSTAIN) {			eg_stage = EG_NULL;		} else if (stage >= EG_GUS_RELEASE1) {			eg_stage = EG_RELEASE;		}	}	return eg_stage;}/* Returns 1 if envelope runs out */int recompute_envelope(int v){	int stage, ch;	double sustain_time;	int32 envelope_width;	Voice *vp = &voice[v];		stage = vp->envelope_stage;	if (stage > EG_GUS_RELEASE3) {		voice_ran_out(v);		return 1;	} else if (stage > EG_GUS_SUSTAIN && vp->envelope_volume <= 0) {		/* Remove silent voice in the release stage */		voice_ran_out(v);		return 1;	}	/* Routine to decay the sustain envelope	 *	 * Disabled if !min_sustain_time.	 * min_sustain_time is given in msec, and is the minimum

⌨️ 快捷键说明

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