Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
log_ramped_value.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <cmath>
7#include <algorithm>
8
9namespace pulp::signal {
10
27template <typename SampleType = float>
29public:
30 LogRampedValueT() = default;
31 explicit LogRampedValueT(SampleType initial) : current_(initial), target_(initial) {}
32
33 void set_ramp_time(SampleType seconds, SampleType sample_rate) {
34 ramp_samples_ = std::max(1, static_cast<int>(seconds * sample_rate));
35 }
36
37 void set_target(SampleType value) {
38 target_ = value;
39 if (ramp_samples_ <= 1 || current_ <= SampleType{0.0f} ||
40 target_ <= SampleType{0.0f}) {
41 current_ = target_;
42 steps_remaining_ = 0;
43 multiplier_ = SampleType{1.0f};
44 } else {
45 // Compute per-sample multiplier: current * multiplier^N = target
46 multiplier_ = std::pow(target_ / current_,
47 SampleType{1.0f} /
48 static_cast<SampleType>(ramp_samples_));
49 steps_remaining_ = ramp_samples_;
50 }
51 }
52
53 void set_immediate(SampleType value) {
54 current_ = value;
55 target_ = value;
56 steps_remaining_ = 0;
57 multiplier_ = SampleType{1.0f};
58 }
59
60 SampleType next() {
61 if (steps_remaining_ > 0) {
62 current_ *= multiplier_;
63 --steps_remaining_;
64 if (steps_remaining_ == 0) current_ = target_;
65 }
66 return current_;
67 }
68
69 void skip(int n) {
70 if (n <= 0) return;
71 if (steps_remaining_ <= 0) return;
72 if (n >= steps_remaining_) {
73 current_ = target_;
74 steps_remaining_ = 0;
75 } else {
76 current_ *= std::pow(multiplier_, static_cast<SampleType>(n));
77 steps_remaining_ -= n;
78 }
79 }
80
81 SampleType current_value() const { return current_; }
82 SampleType target_value() const { return target_; }
83 bool is_smoothing() const { return steps_remaining_ > 0; }
84
85private:
86 SampleType current_ = SampleType{0.0f};
87 SampleType target_ = SampleType{0.0f};
88 SampleType multiplier_ = SampleType{1.0f};
89 int ramp_samples_ = 1;
90 int steps_remaining_ = 0;
91};
92
95
96} // namespace pulp::signal
Exponentially-smoothed value for parameters where linear ramping sounds wrong (pitch,...
Definition log_ramped_value.hpp:28
void set_ramp_time(SampleType seconds, SampleType sample_rate)
Definition log_ramped_value.hpp:33
SampleType current_value() const
Definition log_ramped_value.hpp:81
void set_immediate(SampleType value)
Definition log_ramped_value.hpp:53
void skip(int n)
Definition log_ramped_value.hpp:69
LogRampedValueT(SampleType initial)
Definition log_ramped_value.hpp:31
SampleType target_value() const
Definition log_ramped_value.hpp:82
bool is_smoothing() const
Definition log_ramped_value.hpp:83
void set_target(SampleType value)
Definition log_ramped_value.hpp:37
SampleType next()
Definition log_ramped_value.hpp:60
Definition additive_bank.hpp:218
LogRampedValueT< float > LogRampedValue
Definition log_ramped_value.hpp:93
LogRampedValueT< double > LogRampedValue64
Definition log_ramped_value.hpp:94