BogaudioModules

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

commit 527b3ad2dd47aced06ad4beec69772f693e5e12f
parent 1142112a3c28379b15c474ded4788ec1f06057b8
Author: Matt Demanett <matt@demanett.net>
Date:   Sat, 21 Apr 2018 22:34:04 -0400

FM-OP: fix feeback amount; make output level exponential as function of knob and evelope; fix envelope time knobs; make envelope linear.

Diffstat:
Msrc/FMOp.cpp | 19++++++++++---------
Msrc/FMOp.hpp | 5++++-
2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/FMOp.cpp b/src/FMOp.cpp @@ -71,10 +71,10 @@ void FMOp::step() { if (inputs[SUSTAIN_INPUT].active) { sustain *= clamp(inputs[SUSTAIN_INPUT].value / 10.0f, 0.0f, 1.0f); } - _envelope.setAttack(params[ATTACK_PARAM].value); - _envelope.setDecay(params[DECAY_PARAM].value); + _envelope.setAttack(powf(params[ATTACK_PARAM].value, 2.0f) * 10.f); + _envelope.setDecay(powf(params[DECAY_PARAM].value, 2.0f) * 10.f); _envelope.setSustain(sustain); - _envelope.setRelease(params[RELEASE_PARAM].value); + _envelope.setRelease(powf(params[RELEASE_PARAM].value, 2.0f) * 10.f); } _feedback = params[FEEDBACK_PARAM].value; @@ -107,7 +107,7 @@ void FMOp::step() { float offset = 0.0f; if (feedback > 0.001f) { - offset = feedback * 2.0f * _feedbackDelayedSample; + offset = feedback * _feedbackDelayedSample; } if (inputs[FM_INPUT].active) { offset += inputs[FM_INPUT].value * _depth * 2.0f; @@ -116,11 +116,12 @@ void FMOp::step() { _phasor.advancePhase(); _buffer[i] = _sineTable.nextFromPhasor(_phasor, Phasor::radiansToPhase(offset)); } - float out = _decimator.next(_buffer); - out *= _level; + float out = _level; if (_levelEnvelopeOn) { out *= envelope; } + out *= out; + out *= _decimator.next(_buffer); outputs[AUDIO_OUTPUT].value = _feedbackDelayedSample = amplitude * out; } @@ -169,10 +170,10 @@ struct FMOpWidget : ModuleWidget { addParam(ParamWidget::create<Knob38>(ratioParamPosition, module, FMOp::RATIO_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create<Knob16>(fineParamPosition, module, FMOp::FINE_PARAM, -1.0, 1.0, 0.0)); - addParam(ParamWidget::create<Knob26>(attackParamPosition, module, FMOp::ATTACK_PARAM, 0.0, 1.0, 0.1)); - addParam(ParamWidget::create<Knob26>(decayParamPosition, module, FMOp::DECAY_PARAM, 0.0, 1.0, 0.1)); + addParam(ParamWidget::create<Knob26>(attackParamPosition, module, FMOp::ATTACK_PARAM, 0.0, 1.0, 0.12)); + addParam(ParamWidget::create<Knob26>(decayParamPosition, module, FMOp::DECAY_PARAM, 0.0, 1.0, 0.31623)); addParam(ParamWidget::create<Knob26>(sustainParamPosition, module, FMOp::SUSTAIN_PARAM, 0.0, 1.0, 1.0)); - addParam(ParamWidget::create<Knob26>(releaseParamPosition, module, FMOp::RELEASE_PARAM, 0.0, 1.0, 0.3)); + addParam(ParamWidget::create<Knob26>(releaseParamPosition, module, FMOp::RELEASE_PARAM, 0.0, 1.0, 0.31623)); addParam(ParamWidget::create<Knob26>(depthParamPosition, module, FMOp::DEPTH_PARAM, 0.0, 1.0, 0.0)); addParam(ParamWidget::create<Knob26>(feedbackParamPosition, module, FMOp::FEEDBACK_PARAM, 0.0, 1.0, 0.0)); addParam(ParamWidget::create<Knob26>(levelParamPosition, module, FMOp::LEVEL_PARAM, 0.0, 1.0, 1.0)); diff --git a/src/FMOp.hpp b/src/FMOp.hpp @@ -68,7 +68,10 @@ struct FMOp : Module { LPFDecimator _decimator; SchmittTrigger _gateTrigger; - FMOp() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { + FMOp() + : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) + , _envelope(ADSR::LINEAR_SHAPE) + { onReset(); onSampleRateChange(); }