[SCM] calf/master: + Wavetable: implement velocity scaling, update presets
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:39:26 UTC 2013
The following commit has been merged in the master branch:
commit b2d94bbae4549075f09f7eeefb8aaf542f3e7398
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Wed Mar 4 22:11:47 2009 +0000
+ Wavetable: implement velocity scaling, update presets
diff --git a/presets.xml b/presets.xml
index dbebfd7..945f4ee 100644
--- a/presets.xml
+++ b/presets.xml
@@ -3900,12 +3900,12 @@
<param name="adsr_d" value="1274.22" />
<param name="adsr_s" value="0.39" />
<param name="adsr_r" value="50" />
- <param name="adsr_v" value="0" />
+ <param name="adsr_v" value="1" />
<param name="adsr2_a" value="1" />
<param name="adsr2_d" value="60.93" />
<param name="adsr2_s" value="0" />
<param name="adsr2_r" value="50" />
- <param name="adsr2_v" value="0" />
+ <param name="adsr2_v" value="1" />
<param name="adsr3_a" value="1" />
<param name="adsr3_d" value="350" />
<param name="adsr3_s" value="0.5" />
@@ -3927,12 +3927,12 @@
<param name="adsr_d" value="350" />
<param name="adsr_s" value="0.5" />
<param name="adsr_r" value="50" />
- <param name="adsr_v" value="0" />
+ <param name="adsr_v" value="1" />
<param name="adsr2_a" value="1" />
<param name="adsr2_d" value="350" />
<param name="adsr2_s" value="0.5" />
<param name="adsr2_r" value="50" />
- <param name="adsr2_v" value="0" />
+ <param name="adsr2_v" value="1" />
<param name="adsr3_a" value="1" />
<param name="adsr3_d" value="350" />
<param name="adsr3_s" value="0.5" />
@@ -3954,12 +3954,12 @@
<param name="adsr_d" value="1863.35" />
<param name="adsr_s" value="0.03" />
<param name="adsr_r" value="50" />
- <param name="adsr_v" value="0" />
+ <param name="adsr_v" value="0.5" />
<param name="adsr2_a" value="1" />
<param name="adsr2_d" value="350" />
<param name="adsr2_s" value="0.5" />
<param name="adsr2_r" value="50" />
- <param name="adsr2_v" value="0" />
+ <param name="adsr2_v" value="1" />
<param name="adsr3_a" value="1" />
<param name="adsr3_d" value="350" />
<param name="adsr3_s" value="0.5" />
@@ -3981,12 +3981,12 @@
<param name="adsr_d" value="350" />
<param name="adsr_s" value="0.5" />
<param name="adsr_r" value="50" />
- <param name="adsr_v" value="0" />
+ <param name="adsr_v" value="1" />
<param name="adsr2_a" value="1" />
<param name="adsr2_d" value="350" />
<param name="adsr2_s" value="0.5" />
<param name="adsr2_r" value="50" />
- <param name="adsr2_v" value="0" />
+ <param name="adsr2_v" value="1" />
<param name="adsr3_a" value="1" />
<param name="adsr3_d" value="350" />
<param name="adsr3_s" value="0.5" />
@@ -4008,12 +4008,12 @@
<param name="adsr_d" value="350" />
<param name="adsr_s" value="0.5" />
<param name="adsr_r" value="50" />
- <param name="adsr_v" value="0" />
+ <param name="adsr_v" value="1" />
<param name="adsr2_a" value="1" />
<param name="adsr2_d" value="350" />
<param name="adsr2_s" value="0.5" />
<param name="adsr2_r" value="50" />
- <param name="adsr2_v" value="0" />
+ <param name="adsr2_v" value="1" />
<param name="adsr3_a" value="1" />
<param name="adsr3_d" value="350" />
<param name="adsr3_s" value="0.5" />
@@ -4062,12 +4062,12 @@
<param name="adsr_d" value="350" />
<param name="adsr_s" value="0.5" />
<param name="adsr_r" value="50" />
- <param name="adsr_v" value="0" />
+ <param name="adsr_v" value="1" />
<param name="adsr2_a" value="1" />
<param name="adsr2_d" value="350" />
<param name="adsr2_s" value="0.5" />
<param name="adsr2_r" value="50" />
- <param name="adsr2_v" value="0" />
+ <param name="adsr2_v" value="1" />
<param name="adsr3_a" value="1" />
<param name="adsr3_d" value="350" />
<param name="adsr3_s" value="0.5" />
diff --git a/src/calf/envelope.h b/src/calf/envelope.h
index a570347..a6fd843 100644
--- a/src/calf/envelope.h
+++ b/src/calf/envelope.h
@@ -55,6 +55,8 @@ public:
/// Sustain level used for the current note (used to calculate release rate if sustain changed during release stage
/// of the current note)
double thiss;
+ /// Value from the time before advance() was called last time
+ double old_value;
adsr()
{
@@ -64,8 +66,8 @@ public:
/// Stop (reset) the envelope
inline void reset()
{
- value = 0.f;
- thiss = 0.f;
+ old_value = value = 0.0;
+ thiss = 0.0;
state = STOP;
}
/// Set the envelope parameters (updates rate member variables based on values passed)
@@ -129,6 +131,7 @@ public:
/// Calculate next envelope value
inline void advance()
{
+ old_value = value;
// XXXKF This may use a state array instead of a switch some day (at least for phases other than attack and possibly sustain)
switch(state)
{
@@ -176,6 +179,12 @@ public:
break;
}
}
+ /// Return a value between old_value (previous step) and value (current step)
+ /// @param pos between 0 and 1
+ inline double interpolate(double pos)
+ {
+ return old_value + (value - old_value) * pos;
+ }
};
};
diff --git a/src/wavetable.cpp b/src/wavetable.cpp
index e698928..3e0db89 100644
--- a/src/wavetable.cpp
+++ b/src/wavetable.cpp
@@ -82,6 +82,8 @@ void wavetable_voice::render_block()
{
typedef wavetable_metadata md;
+ const float step = 1.f / BlockSize;
+
int ospc = md::par_o2level - md::par_o1level;
int espc = md::par_eg2attack - md::par_eg1attack;
for (int j = 0; j < OscCount; j++) {
@@ -89,20 +91,22 @@ void wavetable_voice::render_block()
oscs[j].set_freq(note_to_hz(note, *params[md::par_o1transpose + j * ospc] * 100+ *params[md::par_o1detune + j * ospc]), sample_rate);
}
float s = 0.001;
+ float scl[EnvCount];
for (int j = 0; j < EnvCount; j++) {
int o = j*espc;
envs[j].set(*params[md::par_eg1attack + o] * s, *params[md::par_eg1decay + o] * s, *params[md::par_eg1sustain + o], *params[md::par_eg1release + o] * s, sample_rate / BlockSize);
+ scl[j] = dsp::lerp(1.f, velocity, *params[md::par_eg1velscl + o]);;
}
- float prev_value = envs[0].value + envs[1].value * 0.2;
for (int i = 0; i < EnvCount; i++)
envs[i].advance();
- float cur_value = envs[0].value + envs[1].value * 0.2;
+ float env_old = envs[0].old_value * scl[0] + 0.2 * envs[1].old_value * scl[1];
+ float env_new = envs[0].value * scl[0] + 0.2 * envs[1].value * scl[1];
for (int i = 0; i < BlockSize; i++) {
float value = 0.f;
-
- float env = velocity * (prev_value + (cur_value - prev_value) * i * (1.0 / BlockSize));
+
+ float env = dsp::lerp(env_old, env_new, i * step);
for (int j = 0; j < OscCount; j++) {
value += oscs[j].get(dsp::clip(fastf2i_drm((env + *params[md::par_o1offset + j * ospc]) * 127.0 * 256), 0, 127 * 256)) * *params[md::par_o1level + j * ospc];
}
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list