+
+double Reverb::gauss(double sigma, double center, double x)
+{
+ if( EQUIV(sigma, 0) ) sigma = 0.01;
+
+ double result = 1.0 / sqrt(2 * M_PI * sigma * sigma) *
+ exp(-(x - center) * (x - center) / (2 * sigma * sigma));
+ return result;
+}
+
+void Reverb::calculate_envelope()
+{
+// assume the window size changed
+ delete [] envelope;
+ int window_size2 = config.window_size/2;
+ envelope = new double[window_size2];
+
+ int max_freq = Freq::tofreq_f(TOTALFREQS-1);
+ int nyquist = PluginAClient::project_sample_rate/2;
+ int low = config.low;
+ int high = config.high;
+
+// limit the frequencies
+ if( high >= max_freq ) high = nyquist;
+ if( low > high ) low = high;
+
+// frequency slots of the edge
+ double edge = (1.0 - config.q) * TOTALFREQS/2;
+ double low_slot = Freq::fromfreq_f(low);
+ double high_slot = Freq::fromfreq_f(high);
+ for( int i = 0; i < window_size2; i++ ) {
+ double freq = i * nyquist / window_size2;
+ double slot = Freq::fromfreq_f(freq);
+
+// printf("Reverb::calculate_envelope %d i=%d freq=%f slot=%f slot1=%f\n",
+// __LINE__, i, freq, slot, low_slot - edge);
+ if( slot < low_slot - edge ) {
+ envelope[i] = 0.0;
+ }
+ else if( slot < low_slot ) {
+#ifndef LOG_CROSSOVER
+ envelope[i] = 1.0 - (low_slot - slot) / edge;
+#else
+ envelope[i] = DB::fromdb((low_slot - slot) * INFINITYGAIN / edge);
+#endif
+ }
+ else if( slot < high_slot ) {
+ envelope[i] = 1.0;
+ }
+ else if( slot < high_slot + edge ) {
+#ifndef LOG_CROSSOVER
+ envelope[i] = 1.0 - (slot - high_slot) / edge;
+#else
+ envelope[i] = DB::fromdb((slot - high_slot) * INFINITYGAIN / edge);
+#endif
+ }
+ else {
+ envelope[i] = 0.0;
+ }
+ }