42 void setLocalInitialPhase(
const LFOConfig& config);
43 void setGlobalInitialPhase(
const LFOConfig& config);
44 [[gnu::always_inline]] int32_t render(int32_t numSamples,
LFOConfig& config, uint32_t phaseIncrement) {
45 return render(numSamples, config.waveType, phaseIncrement);
47 [[gnu::always_inline]] int32_t render(int32_t numSamples, LFOType waveType, uint32_t phaseIncrement) {
51 value =
static_cast<int32_t
>(phase);
55 value = getSquare(phase);
59 value = getSine(phase);
62 case LFOType::TRIANGLE:
63 value = getTriangle(phase);
66 case LFOType::SAMPLE_AND_HOLD:
67 if ((phase == 0) || (phase + phaseIncrement * numSamples < phase)) {
76 case LFOType::RANDOM_WALK: {
77 uint32_t range = 4294967295u / 20;
79 value = (range / 2) - CONG % range;
82 else if (phase + phaseIncrement * numSamples < phase) {
93 holdValue = add_saturate((holdValue / -16) + (range / 2) - CONG % range, holdValue);
101 case LFOType::WARBLER: {
103 warble(numSamples, phaseIncrement);
108 phase += phaseIncrement * numSamples;
111 void warble(int32_t numSamples, uint32_t phaseIncrement) {
112 if (phase + phaseIncrement * numSamples < phase) {
118 auto targetSpeed = target - holdValue;
119 speed = speed + numSamples * (multiply_32x32_rshift32(targetSpeed, phaseIncrement >> 8));
120 holdValue = add_saturate(holdValue, speed);
123 void tick(int32_t numSamples, uint32_t phaseIncrement) {
126 phase += phaseIncrement * numSamples;