lfo_base.cpp (1985B)
1 2 #include "lfo_base.hpp" 3 #include "dsp/pitch.hpp" 4 5 void LFOBase::Smoother::setParams(float sampleRate, float frequency, float amount) { 6 assert(sampleRate > 0.0f); 7 assert(frequency > 0.0f); 8 assert(amount >= 0.0f && amount <= 1.0f); 9 if (_sampleRate != sampleRate || _frequency != frequency || _amount != amount) { 10 _sampleRate = sampleRate; 11 _frequency = frequency; 12 _amount = amount; 13 14 float millis = 1.0f / frequency; 15 millis /= 2.0f; 16 millis *= 1000.0f; 17 millis *= amount*amount * 10.0f; 18 _slewLimiter.setParams(_sampleRate, millis, 0.5f); 19 } 20 } 21 22 float LFOBase::Smoother::next(float sample) { 23 return _slewLimiter.next(sample); 24 } 25 26 float LFOBase::LFOFrequencyParamQuantity::offset() { 27 auto lfo = dynamic_cast<LFOBase*>(module); 28 return lfo->getPitchOffset(); 29 } 30 31 float LFOBase::getPitchOffset() { 32 float offset = -3.0f; 33 if (_slowMode) { 34 offset -= 8.0f; 35 } 36 else { 37 offset -= 4.0f; 38 } 39 return offset; 40 } 41 42 void LFOBase::setFrequency(Param& frequency, Input& pitch, Phasor& phasor, int c) { 43 float f = frequency.getValue(); 44 if (pitch.isConnected()) { 45 f += pitch.getVoltage(c); 46 } 47 f += getPitchOffset(); 48 49 f = cvToFrequency(f); 50 if (f > 2000.0f) { 51 f = 2000.0f; 52 } 53 phasor.setFrequency(f); 54 } 55 56 #define OFFSET_SCALE "offset_scale" 57 58 json_t* LFOBase::saveToJson(json_t* root) { 59 json_object_set_new(root, OFFSET_SCALE, json_real(_offsetScale)); 60 return root; 61 } 62 63 void LFOBase::loadFromJson(json_t* root) { 64 json_t* os = json_object_get(root, OFFSET_SCALE); 65 if (os) { 66 _offsetScale = clamp(json_real_value(os), 1.0f, 2.0f); 67 } 68 } 69 70 71 void LFOBaseModuleWidget::contextMenu(Menu* menu) { 72 auto m = dynamic_cast<LFOBase*>(module); 73 assert(m); 74 75 OptionsMenuItem* o = new OptionsMenuItem("Offset range"); 76 o->addItem(OptionMenuItem("+/-5V", [m]() { return (int)m->_offsetScale == 1; }, [m]() { m->_offsetScale = 1.0f; })); 77 o->addItem(OptionMenuItem("+/-10V", [m]() { return (int)m->_offsetScale == 2; }, [m]() { m->_offsetScale = 2.0f; })); 78 OptionsMenuItem::addToMenu(o, menu); 79 }