1 #include "DspUtilities.h"
2 #include "SurgeStorage.h"
3 
correlated_noise(float lastval,float correlation)4 float correlated_noise(float lastval, float correlation)
5 {
6     float wf = correlation * 0.9;
7     float wfabs = fabs(wf);
8     float rand11 = (((float)rand() / (float)RAND_MAX) * 2.f - 1.f);
9     float randt = rand11 * (1 - wfabs) - wf * lastval;
10     return randt;
11 }
12 
correlated_noise_mk2(float & lastval,float correlation)13 float correlated_noise_mk2(float &lastval, float correlation)
14 {
15     float wf = correlation * 0.9;
16     float wfabs = fabs(wf);
17     float m = 1.f / sqrt(1.f - wfabs);
18     float rand11 = (((float)rand() / (float)RAND_MAX) * 2.f - 1.f);
19     lastval = rand11 * (1 - wfabs) - wf * lastval;
20     return lastval * m;
21 }
22 
drift_noise(float & lastval)23 float drift_noise(float &lastval)
24 {
25     const float filter = 0.00001f;
26     const float m = 1.f / sqrt(filter);
27     //__m128 mvec = _mm_rsqrt_ss(_mm_load_ss(&filter));
28     //_mm_store_ss(&m,mvec);
29 
30     float rand11 = (((float)rand() / (float)RAND_MAX) * 2.f - 1.f);
31     lastval = lastval * (1.f - filter) + rand11 * filter;
32     return lastval * m;
33 }
34 
correlated_noise_o2(float lastval,float & lastval2,float correlation)35 float correlated_noise_o2(float lastval, float &lastval2, float correlation)
36 {
37     float wf = correlation * 0.9;
38     float wfabs = fabs(wf);
39     float rand11 = (((float)rand() / (float)RAND_MAX) * 2.f - 1.f);
40     float randt = rand11 * (1 - wfabs) - wf * lastval2;
41     lastval2 = randt;
42     randt = lastval2 * (1 - wfabs) - wf * lastval;
43     return randt;
44 }
45 
correlated_noise_o2mk2(float & lastval,float & lastval2,float correlation)46 float correlated_noise_o2mk2(float &lastval, float &lastval2, float correlation)
47 {
48     float wf = correlation;
49     float wfabs = fabs(wf) * 0.8f;
50     // wfabs = 1.f - (1.f-wfabs)*(1.f-wfabs);
51     wfabs = (2.f * wfabs - wfabs * wfabs);
52     if (wf > 0.f)
53         wf = wfabs;
54     else
55         wf = -wfabs;
56 #if MAC
57     float m = 1.f / sqrt(1.f - wfabs);
58 #else
59     float m = 1.f - wfabs;
60     // float m = 1.f/sqrt(1.f-wfabs);
61     __m128 m1 = _mm_rsqrt_ss(_mm_load_ss(&m));
62     _mm_store_ss(&m, m1);
63     // if (wf>0.f) m *= 1 + wf*8;
64 #endif
65     float rand11 = (((float)rand() / (float)RAND_MAX) * 2.f - 1.f);
66     lastval2 = rand11 * (1 - wfabs) - wf * lastval2;
67     lastval = lastval2 * (1 - wfabs) - wf * lastval;
68     return lastval * m;
69 }
70 
correlated_noise_o2mk2_suppliedrng(float & lastval,float & lastval2,float correlation,std::function<float ()> & urng)71 float correlated_noise_o2mk2_suppliedrng(float &lastval, float &lastval2, float correlation,
72                                          std::function<float()> &urng)
73 {
74     float wf = correlation;
75     float wfabs = fabs(wf) * 0.8f;
76     // wfabs = 1.f - (1.f-wfabs)*(1.f-wfabs);
77     wfabs = (2.f * wfabs - wfabs * wfabs);
78     if (wf > 0.f)
79         wf = wfabs;
80     else
81         wf = -wfabs;
82 #if MAC
83     float m = 1.f / sqrt(1.f - wfabs);
84 #else
85     float m = 1.f - wfabs;
86     // float m = 1.f/sqrt(1.f-wfabs);
87     __m128 m1 = _mm_rsqrt_ss(_mm_load_ss(&m));
88     _mm_store_ss(&m, m1);
89     // if (wf>0.f) m *= 1 + wf*8;
90 #endif
91     float rand11 = urng();
92     lastval2 = rand11 * (1 - wfabs) - wf * lastval2;
93     lastval = lastval2 * (1 - wfabs) - wf * lastval;
94     return lastval * m;
95 }
96 
correlated_noise_o2mk2_storagerng(float & lastval,float & lastval2,float correlation,SurgeStorage * s)97 float correlated_noise_o2mk2_storagerng(float &lastval, float &lastval2, float correlation,
98                                         SurgeStorage *s)
99 {
100     float wf = correlation;
101     float wfabs = fabs(wf) * 0.8f;
102     // wfabs = 1.f - (1.f-wfabs)*(1.f-wfabs);
103     wfabs = (2.f * wfabs - wfabs * wfabs);
104     if (wf > 0.f)
105         wf = wfabs;
106     else
107         wf = -wfabs;
108 #if MAC
109     float m = 1.f / sqrt(1.f - wfabs);
110 #else
111     float m = 1.f - wfabs;
112     // float m = 1.f/sqrt(1.f-wfabs);
113     __m128 m1 = _mm_rsqrt_ss(_mm_load_ss(&m));
114     _mm_store_ss(&m, m1);
115     // if (wf>0.f) m *= 1 + wf*8;
116 #endif
117     float rand11 = s->rand_pm1();
118     lastval2 = rand11 * (1 - wfabs) - wf * lastval2;
119     lastval = lastval2 * (1 - wfabs) - wf * lastval;
120     return lastval * m;
121 }
122