static int32 convert_vibrato_sweep(uint8 sweep, int32 vib_control_ratio) { if (!sweep) return 0; return (int32) (FSCALE((double) (vib_control_ratio) * SWEEP_TUNING, SWEEP_SHIFT) / (double)(play_mode->rate * sweep)); /* this was overflowing with seashore.pat ((vib_control_ratio * SWEEP_TUNING) << SWEEP_SHIFT) / (play_mode->rate * sweep); */ }
static sint32 convert_vibrato_sweep(uint8 sweep, sint32 vib_control_ratio) { if (!sweep) return 0; return static_cast<sint32>(FSCALE(static_cast<double>(vib_control_ratio) * SWEEP_TUNING, SWEEP_SHIFT) / static_cast<double>(play_mode->rate * sweep)); /* this was overflowing with seashore.pat ((vib_control_ratio * SWEEP_TUNING) << SWEEP_SHIFT) / (play_mode->rate * sweep); */ }
if (vp->vibrato_sweep != 0) { /* Need to update sweep */ vp->vibrato_sweep_position += vp->vibrato_sweep; if (vp->vibrato_sweep_position >= (1<<SWEEP_SHIFT)) vp->vibrato_sweep=0; else { /* Adjust depth */ depth *= vp->vibrato_sweep_position; depth >>= SWEEP_SHIFT; } } a = FSCALE(((double)(vp->sample->sample_rate) * vp->frequency) / ((double)(vp->sample->root_freq) * output_rate), FRACTION_BITS); pb = (sine(vp->vibrato_phase * (1.0/(2*VIBRATO_SAMPLE_INCREMENTS))) * (double)(depth) * VIBRATO_AMPLITUDE_TUNING); a *= pow(2.0, pb / (8192 * 12.f)); /* If the sweep's over, we can store the newly computed sample_increment */ if (!vp->vibrato_sweep) vp->vibrato_sample_increment[phase] = (int) a; if (sign) a = -a; /* need to preserve the loop direction */ return (int) a;
ramp *= tv; rramp *= tv; lfeamp *= tv; } if (voice[v].sample->modes & MODES_ENVELOPE) { FLOAT_T ev = (FLOAT_T)vol_table[voice[v].envelope_volume>>23]; lramp *= ev; lamp *= ev; ceamp *= ev; ramp *= ev; rramp *= ev; lfeamp *= ev; } la = (int32)FSCALE(lamp,AMP_BITS); ra = (int32)FSCALE(ramp,AMP_BITS); lra = (int32)FSCALE(lramp,AMP_BITS); rra = (int32)FSCALE(rramp,AMP_BITS); cea = (int32)FSCALE(ceamp,AMP_BITS); lfea = (int32)FSCALE(lfeamp,AMP_BITS); if (la>MAX_AMP_VALUE) la=MAX_AMP_VALUE; if (ra>MAX_AMP_VALUE) ra=MAX_AMP_VALUE; if (lra>MAX_AMP_VALUE) lra=MAX_AMP_VALUE; if (rra>MAX_AMP_VALUE) rra=MAX_AMP_VALUE; if (cea>MAX_AMP_VALUE) cea=MAX_AMP_VALUE; if (lfea>MAX_AMP_VALUE) lfea=MAX_AMP_VALUE; voice[v].lr_mix=FINAL_VOLUME(lra); voice[v].left_mix=FINAL_VOLUME(la);
{ /* Need to update sweep */ vp->vibrato_sweep_position += vp->vibrato_sweep; if (vp->vibrato_sweep_position >= (1<<SWEEP_SHIFT)) vp->vibrato_sweep=0; else { /* Adjust depth */ depth *= vp->vibrato_sweep_position; depth >>= SWEEP_SHIFT; } } a = FSCALE(((double)(vp->sample->sample_rate) * (double)(vp->frequency)) / ((double)(vp->sample->root_freq) * (double)(play_mode->rate)), FRACTION_BITS); pb=(int)((sine(vp->vibrato_phase * (SINE_CYCLE_LENGTH/(2*VIBRATO_SAMPLE_INCREMENTS))) * (double)(depth) * VIBRATO_AMPLITUDE_TUNING)); if (pb<0) { pb=-pb; a /= bend_fine[(pb>>5) & 0xFF] * bend_coarse[pb>>13]; } else a *= bend_fine[(pb>>5) & 0xFF] * bend_coarse[pb>>13];
channel[voice[v].channel].pitchfactor= static_cast<float>(bend_fine[(i>>5) & 0xFF] * bend_coarse[i>>13]); } if (pb>0) voice[v].frequency= static_cast<sint32>(channel[voice[v].channel].pitchfactor * static_cast<double>(voice[v].orig_frequency)); else voice[v].frequency= static_cast<sint32>(static_cast<double>(voice[v].orig_frequency) / channel[voice[v].channel].pitchfactor); } a = FSCALE((static_cast<double>(voice[v].sample->sample_rate) * static_cast<double>(voice[v].frequency)) / (static_cast<double>(voice[v].sample->root_freq) * static_cast<double>(play_mode->rate)), FRACTION_BITS); if (sign) a = -a; /* need to preserve the loop direction */ voice[v].sample_increment = static_cast<sint32>(a); } static void recompute_amp(int v) { sint32 tempamp; /* TODO: use fscale */
int32_t la,ra; if (voice[v].panned == PANNED_MYSTERY) { ramp=voice[v].right_amp; if (voice[v].tremolo_phase_increment) { lamp *= voice[v].tremolo_volume; ramp *= voice[v].tremolo_volume; } if (voice[v].sample->modes & MODES_ENVELOPE) { lamp *= (float)vol_table[voice[v].envelope_volume>>23]; ramp *= (float)vol_table[voice[v].envelope_volume>>23]; } la = (int32_t)FSCALE(lamp,AMP_BITS); if (la>MAX_AMP_VALUE) la=MAX_AMP_VALUE; ra = (int32_t)FSCALE(ramp,AMP_BITS); if (ra>MAX_AMP_VALUE) ra=MAX_AMP_VALUE; voice[v].left_mix=FINAL_VOLUME(la); voice[v].right_mix=FINAL_VOLUME(ra); } else { if (voice[v].tremolo_phase_increment)
{ /* Need to update sweep */ vp->vibrato_sweep_position += vp->vibrato_sweep; if (vp->vibrato_sweep_position >= (1<<SWEEP_SHIFT)) vp->vibrato_sweep=0; else { /* Adjust depth */ depth *= vp->vibrato_sweep_position; depth >>= SWEEP_SHIFT; } } a = FSCALE(((double)(vp->sample->sample_rate) * (double)(vp->frequency)) / ((double)(vp->sample->root_freq) * (double)DEFAULT_RATE), FRACTION_BITS); pb=(int)((sine(vp->vibrato_phase * (SINE_CYCLE_LENGTH/(2*VIBRATO_SAMPLE_INCREMENTS))) * (double)(depth) * VIBRATO_AMPLITUDE_TUNING)); if (pb<0) { pb=-pb; a /= bend_fine[(pb>>5) & 0xFF] * bend_coarse[pb>>13]; } else a *= bend_fine[(pb>>5) & 0xFF] * bend_coarse[pb>>13];
int32 la,ra; if (hMidi->voice[v].panned == PANNED_MYSTERY) { ramp=hMidi->voice[v].right_amp; if (hMidi->voice[v].tremolo_phase_increment) { lamp *= hMidi->voice[v].tremolo_volume; ramp *= hMidi->voice[v].tremolo_volume; } if (hMidi->voice[v].sample->modes & MODES_ENVELOPE) { lamp *= vol_table[hMidi->voice[v].envelope_volume>>23]; ramp *= vol_table[hMidi->voice[v].envelope_volume>>23]; } la = FSCALE(lamp,AMP_BITS); if (la>MAX_AMP_VALUE) la=MAX_AMP_VALUE; ra = FSCALE(ramp,AMP_BITS); if (ra>MAX_AMP_VALUE) ra=MAX_AMP_VALUE; hMidi->voice[v].left_mix=FINAL_VOLUME(la); hMidi->voice[v].right_mix=FINAL_VOLUME(ra); } else { if (hMidi->voice[v].tremolo_phase_increment)