static void activateVynil(LV2_Handle instance) { Vynil *plugin_data = (Vynil *)instance; float fs __attribute__ ((unused)) = plugin_data->fs; float * buffer_m __attribute__ ((unused)) = plugin_data->buffer_m; float * buffer_s __attribute__ ((unused)) = plugin_data->buffer_s; unsigned int buffer_mask __attribute__ ((unused)) = plugin_data->buffer_mask; unsigned int buffer_pos __attribute__ ((unused)) = plugin_data->buffer_pos; float * click_buffer __attribute__ ((unused)) = plugin_data->click_buffer; fixp16 click_buffer_pos __attribute__ ((unused)) = plugin_data->click_buffer_pos; fixp16 click_buffer_omega __attribute__ ((unused)) = plugin_data->click_buffer_omega; float click_gain __attribute__ ((unused)) = plugin_data->click_gain; float phi __attribute__ ((unused)) = plugin_data->phi; unsigned int sample_cnt __attribute__ ((unused)) = plugin_data->sample_cnt; float def __attribute__ ((unused)) = plugin_data->def; float def_target __attribute__ ((unused)) = plugin_data->def_target; biquad * lowp_m __attribute__ ((unused)) = plugin_data->lowp_m; biquad * lowp_s __attribute__ ((unused)) = plugin_data->lowp_s; biquad * noise_filt __attribute__ ((unused)) = plugin_data->noise_filt; biquad * highp __attribute__ ((unused)) = plugin_data->highp; memset(buffer_m, 0, sizeof(float) * (buffer_mask + 1)); memset(buffer_s, 0, sizeof(float) * (buffer_mask + 1)); plugin_data->buffer_pos = 0; plugin_data->click_buffer_pos.all = 0; plugin_data->click_buffer_omega.all = 0; plugin_data->click_gain = 0; plugin_data->phi = 0.0f; lp_set_params(lowp_m, 16000.0, 0.5, fs); lp_set_params(lowp_s, 16000.0, 0.5, fs); lp_set_params(highp, 10.0, 0.5, fs); lp_set_params(noise_filt, 1000.0, 0.5, fs); }
static void activateVynil(LADSPA_Handle instance) { Vynil *plugin_data = (Vynil *)instance; LADSPA_Data *buffer_m = plugin_data->buffer_m; unsigned int buffer_mask = plugin_data->buffer_mask; unsigned int buffer_pos = plugin_data->buffer_pos; LADSPA_Data *buffer_s = plugin_data->buffer_s; LADSPA_Data *click_buffer = plugin_data->click_buffer; fixp16 click_buffer_omega = plugin_data->click_buffer_omega; fixp16 click_buffer_pos = plugin_data->click_buffer_pos; float click_gain = plugin_data->click_gain; float def = plugin_data->def; float def_target = plugin_data->def_target; float fs = plugin_data->fs; biquad *highp = plugin_data->highp; biquad *lowp_m = plugin_data->lowp_m; biquad *lowp_s = plugin_data->lowp_s; biquad *noise_filt = plugin_data->noise_filt; float phi = plugin_data->phi; unsigned int sample_cnt = plugin_data->sample_cnt; #line 75 "vynil_1905.xml" memset(buffer_m, 0, sizeof(LADSPA_Data) * (buffer_mask + 1)); memset(buffer_s, 0, sizeof(LADSPA_Data) * (buffer_mask + 1)); buffer_pos = 0; click_buffer_pos.all = 0; click_buffer_omega.all = 0; click_gain = 0; phi = 0.0f; lp_set_params(lowp_m, 16000.0, 0.5, fs); lp_set_params(lowp_s, 16000.0, 0.5, fs); lp_set_params(highp, 10.0, 0.5, fs); lp_set_params(noise_filt, 1000.0, 0.5, fs); plugin_data->buffer_m = buffer_m; plugin_data->buffer_mask = buffer_mask; plugin_data->buffer_pos = buffer_pos; plugin_data->buffer_s = buffer_s; plugin_data->click_buffer = click_buffer; plugin_data->click_buffer_omega = click_buffer_omega; plugin_data->click_buffer_pos = click_buffer_pos; plugin_data->click_gain = click_gain; plugin_data->def = def; plugin_data->def_target = def_target; plugin_data->fs = fs; plugin_data->highp = highp; plugin_data->lowp_m = lowp_m; plugin_data->lowp_s = lowp_s; plugin_data->noise_filt = noise_filt; plugin_data->phi = phi; plugin_data->sample_cnt = sample_cnt; }
static void runPointerCastDistortion(LADSPA_Handle instance, unsigned long sample_count) { PointerCastDistortion *plugin_data = (PointerCastDistortion *)instance; /* Effect cutoff freq (Hz) (float value) */ const LADSPA_Data cutoff = *(plugin_data->cutoff); /* Dry/wet mix (float value) */ const LADSPA_Data wet = *(plugin_data->wet); /* Input (array of floats of length sample_count) */ const LADSPA_Data * const input = plugin_data->input; /* Output (array of floats of length sample_count) */ LADSPA_Data * const output = plugin_data->output; biquad * filt = plugin_data->filt; float fs = plugin_data->fs; #line 40 "pointer_cast_1910.xml" unsigned long pos; const float filt_scale = cutoff < 50.0f ? cutoff / 50.0f : 1.0f; lp_set_params(filt, cutoff, 1.0f, fs); for (pos = 0; pos < sample_count; pos++) { pcast val; float sign, filt_val, dist_val; filt_val = biquad_run(filt, input[pos]) * filt_scale; sign = filt_val < 0.0f ? -1.0f : 1.0f; val.fp = fabs(filt_val); dist_val = sign * (LADSPA_Data)val.in / (LADSPA_Data)INT_MAX + (input[pos] - filt_val); buffer_write(output[pos], LIN_INTERP(wet, input[pos], dist_val)); } }
static void runVynil(LADSPA_Handle instance, unsigned long sample_count) { Vynil *plugin_data = (Vynil *)instance; /* Year (float value) */ const LADSPA_Data year = *(plugin_data->year); /* RPM (float value) */ const LADSPA_Data rpm = *(plugin_data->rpm); /* Surface warping (float value) */ const LADSPA_Data warp = *(plugin_data->warp); /* Crackle (float value) */ const LADSPA_Data click = *(plugin_data->click); /* Wear (float value) */ const LADSPA_Data wear = *(plugin_data->wear); /* Input L (array of floats of length sample_count) */ const LADSPA_Data * const in_l = plugin_data->in_l; /* Input R (array of floats of length sample_count) */ const LADSPA_Data * const in_r = plugin_data->in_r; /* Output L (array of floats of length sample_count) */ LADSPA_Data * const out_l = plugin_data->out_l; /* Output R (array of floats of length sample_count) */ LADSPA_Data * const out_r = plugin_data->out_r; LADSPA_Data * buffer_m = plugin_data->buffer_m; unsigned int buffer_mask = plugin_data->buffer_mask; unsigned int buffer_pos = plugin_data->buffer_pos; LADSPA_Data * buffer_s = plugin_data->buffer_s; LADSPA_Data * click_buffer = plugin_data->click_buffer; fixp16 click_buffer_omega = plugin_data->click_buffer_omega; fixp16 click_buffer_pos = plugin_data->click_buffer_pos; float click_gain = plugin_data->click_gain; float def = plugin_data->def; float def_target = plugin_data->def_target; float fs = plugin_data->fs; biquad * highp = plugin_data->highp; biquad * lowp_m = plugin_data->lowp_m; biquad * lowp_s = plugin_data->lowp_s; biquad * noise_filt = plugin_data->noise_filt; float phi = plugin_data->phi; unsigned int sample_cnt = plugin_data->sample_cnt; #line 90 "vynil_1905.xml" unsigned long pos; float deflec = def; float deflec_target = def_target; float src_m, src_s; /* angular velocity of platter * 16 */ const float omega = 960.0f / (rpm * fs); const float age = (2000 - year) * 0.01f; const unsigned int click_prob = (age*age*(float)RAND_MAX)/10 + click * 0.02 * RAND_MAX; const float noise_amp = (click + wear * 0.3f) * 0.12f + (1993.0f - year) * 0.0031f; const float bandwidth = (year - 1880.0f) * (rpm * 1.9f); const float noise_bandwidth = bandwidth * (0.25 - wear * 0.02) + click * 200.0 + 300.0; const float stereo = f_clamp((year - 1940.0f) * 0.02f, 0.0f, 1.0f); const float wrap_gain = age * 3.1f + 0.05f; const float wrap_bias = age * 0.1f; lp_set_params(lowp_m, bandwidth * (1.0 - wear * 0.86), 2.0, fs); lp_set_params(lowp_s, bandwidth * (1.0 - wear * 0.89), 2.0, fs); hp_set_params(highp, (2000-year) * 8.0, 1.5, fs); lp_set_params(noise_filt, noise_bandwidth, 4.0 + wear * 2.0, fs); for (pos = 0; pos < sample_count; pos++) { unsigned int o1, o2; float ofs; if ((sample_cnt & 15) == 0) { const float ang = phi * 2.0f * M_PI; const float w = warp * (2000.0f - year) * 0.01f; deflec_target = w*df(ang)*0.5f + w*w*df(2.0f*ang)*0.31f + w*w*w*df(3.0f*ang)*0.129f; phi += omega; while (phi > 1.0f) { phi -= 1.0f; } if ((unsigned int)rand() < click_prob) { click_buffer_omega.all = ((rand() >> 6) + 1000) * rpm; click_gain = noise_amp * 5.0f * noise(); } } deflec = deflec * 0.1f + deflec_target * 0.9f; /* matrix into mid_side representation (this is roughly what stereo * LPs do) */ buffer_m[buffer_pos] = in_l[pos] + in_r[pos]; buffer_s[buffer_pos] = in_l[pos] - in_r[pos]; /* cacluate the effects of the surface warping */ ofs = fs * 0.009f * deflec; o1 = f_round(floorf(ofs)); o2 = f_round(ceilf(ofs)); ofs -= o1; src_m = LIN_INTERP(ofs, buffer_m[(buffer_pos - o1 - 1) & buffer_mask], buffer_m[(buffer_pos - o2 - 1) & buffer_mask]); src_s = LIN_INTERP(ofs, buffer_s[(buffer_pos - o1 - 1) & buffer_mask], buffer_s[(buffer_pos - o2 - 1) & buffer_mask]); src_m = biquad_run(lowp_m, src_m + click_buffer[click_buffer_pos.part.in & (CLICK_BUF_SIZE - 1)] * click_gain); /* waveshaper */ src_m = LIN_INTERP(age, src_m, sinf(src_m * wrap_gain + wrap_bias)); /* output highpass */ src_m = biquad_run(highp, src_m) + biquad_run(noise_filt, noise()) * noise_amp + click_buffer[click_buffer_pos.part.in & (CLICK_BUF_SIZE - 1)] * click_gain * 0.5f; /* stereo seperation filter */ src_s = biquad_run(lowp_s, src_s) * stereo; buffer_write(out_l[pos], (src_s + src_m) * 0.5f); buffer_write(out_r[pos], (src_m - src_s) * 0.5f); /* roll buffer indexes */ buffer_pos = (buffer_pos + 1) & buffer_mask; click_buffer_pos.all += click_buffer_omega.all; if (click_buffer_pos.part.in >= CLICK_BUF_SIZE) { click_buffer_pos.all = 0; click_buffer_omega.all = 0; } sample_cnt++; }
void run_adding_DeEsser(LADSPA_Handle Instance, unsigned long SampleCount) { DeEsser * ptr = (DeEsser *)Instance; LADSPA_Data * input = ptr->input; LADSPA_Data * output = ptr->output; LADSPA_Data threshold = LIMIT(*(ptr->threshold),-50.0f,10.0f); LADSPA_Data freq = LIMIT(*(ptr->freq),2000.0f,16000.0f); LADSPA_Data sidechain = LIMIT(*(ptr->sidechain),0.0f,1.0f); LADSPA_Data monitor = LIMIT(*(ptr->monitor),0.0f,1.0f); unsigned long sample_index; LADSPA_Data in = 0; LADSPA_Data out = 0; LADSPA_Data sidech = 0; LADSPA_Data ampl_db = 0.0f; LADSPA_Data attn = 0.0f; LADSPA_Data max_attn = 0.0f; if (ptr->old_freq != freq) { lp_set_params(&ptr->sidech_lo_filter, freq, SIDECH_BW, ptr->sample_rate); hp_set_params(&ptr->sidech_hi_filter, freq, SIDECH_BW, ptr->sample_rate); ptr->old_freq = freq; } for (sample_index = 0; sample_index < SampleCount; sample_index++) { in = *(input++); /* process sidechain filters */ sidech = biquad_run(&ptr->sidech_hi_filter, in); if (sidechain > 0.1f) sidech = biquad_run(&ptr->sidech_lo_filter, sidech); ampl_db = 20.0f * log10f(sidech); if (ampl_db <= threshold) attn = 0.0f; else attn = -0.5f * (ampl_db - threshold); ptr->sum += attn; ptr->sum -= push_buffer(attn, ptr->ringbuffer, ptr->buflen, &ptr->pos); if (-1.0f * ptr->sum > max_attn) max_attn = -0.01f * ptr->sum; in *= db2lin(ptr->sum / 100.0f); /* output selector */ if (monitor > 0.1f) out = sidech; else out = in; *(output++) += ptr->run_adding_gain * out; *(ptr->attenuat) = LIMIT(max_attn,0,10); } }
/* load plugin data from reverb_data[] into an instance */ void load_plugin_data(LADSPA_Handle Instance) { Reverb * ptr = (Reverb *)Instance; unsigned long m; unsigned int i; m = LIMIT(*(ptr->mode),0,NUM_MODES-1); /* load combs data */ ptr->num_combs = 2 * reverb_data[m].num_combs; for (i = 0; i < reverb_data[m].num_combs; i++) { ((COMB_FILTER *)(ptr->combs + 2*i))->buflen = reverb_data[m].combs[i].delay * ptr->sample_rate; ((COMB_FILTER *)(ptr->combs + 2*i))->feedback = reverb_data[m].combs[i].feedback; ((COMB_FILTER *)(ptr->combs + 2*i))->freq_resp = LIMIT(reverb_data[m].combs[i].freq_resp * powf(ptr->sample_rate / 44100.0f, 0.8f), 0.0f, 1.0f); ((COMB_FILTER *)(ptr->combs + 2*i+1))->buflen = ((COMB_FILTER *)(ptr->combs + 2*i))->buflen; ((COMB_FILTER *)(ptr->combs + 2*i+1))->feedback = ((COMB_FILTER *)(ptr->combs + 2*i))->feedback; ((COMB_FILTER *)(ptr->combs + 2*i+1))->feedback = ((COMB_FILTER *)(ptr->combs + 2*i))->freq_resp; /* set initial values: */ *(((COMB_FILTER *)(ptr->combs + 2*i))->buffer_pos) = 0; *(((COMB_FILTER *)(ptr->combs + 2*i+1))->buffer_pos) = 0; ((COMB_FILTER *)(ptr->combs + 2*i))->last_out = 0; ((COMB_FILTER *)(ptr->combs + 2*i+1))->last_out = 0; lp_set_params(((COMB_FILTER *)(ptr->combs + 2*i))->filter, 2000.0f + 13000.0f * (1 - reverb_data[m].combs[i].freq_resp) * ptr->sample_rate / 44100.0f, BANDPASS_BWIDTH, ptr->sample_rate); lp_set_params(((COMB_FILTER *)(ptr->combs + 2*i+1))->filter, 2000.0f + 13000.0f * (1 - reverb_data[m].combs[i].freq_resp) * ptr->sample_rate / 44100.0f, BANDPASS_BWIDTH, ptr->sample_rate); } /* load allps data */ ptr->num_allps = 2 * reverb_data[m].num_allps; for (i = 0; i < reverb_data[m].num_allps; i++) { ((ALLP_FILTER *)(ptr->allps + 2*i))->buflen = reverb_data[m].allps[i].delay * ptr->sample_rate; ((ALLP_FILTER *)(ptr->allps + 2*i))->feedback = reverb_data[m].allps[i].feedback; ((ALLP_FILTER *)(ptr->allps + 2*i+1))->buflen = ((ALLP_FILTER *)(ptr->allps + 2*i))->buflen; ((ALLP_FILTER *)(ptr->allps + 2*i+1))->feedback = ((ALLP_FILTER *)(ptr->allps + 2*i))->feedback; /* set initial values: */ *(((ALLP_FILTER *)(ptr->allps + 2*i))->buffer_pos) = 0; *(((ALLP_FILTER *)(ptr->allps + 2*i+1))->buffer_pos) = 0; ((ALLP_FILTER *)(ptr->allps + 2*i))->last_out = 0; ((ALLP_FILTER *)(ptr->allps + 2*i+1))->last_out = 0; } /* init bandpass filters */ lp_set_params((biquad *)(ptr->low_pass), reverb_data[m].bandpass_high, BANDPASS_BWIDTH, ptr->sample_rate); hp_set_params((biquad *)(ptr->high_pass), reverb_data[m].bandpass_low, BANDPASS_BWIDTH, ptr->sample_rate); lp_set_params((biquad *)(ptr->low_pass + 1), reverb_data[m].bandpass_high, BANDPASS_BWIDTH, ptr->sample_rate); hp_set_params((biquad *)(ptr->high_pass + 1), reverb_data[m].bandpass_low, BANDPASS_BWIDTH, ptr->sample_rate); }