194 {
196
197
199
200 float bpmScale = 1.0f;
202 bpmScale =
bpm / 120.0f;
203 if (bpmScale < 0.6f) bpmScale = 0.6f;
204 if (bpmScale > 1.6f) bpmScale = 1.6f;
205 }
206
207
208
209 auto pulseFromEvent = [&](fl::u32
t,
float weight) ->
float {
210 if (
t == 0)
return 0.0f;
211 const fl::u32 dt = nowMs -
t;
212 if (dt >=
mCfg.pulseDecayMs)
return 0.0f;
213 const float k = 1.0f - (
static_cast<float>(dt) /
mCfg.pulseDecayMs);
214 return weight * k * k;
215 };
216 const float kickPulse = pulseFromEvent(
mLastKickMs, 0.50f);
217 const float snarePulse = pulseFromEvent(
mLastSnareMs, 0.25f);
219 float pulse = kickPulse + snarePulse + downbeatPulse;
220 if (pulse > 1.5f) pulse = 1.5f;
221
222
223
224 const float phase =
mProcessor->getMeasurePhase();
225
226 const float phaseBow = 0.15f *
fl::sin(phase * 6.2831853f);
227
228 float speed =
mCfg.bpmLockedBaseSpeed * bpmScale + pulse + phaseBow;
230 return speed * manualSpeedScalar;
231}
fl::shared_ptr< fl::audio::Processor > mProcessor
enable_if< is_fixed_point< T >::value, T >::type sin(T angle) FL_NOEXCEPT