40template <
typename SampleType =
float>
class DustT {
41 static_assert(std::is_floating_point_v<SampleType>);
55 probability_ = density_hz_ / sample_rate_;
63 probability_ = density_hz_ / sample_rate_;
68 if (!(std::isfinite(
static_cast<double>(
level)) &&
level >= SampleType{} &&
69 level <= SampleType{1}))
92 event_rng_.seed(seed_);
93 amplitude_rng_.seed(amplitude_seed(seed_));
98 triggered_ = event_rng_.next_unit<
double>() < probability_;
101 switch (distribution_) {
105 return level_ * amplitude_rng_.next_unit<SampleType>();
107 return level_ * amplitude_rng_.next_bipolar<SampleType>();
112 void process(SampleType* output, std::size_t frames)
noexcept {
113 if (output ==
nullptr)
115 for (std::size_t frame = 0; frame < frames; ++frame)
129 return distribution_;
131 std::uint32_t
seed() const noexcept {
146 static std::uint32_t amplitude_seed(std::uint32_t
seed)
noexcept {
147 const auto derived =
static_cast<std::uint32_t
>(
mix64(
seed, 0
u, 0x44555354u));
152 Xorshift32 amplitude_rng_{amplitude_seed(
kDefaultSeed)};
154 double density_hz_ = 0.0;
155 double probability_ = 0.0;
156 SampleType level_ = SampleType{1};
159 bool triggered_ =
false;
Deterministic discrete-time Poisson impulse source.
Definition dust.hpp:40
std::uint32_t seed() const noexcept
Definition dust.hpp:131
bool prepare(double sample_rate) noexcept
Definition dust.hpp:51
double density_hz() const noexcept
Definition dust.hpp:122
DustAmplitudeDistribution distribution() const noexcept
Definition dust.hpp:128
bool set_density_hz(double density_hz) noexcept
Definition dust.hpp:59
void process(SampleType *output, std::size_t frames) noexcept
Definition dust.hpp:112
static constexpr std::uint32_t kDefaultSeed
Definition dust.hpp:45
static constexpr int latency_samples() noexcept
Definition dust.hpp:138
bool triggered() const noexcept
Definition dust.hpp:134
static constexpr double kDefaultSampleRate
Definition dust.hpp:44
double sample_rate() const noexcept
Definition dust.hpp:119
bool set_distribution(DustAmplitudeDistribution distribution) noexcept
Definition dust.hpp:75
void reset() noexcept
Definition dust.hpp:91
bool set_level(SampleType level) noexcept
Definition dust.hpp:67
void set_seed(std::uint32_t seed) noexcept
Definition dust.hpp:86
float level() const noexcept
Definition dust.hpp:125
DustT()
Definition dust.hpp:47
SampleType process() noexcept
Definition dust.hpp:97
static constexpr int tail_samples() noexcept
Definition dust.hpp:141
static constexpr std::uint32_t kDefaultSeed
Any nonzero constant works; this is the 32-bit golden-ratio odd constant, which is also what seed(0) ...
Definition rng.hpp:37
Definition additive_bank.hpp:218
DustT< double > Dust64
Definition dust.hpp:163
constexpr std::uint64_t mix64(std::uint64_t z)
splitmix64 finalizer (Steele, Lea & Flood, OOPSLA 2014).
Definition rng.hpp:140
@ u
Definition formant_filter_bank.hpp:20
DustAmplitudeDistribution
Amplitude law applied when a DustT event occurs.
Definition dust.hpp:14
@ uniform_unipolar
Uniform on [0, level).
Definition dust.hpp:16
@ uniform_bipolar
Uniform on [-level, level).
Definition dust.hpp:17
@ constant
Exactly level.
Definition dust.hpp:15
DustT< float > Dust
Definition dust.hpp:162
Deterministic randomness for modulation: a counter-free PRNG, a Gaussian draw, a stateless purpose-ke...