[SCM] calf/master: + Monosynth: add Scale Detune knob, replace Skewed waveforms, simplify PW interpolation
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:39:29 UTC 2013
The following commit has been merged in the master branch:
commit a72a087aebe77b4ee4a57a8e9d53e8b6e410fabb
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Sun Mar 22 19:23:16 2009 +0000
+ Monosynth: add Scale Detune knob, replace Skewed waveforms, simplify PW interpolation
diff --git a/gui/gui-monosynth.xml b/gui/gui-monosynth.xml
index b85c12c..c484732 100644
--- a/gui/gui-monosynth.xml
+++ b/gui/gui-monosynth.xml
@@ -55,9 +55,14 @@
<hbox>
<vbox>
<label param="o12_detune"/>
- <knob param="o12_detune" expand="0" fill="0"/>
+ <knob param="o12_detune"/>
<value param="o12_detune"/>
</vbox>
+ <vbox>
+ <label param="scale_detune"/>
+ <knob param="scale_detune"/>
+ <value param="scale_detune"/>
+ </vbox>
<align>
<vbox>
<label param="phase_mode"/>
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 0398730..6c20017 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -99,7 +99,7 @@ struct monosynth_metadata: public plugin_metadata<monosynth_metadata>
enum { flt_lp12, flt_lp24, flt_2lp12, flt_hp12, flt_lpbr, flt_hpbr, flt_bp6, flt_2bp6 };
enum { par_wave1, par_wave2, par_pw1, par_pw2, par_detune, par_osc2xpose, par_oscmode, par_oscmix, par_filtertype, par_cutoff, par_resonance, par_cutoffsep, par_envmod, par_envtores, par_envtoamp, par_attack, par_decay, par_sustain, par_fade, par_release,
par_keyfollow, par_legato, par_portamento, par_vel2filter, par_vel2amp, par_master, par_pwhlrange,
- par_lforate, par_lfodelay, par_lfofilter, par_lfopitch, par_lfopw, par_mwhl_lfo,
+ par_lforate, par_lfodelay, par_lfofilter, par_lfopitch, par_lfopw, par_mwhl_lfo, par_scaledetune,
param_count };
enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = true };
enum { step_size = 64, step_shift = 6 };
diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index cc76545..80a7c40 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -55,11 +55,22 @@ public:
dsp::onepole<float> phaseshifter;
dsp::biquad_d1_lerp<float> filter;
dsp::biquad_d1_lerp<float> filter2;
- int wave1, wave2, prev_wave1, prev_wave2, filter_type, last_filter_type;
+ /// Waveform number - OSC1
+ int wave1;
+ /// Waveform number - OSC2
+ int wave2;
+ /// Last used waveform number - OSC1
+ int prev_wave1;
+ /// Last used waveform number - OSC2
+ int prev_wave2;
+ int filter_type, last_filter_type;
float freq, start_freq, target_freq, cutoff, decay_factor, fgain, fgain_delta, separation;
float detune, xpose, xfade, ampctl, fltctl, queue_vel;
float odcr, porta_time, lfo_bend, lfo_clock, last_lfov, modwheel_value;
- float last_pwoffset1, last_pwoffset2;
+ /// Last value of phase shift for pulse width emulation for OSC1
+ int32_t last_pwshift1;
+ /// Last value of phase shift for pulse width emulation for OSC2
+ int32_t last_pwshift2;
int queue_note_on, stop_count, modwheel_value_int;
int legato;
dsp::adsr envelope;
@@ -86,6 +97,8 @@ public:
inline void set_frequency()
{
float detune_scaled = (detune - 1); // * log(freq / 440);
+ if (*params[par_scaledetune] > 0)
+ detune_scaled *= pow(20.0 / freq, *params[par_scaledetune]);
osc1.set_freq(freq * (1 - detune_scaled) * inertia_pitchbend.get_last() * lfo_bend, srate);
osc2.set_freq(freq * (1 + detune_scaled) * inertia_pitchbend.get_last() * lfo_bend * xpose, srate);
}
diff --git a/src/modules.cpp b/src/modules.cpp
index 41c06b4..ac0c4a1 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -299,6 +299,8 @@ CALF_PORT_PROPS(monosynth) = {
{ 100, 0, 1200, 0, PF_FLOAT | PF_SCALE_QUAD | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "lfo2pitch", "LFO->Pitch" },
{ 0, 0, 1, 0.1, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "lfo2pw", "LFO->PW" },
{ 1, 0, 1, 0.1, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "mwhl2lfo", "ModWheel->LFO" },
+
+ { 1, 0, 1, 0, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "scale_detune", "Scale Detune" },
};
////////////////////////////////////////////////////////////////////////////
diff --git a/src/monosynth.cpp b/src/monosynth.cpp
index 47f059e..b36ab37 100644
--- a/src/monosynth.cpp
+++ b/src/monosynth.cpp
@@ -53,6 +53,7 @@ void monosynth_audio_module::activate() {
filter.reset();
filter2.reset();
stack.clear();
+ last_pwshift1 = last_pwshift2 = 0;
}
waveform_family<MONOSYNTH_WAVE_BITS> *monosynth_audio_module::waves;
@@ -90,7 +91,6 @@ void monosynth_audio_module::precalculate_waves(progress_report_iface *reporter)
data[i] = (float)(i < (64 * S / 2048)? -1.f : 1.f);
waves[wave_pulse].make(bl, data);
- // XXXKF sure this is a waste of space, this will be fixed some day by better bandlimiter
for (int i = 0 ; i < S; i++)
data[i] = (float)sin(i * M_PI / HS);
waves[wave_sine].make(bl, data);
@@ -111,11 +111,11 @@ void monosynth_audio_module::precalculate_waves(progress_report_iface *reporter)
waves[wave_varistep].make(bl, data);
for (int i = 0; i < S; i++) {
- data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (-1 + fmod (i * i / 262144.0, 2.0));
+ data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (-1 + fmod (i * i * 8/ (S * S * 1.0), 2.0));
}
waves[wave_skewsaw].make(bl, data);
for (int i = 0; i < S; i++) {
- data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (fmod (i * i / 262144.0, 2.0) < 1.0 ? -1.0 : +1.0);
+ data[i] = (min(1.f, (float)(i / 64.f))) * (1.0 - i * 1.0 / S) * (fmod (i * i * 8/ (S * S * 1.0), 2.0) < 1.0 ? -1.0 : +1.0);
}
waves[wave_skewsqr].make(bl, data);
@@ -190,8 +190,9 @@ bool monosynth_audio_module::get_graph(int index, int subindex, float *data, int
float value = *params[index];
int wave = dsp::clip(dsp::fastf2i_drm(value), 0, (int)wave_count - 1);
- float offset = *params[index == par_wave1 ? par_pw1 : par_pw2];
- uint32_t shift = (int32_t)(0x78000000 * clip11(offset + (running ? last_lfov : 0) * *params[par_lfopw]));
+ uint32_t shift = index == par_wave1 ? last_pwshift1 : last_pwshift2;
+ if (!running)
+ shift = (int32_t)(0x78000000 * (*params[index == par_wave1 ? par_pw1 : par_pw2]));
int flag = (wave == wave_sqr);
shift = (flag ? S/2 : 0) + (shift >> (32 - MONOSYNTH_WAVE_BITS));
@@ -228,17 +229,17 @@ bool monosynth_audio_module::get_graph(int index, int subindex, float *data, int
void monosynth_audio_module::calculate_buffer_oscs(float lfo)
{
- int32_t shift1 = (int32_t)(0x78000000 * dsp::clip11(last_pwoffset1 + last_lfov * *params[par_lfopw]));
- int32_t shift2 = (int32_t)(0x78000000 * dsp::clip11(last_pwoffset2 + last_lfov * *params[par_lfopw]));
int flag1 = (wave1 == wave_sqr);
int flag2 = (wave2 == wave_sqr);
+ int32_t shift1 = last_pwshift1;
+ int32_t shift2 = last_pwshift2;
int32_t shift_target1 = (int32_t)(0x78000000 * dsp::clip11(*params[par_pw1] + lfo * *params[par_lfopw]));
int32_t shift_target2 = (int32_t)(0x78000000 * dsp::clip11(*params[par_pw2] + lfo * *params[par_lfopw]));
- int32_t shift_delta1 = (shift_target1 - shift1) >> step_shift;
- int32_t shift_delta2 = (shift_target2 - shift2) >> step_shift;
+ int32_t shift_delta1 = ((shift_target1 >> 1) - (last_pwshift1 >> 1)) >> (step_shift - 1);
+ int32_t shift_delta2 = ((shift_target2 >> 1) - (last_pwshift2 >> 1)) >> (step_shift - 1);
last_lfov = lfo;
- last_pwoffset1 = *params[par_pw1];
- last_pwoffset2 = *params[par_pw2];
+ last_pwshift1 = shift_target1;
+ last_pwshift2 = shift_target2;
shift1 += (flag1 << 31);
shift2 += (flag2 << 31);
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list