45template <
typename SampleType =
float>
53 for (
auto& line : lines_) line.prepare(cap * 2);
59 ?
static_cast<double>(
i) /
64 grain_[
i] = std::max(16.0, ms * 0.001 *
tank_rate);
65 XorShift32 rng(kOffsetSeed +
static_cast<std::uint32_t
>(
i) * kOffsetStride);
67 read_offset_[
static_cast<std::size_t
>(
i)][
static_cast<std::size_t
>(g)] =
74 tone_coeff_ = std::exp(-w);
79 for (
auto& line : lines_) line.reset();
80 for (
auto& z : tone_state_) z = 0.0;
85 SampleType
process(
int channel, SampleType x) {
89 const double period = grain_[
static_cast<std::size_t
>(channel)];
90 if (period < 16.0)
return SampleType{0};
91 double age = phase_[
static_cast<std::size_t
>(channel)];
98 if (
a >= period)
a -= period;
101 read_offset_[
static_cast<std::size_t
>(channel)][
static_cast<std::size_t
>(g)];
102 const double window =
103 0.5 - 0.5 * std::cos(6.283185307179586 *
a / period);
104 sum += window *
static_cast<double>(line.read(
delay + 2.0));
110 if (age >= period) age -= period;
111 phase_[
static_cast<std::size_t
>(channel)] = age;
113 double& z = tone_state_[
static_cast<std::size_t
>(channel)];
114 z =
snap_to_zero(sum * (1.0 - tone_coeff_) + z * tone_coeff_);
116 return static_cast<SampleType
>(z);
123 const double n =
static_cast<double>(std::max(active_n, 1));
128 void reset_phases() {
132 phase_[
static_cast<std::size_t
>(
i)] =
133 grain_[
static_cast<std::size_t
>(
i)] *
static_cast<double>(
i) /
138 static constexpr std::uint32_t kOffsetSeed = 0xA5A5F00Du;
139 static constexpr std::uint32_t kOffsetStride = 0x27D4EB2Fu;
141 std::array<FracDelayT<SampleType>,
kNumChannels> lines_{};
142 std::array<std::array<double, kNumShimmerGrains>,
kNumChannels> read_offset_{};
143 std::array<double, kNumChannels> grain_{};
144 std::array<double, kNumChannels> phase_{};
145 std::array<double, kNumChannels> tone_state_{};
146 double tone_coeff_ = 0.0;
Definition frac_delay.hpp:36
Definition shimmer.hpp:46
SampleType process(int channel, SampleType x)
Definition shimmer.hpp:85
void configure(double tank_rate)
Definition shimmer.hpp:56
static double injection_weight(double shimmer, int active_n)
Definition shimmer.hpp:122
void prepare(double max_sample_rate)
Definition shimmer.hpp:50
void reset()
Definition shimmer.hpp:78
Definition modulation.hpp:23
double next_unit()
Definition modulation.hpp:40
T finite_or_zero(T value)
Definition sanitize.hpp:12
constexpr int kNumChannels
Definition config.hpp:18
@ shimmer
Definition config.hpp:222
@ tank_rate
Definition config.hpp:226
constexpr int kNumShimmerGrains
Definition config.hpp:21
constexpr double kShimmerGrainMaxMs
Definition config.hpp:135
constexpr double kShimmerMaxWeight
Definition config.hpp:138
constexpr double kShimmerGrainMinMs
Definition config.hpp:134
constexpr int kHermiteGuard
Definition config.hpp:171
constexpr double kShimmerToneHz
Definition config.hpp:136
@ delay
Definition envelope.hpp:57
T snap_to_zero(T x)
Returns 0 if |x| < snap_threshold, else x.
Definition denormal.hpp:45
@ a
Definition formant_filter_bank.hpp:20
@ i
Definition formant_filter_bank.hpp:20