[SCM] calf/master: + Monosynth, Organ: improve oscillator quality by removing a potential Bug Of The Decade
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:39:19 UTC 2013
The following commit has been merged in the master branch:
commit 93b16cd32c1de575b7fc40b0cd45a21160c22d99
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Sat Feb 7 01:11:20 2009 +0000
+ Monosynth, Organ: improve oscillator quality by removing a potential Bug Of The Decade
diff --git a/src/calf/osc.h b/src/calf/osc.h
index de47ef2..e641622 100644
--- a/src/calf/osc.h
+++ b/src/calf/osc.h
@@ -223,6 +223,13 @@ struct waveform_family: public std::map<uint32_t, float *>
}
};
+#if 0
+// cubic interpolation
+static inline float cerp(float pm1, float p0, float p1, float p2, float t)
+{
+ return (-t*(t-1)*(t-2) * pm1 + 3*(t+1)*(t-1)*(t-2) * p0 - 3*(t+1)*t*(t-2) * p1 + (t+1)*t*(t-1) * p2) * (1.0 / 6.0);
+}
+#endif
/**
* Simple table-based lerping oscillator. Uses waveform of size 2^SIZE_BITS.
* Combine with waveform_family if bandlimited waveforms are needed. Because
@@ -232,12 +239,12 @@ struct waveform_family: public std::map<uint32_t, float *>
template<int SIZE_BITS>
struct waveform_oscillator: public simple_oscillator
{
- enum { SIZE = 1 << SIZE_BITS, MASK = SIZE - 1 };
+ enum { SIZE = 1 << SIZE_BITS, MASK = SIZE - 1, SCALE = 1 << (32 - SIZE_BITS) };
float *waveform;
inline float get()
{
uint32_t wpos = phase >> (32 - SIZE_BITS);
- float value = dsp::lerp(waveform[wpos], waveform[(wpos + 1) & MASK], (phase & (SIZE - 1)) * (1.0f / SIZE));
+ float value = dsp::lerp(waveform[wpos], waveform[(wpos + 1) & MASK], (phase & (SCALE - 1)) * (1.0f / SCALE));
phase += phasedelta;
return value;
}
@@ -245,9 +252,9 @@ struct waveform_oscillator: public simple_oscillator
inline float get_phaseshifted(uint32_t shift, float mix)
{
uint32_t wpos = phase >> (32 - SIZE_BITS);
- float value1 = dsp::lerp(waveform[wpos], waveform[(wpos + 1) & MASK], (phase & (SIZE - 1)) * (1.0f / SIZE));
+ float value1 = dsp::lerp(waveform[wpos], waveform[(wpos + 1) & MASK], (phase & (SCALE - 1)) * (1.0f / SCALE));
wpos = (phase + shift) >> (32 - SIZE_BITS);
- float value2 = dsp::lerp(waveform[wpos], waveform[(wpos + 1) & MASK], ((phase + shift) & (SIZE - 1)) * (1.0f / SIZE));
+ float value2 = dsp::lerp(waveform[wpos], waveform[(wpos + 1) & MASK], ((phase + shift) & (SCALE - 1)) * (1.0f / SCALE));
float value = value1 + mix * value2;
phase += phasedelta;
return value;
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list