[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