努力编写LFO

时间:2020-06-11 13:28:49

标签: c sdl synthesis

基于一些教程代码,我发现我编写了一个带有三个振荡器和四个不同波形的合成器。它运作良好,我想添加一个LFO来组合声音。由于我不是自己编写所有代码,因此我对如何在代码中使用LFO公式感到困惑。这或多或少是我为在正弦波上实现LFO公式而进行的尝试。(此公式类似于:sinewaveFormula + 0.5 * Sinefreq * sin(2pi * 1)*时间)

double normalize(double phase)
{
  double cycles = phase/(2.0*pi);
  phase -= trunc(cycles) * 2.0 * pi;
  if (phase < 0) phase += 2.0*pi;
  return phase;
}

double sine(double phase)
 { phase = normalize(phase); return (sin(phase));}

static void build_sine_table(int16_t *data, int wave_length) {

    double phase_increment = (2.0f * pi) / (double)wave_length;
    double current_phase = 0;
    for(int i = 0; i < wave_length; i++) {
        int sample = synthOsc(current_phase, oscNum, selectedWave, selectedWave2, selectedWave3, intensity, intensity2, intensity3) + 0.5 * ((current_phase* wave_length) / (2*pi)) * sin(2*pi*(1.0)) * wave_length;
        data[i] = (int16_t)sample;
        current_phase += phase_increment;
    }
}

static void write_samples(int16_t *s_byteStream, long begin, long end, long length) {

    if(note > 0) {
        double d_sample_rate = sample_rate;
        double d_table_length = table_length;
        double d_note = note;

        // get correct phase increment for note depending on sample rate and table length.
        double phase_increment = (get_pitch(d_note) / d_sample_rate) * d_table_length;

        // loop through the buffer and write samples.
        for (int i = 0; i < length; i+=2) {
            phase_double += phase_increment;
            phase_int = (int)phase_double;
            if(phase_double >= table_length) {
                double diff = phase_double - table_length;
                phase_double = diff;
                phase_int = (int)diff;
            }

            if(phase_int < table_length && phase_int > -1) {
                if(s_byteStream != NULL) {
                    int16_t sample = sine_waveform_wave[phase_int];
                    target_amp = update_envelope();
                    if(smoothing_enabled) {
                        // move current amp towards target amp for a smoother transition.
                        if(current_amp < target_amp) {
                            current_amp += smoothing_amp_speed;
                            if(current_amp > target_amp) {
                                current_amp = target_amp;
                            }
                        } else if(current_amp > target_amp) {
                            current_amp -= smoothing_amp_speed;
                            if(current_amp < target_amp) {
                                current_amp = target_amp;
                            }
                        }
                    } else {
                        current_amp = target_amp;
                    }
                    sample *= current_amp; // scale volume.
                    s_byteStream[i+begin] = sample; // left channel
                    s_byteStream[i+begin+1] = sample; // right channel
                }
            }
        }
    }
}

代码可以编译,但正弦上没有LFO。我不明白如何使此公式与此代码一起工作。

0 个答案:

没有答案
相关问题