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 }