diff --git a/libs/sst/sst-basic-blocks b/libs/sst/sst-basic-blocks index dfc3fb76..e72fab49 160000 --- a/libs/sst/sst-basic-blocks +++ b/libs/sst/sst-basic-blocks @@ -1 +1 @@ -Subproject commit dfc3fb7651a9853cc50ef49ed29fbbbdfc25ad0f +Subproject commit e72fab49f0fc23c8fff952734fdffdf153b128dc diff --git a/libs/sst/sst-jucegui b/libs/sst/sst-jucegui index 70aa8c90..f4625de9 160000 --- a/libs/sst/sst-jucegui +++ b/libs/sst/sst-jucegui @@ -1 +1 @@ -Subproject commit 70aa8c903c36e10e8f1557684613725b17e66a64 +Subproject commit f4625de947b9b6953e1ef27bc606a9c6d5c5a698 diff --git a/libs/sst/sst-voicemanager b/libs/sst/sst-voicemanager index c814b3fc..3e0f2915 160000 --- a/libs/sst/sst-voicemanager +++ b/libs/sst/sst-voicemanager @@ -1 +1 @@ -Subproject commit c814b3fcad63b0aa91ef1c9e40e4461cbe73a749 +Subproject commit 3e0f2915f4ed565aec9ac69dc0e93b6316edcb13 diff --git a/src/engine/group.cpp b/src/engine/group.cpp index 5756dd17..2fd6ee16 100644 --- a/src/engine/group.cpp +++ b/src/engine/group.cpp @@ -447,7 +447,9 @@ void Group::setupOnUnstream(engine::Engine &e) { stepLfos[i].setSampleRate(sampleRate, sampleRateInv); - stepLfos[i].assign(&modulatorStorage[i], endpoints.lfo[i].rateP, nullptr, getEngine()->rng); + stepLfos[i].assign(&modulatorStorage[i], endpoints.lfo[i].rateP, &(getEngine()->transport), + getEngine()->rng); + curveLfos[i].assign(&modulatorStorage[i], &(getEngine()->transport)); } for (int p = 0; p < processorCount; ++p) @@ -577,8 +579,9 @@ void Group::resetLFOs(int whichLFO) { stepLfos[i].setSampleRate(sampleRate, sampleRateInv); - stepLfos[i].assign(&modulatorStorage[i], endpoints.lfo[i].rateP, nullptr, - getEngine()->rng); + stepLfos[i].assign(&modulatorStorage[i], endpoints.lfo[i].rateP, + &(getEngine()->transport), getEngine()->rng); + curveLfos[i].assign(&modulatorStorage[i], &(getEngine()->transport)); } else if (lfoEvaluator[i] == CURVE) { diff --git a/src/modulation/modulators/curvelfo.h b/src/modulation/modulators/curvelfo.h index 6e688cec..f4f84a1b 100644 --- a/src/modulation/modulators/curvelfo.h +++ b/src/modulation/modulators/curvelfo.h @@ -49,6 +49,17 @@ struct CurveLFO : SampleRateSupport slfo_t::Shape curveShape{slfo_t::SINE}; + private: + modulation::ModulatorStorage *settings{nullptr}; + engine::Transport *td{nullptr}; + + public: + void assign(modulation::ModulatorStorage *s, engine::Transport *t) + { + settings = s; + td = t; + } + float envelope_rate_linear_nowrap(float f) { return blockSize * sampleRateInv * dsp::twoToTheXTable.twoToThe(-f); @@ -56,6 +67,7 @@ struct CurveLFO : SampleRateSupport void attack(float initPhase, ModulatorStorage::ModulatorShape shape) { + assert(settings && td); switch (shape) { case ModulatorStorage::LFO_RAMP: @@ -85,10 +97,18 @@ struct CurveLFO : SampleRateSupport } uint32_t smp{0}; + datamodel::pmd tsConverter{datamodel::pmd().asLfoRate()}; void process(const float rate, const float deform, const float delay, const float attack, const float release, bool useEnv, bool unipolar, bool isGated) { - simpleLfo.process_block(rate, deform, curveShape); + float tsRatio{1.0}; + float rt = rate; + if (settings && td && settings->temposync) + { + rt = -tsConverter.snapToTemposync(-rt); + tsRatio = td->tempo / 120.0; + } + simpleLfo.process_block(rt, deform, curveShape, false, tsRatio); auto lfov = simpleLfo.lastTarget; if (unipolar) lfov = (lfov + 1) * 0.5; diff --git a/src/voice/voice.cpp b/src/voice/voice.cpp index ff4451b1..cf157333 100644 --- a/src/voice/voice.cpp +++ b/src/voice/voice.cpp @@ -131,6 +131,7 @@ void Voice::voiceStarted() else if (lfoEvaluator[i] == CURVE) { curveLfos[i].setSampleRate(sampleRate, sampleRateInv); + curveLfos[i].assign(&zone->modulatorStorage[i], &engine->transport); curveLfos[i].attack(ms.start_phase, ms.modulatorShape); } else if (lfoEvaluator[i] == ENV)