- _tbl_length = 5 + randi() % (int)(samplerate / 20.f);
- _wavetable = (Sample*) malloc( _tbl_length * sizeof(Sample));
- for (uint32_t i = 0 ; i < _tbl_length; ++i) {
- _wavetable[i] = .12589f * sinf(2.0 * M_PI * (float)i / (float)_tbl_length);
+ _gen_period = 5 * samplerate + randi() % (int)(samplerate * 10.f);
+ _gen_period &= ~1;
+ _gen_perio2 = 1 | (int)ceilf (_gen_period * .89f); // Volume Swell period
+ const double f_min = 20.;
+ const double f_max = samplerate * .5;
+ const double g_p2 = _gen_period * .5;
+#ifdef LINEAR_SWEEP
+ const double b = (f_max - f_min) / (2. * samplerate * g_p2);
+ const double a = f_min / samplerate;
+#else
+ const double b = log (f_max / f_min) / g_p2;
+ const double a = f_min / (b * samplerate);
+#endif
+ const uint32_t g_p2i = rint(g_p2);
+ _wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
+ for (uint32_t i = 0 ; i < g_p2i; ++i) {
+#ifdef LINEAR_SWEEP
+ const double phase = i * (a + b * i);
+#else
+ const double phase = a * exp (b * i) - a;
+#endif
+ _wavetable[i] = (float)sin (2. * M_PI * (phase - floor (phase)));
+ }
+ for (uint32_t i = g_p2i; i < _gen_period; ++i) {
+ const uint32_t j = _gen_period - i;
+#ifdef LINEAR_SWEEP
+ const double phase = j * (a + b * j);
+#else
+ const double phase = a * exp (b * j) - a;
+#endif
+ _wavetable[i] = (float)sin (2. * M_PI * (phase - floor (phase)));
+ }
+ if (_gen_type == SquareSweep) {
+ for (uint32_t i = 0 ; i < _gen_period; ++i) {
+ _wavetable[i] = _wavetable[i] < 0 ? -.40709f : .40709f;
+ }
+ }
+ else if (_gen_type == SquareSweepSwell) {
+ for (uint32_t i = 0 ; i < _gen_period; ++i) {
+ _wavetable[i] = _wavetable[i] < 0 ? -1 : 1;
+ }