BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

noise.cpp (1350B)


      1 
      2 #include <algorithm>
      3 
      4 #include "noise.hpp"
      5 #ifdef ARCH_WIN
      6 #include <ctime>
      7 #endif
      8 
      9 using namespace bogaudio::dsp;
     10 
     11 
     12 Seeds::Seeds() {
     13 #ifdef ARCH_WIN
     14   _generator.seed(time(0));
     15 #else
     16   std::random_device rd;
     17   _generator.seed(rd());
     18 #endif
     19 }
     20 
     21 unsigned int Seeds::_next() {
     22   return _generator();
     23 }
     24 
     25 Seeds& Seeds::getInstance() {
     26   static Seeds instance;
     27   return instance;
     28 }
     29 
     30 unsigned int Seeds::next() {
     31   return getInstance()._next();
     32 };
     33 
     34 
     35 void RandomWalk::setParams(float sampleRate, float change) {
     36 	assert(sampleRate > 0.0f);
     37 	assert(change >= 0.0f);
     38 	assert(change <= 1.0f);
     39 
     40 	_filter.setParams(sampleRate, std::max(2.0f, change * 0.49f * std::min(44100.0f, sampleRate)));
     41 
     42 	const float maxDamp = 0.98;
     43 	const float minDamp = 0.9999;
     44 	_damp = maxDamp + (1.0f - change)*(minDamp - maxDamp);
     45 
     46 	_biasDamp = 1.0f - change*(2.0f / sampleRate);
     47 }
     48 
     49 void RandomWalk::jump() {
     50 	float x = fabsf(_noise.next()) * (_max - _min);
     51 	x += _min;
     52 	tell(x);
     53 }
     54 
     55 void RandomWalk::tell(float v) {
     56 	assert(v >= _min && v <= _max);
     57 	_last = _bias = v;
     58 	_filter.reset();
     59 }
     60 
     61 float RandomWalk::_next() {
     62 	float delta = _noise.next();
     63 	if ((_lastOut >= _max && delta > 0.0f) || (_lastOut <= _min && delta < 0.0f)) {
     64 		delta = -delta;
     65 	}
     66 	_last = _damp*_last + delta;
     67 	_bias *= _biasDamp;
     68 	return _lastOut = std::min(std::max(_bias + _filter.next(_last), _min), _max);
     69 }