BogaudioModules

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

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 }