float WahWah::frequencyComputer(float fc, float rate, float depth) { float floSignal = pow(depth, .5*LFO(rate)); // Slew the modulation signal as well modSlewer.process(floSignal, floSignal); return fc*floSignal; }
static void runHermesFilter(LV2_Handle instance, uint32_t sample_count) { HermesFilter *plugin_data = (HermesFilter *)instance; const float lfo1_freq = *(plugin_data->lfo1_freq); const float lfo1_wave = *(plugin_data->lfo1_wave); const float lfo2_freq = *(plugin_data->lfo2_freq); const float lfo2_wave = *(plugin_data->lfo2_wave); const float osc1_freq = *(plugin_data->osc1_freq); const float osc1_wave = *(plugin_data->osc1_wave); const float osc2_freq = *(plugin_data->osc2_freq); const float osc2_wave = *(plugin_data->osc2_wave); const float rm1_depth = *(plugin_data->rm1_depth); const float rm2_depth = *(plugin_data->rm2_depth); const float rm3_depth = *(plugin_data->rm3_depth); const float osc1_gain_db = *(plugin_data->osc1_gain_db); const float rm1_gain_db = *(plugin_data->rm1_gain_db); const float osc2_gain_db = *(plugin_data->osc2_gain_db); const float rm2_gain_db = *(plugin_data->rm2_gain_db); const float in_gain_db = *(plugin_data->in_gain_db); const float rm3_gain_db = *(plugin_data->rm3_gain_db); const float xover_lfreqp = *(plugin_data->xover_lfreqp); const float xover_ufreqp = *(plugin_data->xover_ufreqp); const float drive1 = *(plugin_data->drive1); const float drive2 = *(plugin_data->drive2); const float drive3 = *(plugin_data->drive3); const float filt1_type = *(plugin_data->filt1_type); const float filt1_freq = *(plugin_data->filt1_freq); const float filt1_q = *(plugin_data->filt1_q); const float filt1_res = *(plugin_data->filt1_res); const float filt1_lfo1 = *(plugin_data->filt1_lfo1); const float filt1_lfo2 = *(plugin_data->filt1_lfo2); const float filt2_type = *(plugin_data->filt2_type); const float filt2_freq = *(plugin_data->filt2_freq); const float filt2_q = *(plugin_data->filt2_q); const float filt2_res = *(plugin_data->filt2_res); const float filt2_lfo1 = *(plugin_data->filt2_lfo1); const float filt2_lfo2 = *(plugin_data->filt2_lfo2); const float filt3_type = *(plugin_data->filt3_type); const float filt3_freq = *(plugin_data->filt3_freq); const float filt3_q = *(plugin_data->filt3_q); const float filt3_res = *(plugin_data->filt3_res); const float filt3_lfo1 = *(plugin_data->filt3_lfo1); const float filt3_lfo2 = *(plugin_data->filt3_lfo2); const float dela1_length = *(plugin_data->dela1_length); const float dela1_fb = *(plugin_data->dela1_fb); const float dela1_wet = *(plugin_data->dela1_wet); const float dela2_length = *(plugin_data->dela2_length); const float dela2_fb = *(plugin_data->dela2_fb); const float dela2_wet = *(plugin_data->dela2_wet); const float dela3_length = *(plugin_data->dela3_length); const float dela3_fb = *(plugin_data->dela3_fb); const float dela3_wet = *(plugin_data->dela3_wet); const float band1_gain_db = *(plugin_data->band1_gain_db); const float band2_gain_db = *(plugin_data->band2_gain_db); const float band3_gain_db = *(plugin_data->band3_gain_db); const float * const input = plugin_data->input; float * const output = plugin_data->output; blo_h_tables * tables = plugin_data->tables; blo_h_osc * osc1_d = plugin_data->osc1_d; blo_h_osc * osc2_d = plugin_data->osc2_d; blo_h_osc * lfo1_d = plugin_data->lfo1_d; blo_h_osc * lfo2_d = plugin_data->lfo2_d; float lfo1 = plugin_data->lfo1; float lfo2 = plugin_data->lfo2; float lfo1_phase = plugin_data->lfo1_phase; float lfo2_phase = plugin_data->lfo2_phase; sv_filter ** filt_data = plugin_data->filt_data; sv_filter * xover_b1_data = plugin_data->xover_b1_data; sv_filter * xover_b2_data = plugin_data->xover_b2_data; float ** dela_data = plugin_data->dela_data; int * dela_pos = plugin_data->dela_pos; long count = plugin_data->count; unsigned long pos; int i; // dB gains converted to coefficients float osc1_gain, rm1_gain, osc2_gain, rm2_gain, in_gain, rm3_gain; // Output values for the oscilators etc. float osc1, osc2, in, rm1, rm2, rm3, mixer1; // Outputs from xover float xover[3], band_gain[3]; // Output values for disortions float dist[3]; // Stuff for distortions float drive[3]; // Stuff for filters float filt[3]; float filt_freq[3]; float filt_res[3]; float filt_lfo1[3]; float filt_lfo2[3]; int filt_t[3]; // Values for delays float dela[3], dela_wet[3], dela_fb[3]; int dela_offset[3]; // Output of mixer2 float mixer2; // X overs const float xover_ufreq = f_clamp(xover_ufreqp, 200.0f, (float)(sample_rate / 6)); const float xover_lfreq = f_clamp(xover_lfreqp, 0.0f, xover_ufreq); setup_f_svf(xover_b1_data, sample_rate, xover_ufreq); setup_f_svf(xover_b2_data, sample_rate, xover_lfreq); // Calculate delay offsets dela_offset[0] = dela1_length * sample_rate; dela_offset[1] = dela2_length * sample_rate; dela_offset[2] = dela3_length * sample_rate; for (i = 0; i < 3; i++) { if (dela_offset[i] > sample_rate * 2 || dela_offset[i] < 0) { dela_offset[i] = 0; } dela[i] = 0.0f; filt_t[i] = 0; } // Convert dB gains to coefficients osc1_gain = DB_CO(osc1_gain_db); osc2_gain = DB_CO(osc2_gain_db); in_gain = DB_CO(in_gain_db); rm1_gain = DB_CO(rm1_gain_db); rm2_gain = DB_CO(rm2_gain_db); rm3_gain = DB_CO(rm3_gain_db); band_gain[0] = DB_CO(band1_gain_db); band_gain[1] = DB_CO(band2_gain_db); band_gain[2] = DB_CO(band3_gain_db); osc1_d->wave = wave_tbl(osc1_wave); osc2_d->wave = wave_tbl(osc2_wave); lfo1_d->wave = wave_tbl(lfo1_wave); lfo2_d->wave = wave_tbl(lfo2_wave); blo_hd_set_freq(osc1_d, osc1_freq); blo_hd_set_freq(osc2_d, osc2_freq); blo_hd_set_freq(lfo1_d, lfo1_freq * 16); blo_hd_set_freq(lfo2_d, lfo2_freq * 16); #define SETUP_F(n,f,q,t) setup_svf(filt_data[n], sample_rate, f, q, (int)t) // Set filter stuff SETUP_F(0, filt1_freq, filt1_q, filt1_type); SETUP_F(1, filt2_freq, filt2_q, filt2_type); SETUP_F(2, filt3_freq, filt3_q, filt3_type); filt_freq[0] = filt1_freq; filt_freq[1] = filt2_freq; filt_freq[2] = filt3_freq; filt_res[0] = filt1_res; filt_res[1] = filt2_res; filt_res[2] = filt3_res; filt_lfo1[0] = filt1_lfo1; filt_lfo1[1] = filt2_lfo1; filt_lfo1[2] = filt3_lfo1; filt_lfo2[0] = filt1_lfo2; filt_lfo2[1] = filt2_lfo2; filt_lfo2[2] = filt3_lfo2; // Setup distortions drive[0] = drive1; drive[1] = drive2; drive[2] = drive3; // Setup delays dela_wet[0] = dela1_wet; dela_wet[1] = dela2_wet; dela_wet[2] = dela3_wet; dela_fb[0] = dela1_fb; dela_fb[1] = dela2_fb; dela_fb[2] = dela3_fb; tables = tables; // To shut up gcc for (pos = 0; pos < sample_count; pos++) { count++; // Count of number of samples processed // Calculate oscilator values for this sample if (osc1_d->wave == NOISE) { osc1 = rand() * (0.5f/(float)RAND_MAX) - 1.0f; } else { osc1 = blo_hd_run_lin(osc1_d); } if (osc2_d->wave == NOISE) { osc2 = rand() * (0.5f/(float)RAND_MAX) - 1.0f; } else { osc2 = blo_hd_run_lin(osc2_d); } // Calculate LFO values every 16 samples if ((count & 15) == 1) { // Calculate lfo values if (lfo1_d->wave == NOISE) { lfo1_phase += lfo1_freq; if (lfo1_phase >= sample_rate) { lfo1_phase -= sample_rate; lfo1 = rand() * (0.5f/(float)RAND_MAX) - 1.0f; } } else { lfo1 = blo_hd_run_lin(lfo1_d); } if (lfo2_d->wave == NOISE) { lfo2_phase += lfo1_freq; if (lfo2_phase >= sample_rate) { lfo2_phase -= sample_rate; lfo2 = rand() * (0.5f/(float)RAND_MAX) - 1.0f; } } else { lfo2 = blo_hd_run_lin(lfo2_d); } } in = input[pos]; rm1 = RINGMOD(osc2, osc1, rm1_depth); rm2 = RINGMOD(in, osc2, rm2_depth); rm3 = RINGMOD(osc1, in, rm3_depth); mixer1 = (osc1 * osc1_gain) + (osc2 * osc2_gain) + (in * in_gain) + (rm1 * rm1_gain) + (rm2 * rm2_gain) + (rm3 * rm3_gain); mixer1 = soft_clip(mixer1); // Higpass off the top band xover[0] = run_svf(xover_b1_data, mixer1); // Lowpass off the bottom band xover[2] = run_svf(xover_b2_data, mixer1); // The middle band is whats left xover[1] = mixer1 - xover[0] - xover[2]; mixer2 = 0.0f; for (i = 0; i < 3; i++) { dist[i] = xover[i]*(fabs(xover[i]) + drive1)/(xover[i]*xover[i] + (drive[i]-1)*fabs(xover[i]) + 1.0f); if (filt_t[i] == 0) { filt[i] = dist[i]; } else { if (count % 16 == 1) { setup_f_svf(filt_data[i], sample_rate, filt_freq[i]+LFO(filt_lfo1[i], filt_lfo2[i])); } filt[i] = run_svf(filt_data[i], dist[i] + (filt_res[i] * (filt_data[i])->b)); } dela[i] = (dela_data[i][dela_pos[i]] * dela_wet[i]) + filt[i]; dela_data[i][(dela_pos[i] + dela_offset[i]) % (2 * sample_rate)] = filt[i] + (dela[i] * dela_fb[i]); dela_pos[i] = (dela_pos[i] + 1) % (2 * sample_rate); mixer2 += band_gain[i] * dela[i]; } buffer_write(output[pos], soft_clip(mixer2)); } plugin_data->count = count; plugin_data->lfo1 = lfo1; plugin_data->lfo2 = lfo2; plugin_data->lfo1_phase = lfo1_phase; plugin_data->lfo2_phase = lfo2_phase; }
static Int16 delay; static Int16 LFOdelay; static Int16 currentSample; static Int16 previousSample; static Int16 frac; static Int32 output; Int16 vibrato(Int16 sample,Int16 LFOspeed, Int16 depth, Int16 opmode) { /* The in parameters are recalculated with regards to fix point and the actual implementation */ depth = depth>>3; LFOspeed=260-LFOspeed; LFOdelay=LFO(LFOspeed)+256; // The function LFO is called to calculate the current delay LFOdelay*=depth; frac= LFOdelay & 31; // frac is shifted down 5 times LFOdelay>>=5; /* Find sample delayed the number of samples the LFO gives */ delay = DELAY_BUFFER_SIZE-LFOdelay; delay = (vibindex+delay)&(DELAY_BUFFER_SIZE-1); currentSample = buffer[delay]; /* Find the sample delayed by one more sample than the above */ delay = DELAY_BUFFER_SIZE-LFOdelay-1; delay = (vibindex+delay)&(DELAY_BUFFER_SIZE-1);