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