[SCM] calf/master: + Monosynth: added pulse width offset (not safe for modulation yet)
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:39:28 UTC 2013
The following commit has been merged in the master branch:
commit 19f4574bfc5307d6c9b184a1a5d8ef13e399e284
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Sat Mar 21 23:24:48 2009 +0000
+ Monosynth: added pulse width offset (not safe for modulation yet)
diff --git a/gui/gui-monosynth.xml b/gui/gui-monosynth.xml
index 1296a25..b85c12c 100644
--- a/gui/gui-monosynth.xml
+++ b/gui/gui-monosynth.xml
@@ -1,197 +1,213 @@
<?xml version="1.0"?>
<vbox border="10">
- <hbox spacing="10">
- <frame label="Oscillators">
- <vbox border="10" spacing="10">
- <table rows="2" cols="2">
- <label attach-x="0" attach-y="0" param="o1_wave"/>
- <label attach-x="1" attach-y="0" param="o2_wave"/>
- <combo attach-x="0" attach-y="1" param="o1_wave"/>
- <combo attach-x="1" attach-y="1" param="o2_wave"/>
- </table>
- <hbox>
- <if cond="directlink">
- <line-graph param="o1_wave" refresh="1"/>
- </if>
- <vbox>
- <label param="o12_mix"/>
- <hscale param="o12_mix" position="bottom"/>
- </vbox>
- <if cond="directlink">
- <line-graph param="o2_wave" refresh="1"/>
- </if>
- </hbox>
- <hbox>
- <vbox>
- <label param="o12_detune"/>
- <knob param="o12_detune" expand="0" fill="0"/>
- <value param="o12_detune"/>
- </vbox>
- <align>
- <vbox>
- <label param="phase_mode"/>
- <combo param="phase_mode"/>
- </vbox>
- </align>
- <vbox>
- <label param="o2_xpose"/>
- <knob type="1" param="o2_xpose"/>
- <value param="o2_xpose"/>
- </vbox>
- </hbox>
- </vbox>
- </frame>
- <frame label="Filter">
- <vbox border="10">
- <align>
- <hbox>
- <label param="filter"/>
- <combo param="filter"/>
- <if cond="directlink">
- <line-graph param="filter" refresh="1" width="80" height="60"/>
- </if>
- </hbox>
- </align>
- <hbox>
- <vbox>
- <label param="cutoff"/>
- <knob param="cutoff"/>
- <value param="cutoff"/>
- </vbox>
- <vbox>
- <label param="res"/>
- <knob param="res"/>
- <value param="res"/>
- </vbox>
- <vbox>
- <label param="filter_sep"/>
- <knob type="1" param="filter_sep"/>
- <value param="filter_sep"/>
- </vbox>
- <vbox>
- <label param="key_follow"/>
- <knob param="key_follow"/>
- <value param="key_follow"/>
- </vbox>
- </hbox>
- </vbox>
- </frame>
- </hbox>
- <frame label="LFO">
- <hbox spacing="10">
- <vbox>
- <label param="lfo_rate"/>
- <knob param="lfo_rate"/>
- <value param="lfo_rate"/>
- </vbox>
- <vbox>
- <label param="lfo_delay"/>
- <knob param="lfo_delay"/>
- <value param="lfo_delay"/>
- </vbox>
+ <frame label="Global">
+ <hbox border="10" spacing="10">
<vbox>
- <label param="lfo2filter"/>
- <knob param="lfo2filter" type="1"/>
- <value param="lfo2filter"/>
+ <label param="pbend_range"/>
+ <knob param="pbend_range"/>
+ <value param="pbend_range"/>
</vbox>
<vbox>
- <label param="lfo2pitch"/>
- <knob param="lfo2pitch"/>
- <value param="lfo2pitch"/>
+ <label param="legato" expand="0"/>
+ <combo param="legato" expand="0" fill="0"/>
+ <label />
</vbox>
<vbox>
- <label param="lfo2pw"/>
- <knob param="lfo2pw"/>
- <value param="lfo2pw"/>
+ <label param="portamento"/>
+ <knob param="portamento"/>
+ <value param="portamento"/>
</vbox>
<vbox>
- <label param="mwhl2lfo"/>
- <knob param="mwhl2lfo"/>
- <value param="mwhl2lfo"/>
+ <label param="master"/>
+ <knob param="master"/>
+ <value param="master"/>
</vbox>
</hbox>
</frame>
- <hbox spacing="10">
- <frame label="Envelope">
- <vbox border="10" spacing="10">
- <hbox>
- <vbox>
- <label param="adsr_a"/>
- <knob param="adsr_a"/>
- <value param="adsr_a"/>
- </vbox>
- <vbox>
- <label param="adsr_d"/>
- <knob param="adsr_d"/>
- <value param="adsr_d"/>
- </vbox>
- <vbox>
- <label param="adsr_s"/>
- <knob param="adsr_s"/>
- <value param="adsr_s"/>
- </vbox>
- <vbox>
- <label param="adsr_r"/>
- <knob param="adsr_r"/>
- <value param="adsr_r"/>
- </vbox>
- </hbox>
- <hbox>
- <vbox>
- <label param="env2cutoff"/>
- <knob type="1" param="env2cutoff"/>
- <value param="env2cutoff"/>
- </vbox>
- <vbox>
- <label param="env2res"/>
- <knob param="env2res"/>
- <value param="env2res"/>
- </vbox>
- <vbox>
- <label param="env2amp"/>
- <knob param="env2amp"/>
- <value param="env2amp"/>
- </vbox>
- </hbox>
- </vbox>
- </frame>
- <frame label="Settings">
- <vbox border="10" spacing="10">
- <hbox>
+ <notebook>
+ <vbox border="10" page="Audio path">
+ <frame label="Oscillators">
+ <vbox border="10" spacing="10">
+ <table rows="3" cols="4">
+ <label attach-x="0" attach-y="0" param="o1_wave"/>
+ <label attach-x="1" attach-y="0" param="o1_pw"/>
+ <label attach-x="2" attach-y="0" param="o2_pw"/>
+ <label attach-x="3" attach-y="0" param="o2_wave"/>
+ <combo attach-x="0" attach-y="1" param="o1_wave"/>
+ <knob attach-x="1" attach-y="1" param="o1_pw"/>
+ <knob attach-x="2" attach-y="1" param="o2_pw"/>
+ <combo attach-x="3" attach-y="1" param="o2_wave"/>
+ <value attach-x="1" attach-y="2" param="o1_pw"/>
+ <value attach-x="2" attach-y="2" param="o2_pw"/>
+ </table>
+ <hbox>
+ <if cond="directlink">
+ <line-graph param="o1_wave" refresh="1"/>
+ </if>
+ <vbox>
+ <label param="o12_mix"/>
+ <hscale param="o12_mix" position="bottom"/>
+ </vbox>
+ <if cond="directlink">
+ <line-graph param="o2_wave" refresh="1"/>
+ </if>
+ </hbox>
+ <hbox>
+ <vbox>
+ <label param="o12_detune"/>
+ <knob param="o12_detune" expand="0" fill="0"/>
+ <value param="o12_detune"/>
+ </vbox>
+ <align>
+ <vbox>
+ <label param="phase_mode"/>
+ <combo param="phase_mode"/>
+ </vbox>
+ </align>
+ <vbox>
+ <label param="o2_xpose"/>
+ <knob type="1" param="o2_xpose"/>
+ <value param="o2_xpose"/>
+ </vbox>
+ </hbox>
+ </vbox>
+ </frame>
+ <frame label="Filter">
+ <vbox border="10">
+ <align>
+ <hbox>
+ <label param="filter"/>
+ <combo param="filter"/>
+ <if cond="directlink">
+ <line-graph param="filter" refresh="1" width="80" height="60"/>
+ </if>
+ </hbox>
+ </align>
+ <hbox>
+ <vbox>
+ <label param="cutoff"/>
+ <knob param="cutoff"/>
+ <value param="cutoff"/>
+ </vbox>
+ <vbox>
+ <label param="res"/>
+ <knob param="res"/>
+ <value param="res"/>
+ </vbox>
+ <vbox>
+ <label param="filter_sep"/>
+ <knob type="1" param="filter_sep"/>
+ <value param="filter_sep"/>
+ </vbox>
+ <vbox>
+ <label param="key_follow"/>
+ <knob param="key_follow"/>
+ <value param="key_follow"/>
+ </vbox>
+ </hbox>
+ </vbox>
+ </frame>
+ </vbox>
+
+ <vbox border="10" page="Modulation">
+ <frame label="LFO">
+ <hbox spacing="10">
<vbox>
- <label param="pbend_range"/>
- <knob param="pbend_range"/>
- <value param="pbend_range"/>
+ <label param="lfo_rate"/>
+ <knob param="lfo_rate"/>
+ <value param="lfo_rate"/>
</vbox>
<vbox>
- <label param="legato" expand="0"/>
- <combo param="legato" expand="0" fill="0"/>
- <label />
+ <label param="lfo_delay"/>
+ <knob param="lfo_delay"/>
+ <value param="lfo_delay"/>
</vbox>
<vbox>
- <label param="master"/>
- <knob param="master"/>
- <value param="master"/>
+ <label text="To Cutoff"/>
+ <knob param="lfo2filter" type="1"/>
+ <value param="lfo2filter"/>
</vbox>
- </hbox>
- <hbox>
<vbox>
- <label param="portamento"/>
- <knob param="portamento"/>
- <value param="portamento"/>
+ <label text="To Pitch"/>
+ <knob param="lfo2pitch"/>
+ <value param="lfo2pitch"/>
</vbox>
<vbox>
- <label param="vel2filter"/>
- <knob param="vel2filter"/>
- <value param="vel2filter"/>
+ <label text="To Osc PW"/>
+ <knob param="lfo2pw"/>
+ <value param="lfo2pw"/>
</vbox>
<vbox>
- <label param="vel2amp"/>
- <knob param="vel2amp"/>
- <value param="vel2amp"/>
+ <label param="mwhl2lfo"/>
+ <knob param="mwhl2lfo"/>
+ <value param="mwhl2lfo"/>
</vbox>
</hbox>
- </vbox>
- </frame>
- </hbox>
+ </frame>
+ <hbox spacing="10">
+ <frame label="Note velocity">
+ <hbox>
+ <vbox>
+ <label text="To Cutoff"/>
+ <knob param="vel2filter"/>
+ <value param="vel2filter"/>
+ </vbox>
+ <vbox>
+ <label text="To Amp"/>
+ <knob param="vel2amp"/>
+ <value param="vel2amp"/>
+ </vbox>
+ </hbox>
+ </frame>
+ <frame label="Envelope">
+ <vbox border="10" spacing="10">
+ <hbox>
+ <vbox>
+ <label param="adsr_a"/>
+ <knob param="adsr_a"/>
+ <value param="adsr_a"/>
+ </vbox>
+ <vbox>
+ <label param="adsr_d"/>
+ <knob param="adsr_d"/>
+ <value param="adsr_d"/>
+ </vbox>
+ <vbox>
+ <label param="adsr_s"/>
+ <knob param="adsr_s"/>
+ <value param="adsr_s"/>
+ </vbox>
+ <vbox>
+ <label param="adsr_f"/>
+ <knob param="adsr_f"/>
+ <value param="adsr_f"/>
+ </vbox>
+ <vbox>
+ <label param="adsr_r"/>
+ <knob param="adsr_r"/>
+ <value param="adsr_r"/>
+ </vbox>
+ </hbox>
+ <hbox>
+ <vbox>
+ <label text="To Cutoff"/>
+ <knob type="1" param="env2cutoff"/>
+ <value param="env2cutoff"/>
+ </vbox>
+ <vbox>
+ <label text="To Res"/>
+ <knob param="env2res"/>
+ <value param="env2res"/>
+ </vbox>
+ <vbox>
+ <label text="To Amp"/>
+ <knob param="env2amp"/>
+ <value param="env2amp"/>
+ </vbox>
+ </hbox>
+ </vbox>
+ </frame>
+ </hbox>
+ </vbox>
+ </notebook>
</vbox>
diff --git a/src/calf/metadata.h b/src/calf/metadata.h
index 733ce5e..0398730 100644
--- a/src/calf/metadata.h
+++ b/src/calf/metadata.h
@@ -97,12 +97,12 @@ struct monosynth_metadata: public plugin_metadata<monosynth_metadata>
{
enum { wave_saw, wave_sqr, wave_pulse, wave_sine, wave_triangle, wave_varistep, wave_skewsaw, wave_skewsqr, wave_test1, wave_test2, wave_test3, wave_test4, wave_test5, wave_test6, wave_test7, wave_test8, wave_count };
enum { flt_lp12, flt_lp24, flt_2lp12, flt_hp12, flt_lpbr, flt_hpbr, flt_bp6, flt_2bp6 };
- enum { par_wave1, par_wave2, 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_release,
+ 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,
param_count };
enum { in_count = 0, out_count = 2, support_midi = true, require_midi = true, rt_capable = true };
- enum { step_size = 64 };
+ enum { step_size = 64, step_shift = 6 };
PLUGIN_NAME_ID_LABEL("monosynth", "monosynth", "Monosynth")
};
diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index 0bfecb5..bae680f 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -55,7 +55,7 @@ public:
dsp::onepole<float> phaseshifter;
dsp::biquad_d1_lerp<float> filter;
dsp::biquad_d1_lerp<float> filter2;
- int wave1, wave2, filter_type, last_filter_type;
+ int wave1, wave2, prev_wave1, prev_wave2, 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;
@@ -93,7 +93,7 @@ public:
/// Update variables from control ports.
void params_changed() {
float sf = 0.001f;
- envelope.set(*params[par_attack] * sf, *params[par_decay] * sf, std::min(0.999f, *params[par_sustain]), *params[par_release] * sf, srate / step_size);
+ envelope.set(*params[par_attack] * sf, *params[par_decay] * sf, std::min(0.999f, *params[par_sustain]), *params[par_release] * sf, srate / step_size, *params[par_fade] * sf);
filter_type = dsp::fastf2i_drm(*params[par_filtertype]);
decay_factor = odcr * 1000.0 / *params[par_decay];
separation = pow(2.0, *params[par_cutoffsep] / 1200.0);
@@ -105,6 +105,8 @@ public:
legato = dsp::fastf2i_drm(*params[par_legato]);
master.set_inertia(*params[par_master]);
set_frequency();
+ if (wave1 != prev_wave1 || wave2 != prev_wave2)
+ lookup_waveforms();
}
void activate();
void deactivate();
@@ -112,6 +114,8 @@ public:
{
precalculate_waves(progress_report);
}
+ /// Set waveform addresses for oscillators
+ void lookup_waveforms();
/// Run oscillators
void calculate_buffer_oscs(float lfo);
/// Run two filters in series to produce mono output samples.
diff --git a/src/modules.cpp b/src/modules.cpp
index f297b65..41c06b4 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -260,6 +260,10 @@ CALF_PLUGIN_INFO(monosynth) = { 0x8480, "Monosynth", "Calf Monosynth", "Krzyszto
CALF_PORT_PROPS(monosynth) = {
{ monosynth_metadata::wave_saw, 0, monosynth_metadata::wave_count - 1, 1, PF_ENUM | PF_CTL_COMBO | PF_PROP_GRAPH, monosynth_waveform_names, "o1_wave", "Osc1 Wave" },
{ monosynth_metadata::wave_sqr, 0, monosynth_metadata::wave_count - 1, 1, PF_ENUM | PF_CTL_COMBO | PF_PROP_GRAPH, monosynth_waveform_names, "o2_wave", "Osc2 Wave" },
+
+ { 0, -1, 1, 0.1, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "o1_pw", "Osc1 PW" },
+ { 0, -1, 1, 0.1, PF_FLOAT | PF_SCALE_PERC | PF_CTL_KNOB, NULL, "o2_pw", "Osc2 PW" },
+
{ 10, 0, 100, 0, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_CENTS, NULL, "o12_detune", "O1<>2 Detune" },
{ 12, -24, 24, 0, PF_INT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_SEMITONES, NULL, "o2_xpose", "Osc 2 transpose" },
{ 0, 0, 5, 0, PF_ENUM | PF_CTL_COMBO, monosynth_mode_names, "phase_mode", "Phase mode" },
@@ -275,6 +279,7 @@ CALF_PORT_PROPS(monosynth) = {
{ 1, 1,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_a", "Attack" },
{ 350, 10,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_d", "Decay" },
{ 0.5, 0, 1, 0, PF_FLOAT | PF_SCALE_PERC, NULL, "adsr_s", "Sustain" },
+ { 0, -10000,10000, 21, PF_FLOAT | PF_SCALE_LINEAR | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_f", "Fade" },
{ 50, 10,20000, 0, PF_FLOAT | PF_SCALE_LOG | PF_CTL_KNOB | PF_UNIT_MSEC, NULL, "adsr_r", "Release" },
{ 0, 0, 2, 0, PF_FLOAT | PF_SCALE_PERC, NULL, "key_follow", "Key Follow" },
diff --git a/src/monosynth.cpp b/src/monosynth.cpp
index 15cfd4c..a878719 100644
--- a/src/monosynth.cpp
+++ b/src/monosynth.cpp
@@ -190,24 +190,17 @@ 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);
- uint32_t shift = (int32_t)(0x78000000 * last_lfov * *params[par_lfopw]);
+ 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]));
int flag = (wave == wave_sqr);
-
- if (!running) {
- float *waveform = waves[wave].original;
- for (int i = 0; i < points; i++)
- data[i] = waveform[i * S / points];
- }
- else
- {
- shift = (flag ? S/2 : 0) + (shift >> (32 - MONOSYNTH_WAVE_BITS));
- int sign = flag ? -1 : 1;
- if (wave == wave_sqr)
- wave = wave_saw;
- float *waveform = waves[wave].original;
- for (int i = 0; i < points; i++)
- data[i] = (sign * waveform[i * S / points] + waveform[(i * S / points + shift) & (S - 1)]) / (sign == -1 ? 1 : 2);
- }
+
+ shift = (flag ? S/2 : 0) + (shift >> (32 - MONOSYNTH_WAVE_BITS));
+ int sign = flag ? -1 : 1;
+ if (wave == wave_sqr)
+ wave = wave_saw;
+ float *waveform = waves[wave].original;
+ for (int i = 0; i < points; i++)
+ data[i] = (sign * waveform[i * S / points] + waveform[(i * S / points + shift) & (S - 1)]) / (sign == -1 ? 1 : 2);
return true;
}
if (index == par_filtertype) {
@@ -235,13 +228,17 @@ bool monosynth_audio_module::get_graph(int index, int subindex, float *data, int
void monosynth_audio_module::calculate_buffer_oscs(float lfo)
{
- uint32_t shift = (int32_t)(0x78000000 * last_lfov * *params[par_lfopw]);
+ int32_t shift1 = (int32_t)(0x78000000 * dsp::clip11(*params[par_pw1] + last_lfov * *params[par_lfopw]));
+ int32_t shift2 = (int32_t)(0x78000000 * dsp::clip11(*params[par_pw2] + last_lfov * *params[par_lfopw]));
int flag1 = (wave1 == wave_sqr);
int flag2 = (wave2 == wave_sqr);
- uint32_t shift_delta = (int32_t)(0x78000000 * (lfo - last_lfov) * *params[par_lfopw] * (1.0 / step_size));
+ 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;
- uint32_t shift1 = (flag1 << 31) + shift;
- uint32_t shift2 = (flag2 << 31) + shift;
+ shift1 += (flag1 << 31);
+ shift2 += (flag2 << 31);
float mix1 = 1 - 2 * flag1, mix2 = 1 - 2 * flag2;
for (uint32_t i = 0; i < step_size; i++)
@@ -250,8 +247,8 @@ void monosynth_audio_module::calculate_buffer_oscs(float lfo)
float osc2val = osc2.get_phaseshifted(shift2, mix2);
float wave = osc1val + (osc2val - osc1val) * xfade;
buffer[i] = wave;
- shift1 += shift_delta;
- shift2 += shift_delta;
+ shift1 += shift_delta1;
+ shift2 += shift_delta2;
}
last_lfov = lfo;
}
@@ -296,6 +293,16 @@ void monosynth_audio_module::calculate_buffer_stereo()
}
}
+void monosynth_audio_module::lookup_waveforms()
+{
+ osc1.waveform = waves[wave1 == wave_sqr ? wave_saw : wave1].get_level(osc1.phasedelta);
+ osc2.waveform = waves[wave2 == wave_sqr ? wave_saw : wave2].get_level(osc2.phasedelta);
+ if (!osc1.waveform) osc1.waveform = silence;
+ if (!osc2.waveform) osc2.waveform = silence;
+ prev_wave1 = wave1;
+ prev_wave2 = wave2;
+}
+
void monosynth_audio_module::delayed_note_on()
{
force_fadeout = false;
@@ -306,10 +313,7 @@ void monosynth_audio_module::delayed_note_on()
ampctl = 1.0 + (queue_vel - 1.0) * *params[par_vel2amp];
fltctl = 1.0 + (queue_vel - 1.0) * *params[par_vel2filter];
set_frequency();
- osc1.waveform = waves[wave1 == wave_sqr ? wave_saw : wave1].get_level(osc1.phasedelta);
- osc2.waveform = waves[wave2 == wave_sqr ? wave_saw : wave2].get_level(osc2.phasedelta);
- if (!osc1.waveform) osc1.waveform = silence;
- if (!osc2.waveform) osc2.waveform = silence;
+ lookup_waveforms();
lfo_clock = 0.f;
if (!running)
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list