Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
dust.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <pulp/signal/rng.hpp>
4
5#include <algorithm>
6#include <cmath>
7#include <cstddef>
8#include <cstdint>
9#include <type_traits>
10
11namespace pulp::signal {
12
19
40template <typename SampleType = float> class DustT {
41 static_assert(std::is_floating_point_v<SampleType>);
42
43 public:
44 static constexpr double kDefaultSampleRate = 48000.0;
45 static constexpr std::uint32_t kDefaultSeed = 0xD0571234u;
46
48 reset();
49 }
50
51 bool prepare(double sample_rate) noexcept {
52 if (!(std::isfinite(sample_rate) && sample_rate > 0.0) || density_hz_ > sample_rate)
53 return false;
54 sample_rate_ = sample_rate;
55 probability_ = density_hz_ / sample_rate_;
56 return true;
57 }
58
59 bool set_density_hz(double density_hz) noexcept {
60 if (!(std::isfinite(density_hz) && density_hz >= 0.0 && density_hz <= sample_rate_))
61 return false;
62 density_hz_ = density_hz;
63 probability_ = density_hz_ / sample_rate_;
64 return true;
65 }
66
67 bool set_level(SampleType level) noexcept {
68 if (!(std::isfinite(static_cast<double>(level)) && level >= SampleType{} &&
69 level <= SampleType{1}))
70 return false;
71 level_ = level;
72 return true;
73 }
74
85
86 void set_seed(std::uint32_t seed) noexcept {
87 seed_ = seed == 0u ? Xorshift32::kDefaultSeed : seed;
88 reset();
89 }
90
91 void reset() noexcept {
92 event_rng_.seed(seed_);
93 amplitude_rng_.seed(amplitude_seed(seed_));
94 triggered_ = false;
95 }
96
97 SampleType process() noexcept {
98 triggered_ = event_rng_.next_unit<double>() < probability_;
99 if (!triggered_)
100 return SampleType{};
101 switch (distribution_) {
103 return level_;
105 return level_ * amplitude_rng_.next_unit<SampleType>();
107 return level_ * amplitude_rng_.next_bipolar<SampleType>();
108 }
109 return SampleType{};
110 }
111
112 void process(SampleType* output, std::size_t frames) noexcept {
113 if (output == nullptr)
114 return;
115 for (std::size_t frame = 0; frame < frames; ++frame)
116 output[frame] = process();
117 }
118
119 double sample_rate() const noexcept {
120 return sample_rate_;
121 }
122 double density_hz() const noexcept {
123 return density_hz_;
124 }
125 SampleType level() const noexcept {
126 return level_;
127 }
129 return distribution_;
130 }
131 std::uint32_t seed() const noexcept {
132 return seed_;
133 }
134 bool triggered() const noexcept {
135 return triggered_;
136 }
137
138 static constexpr int latency_samples() noexcept {
139 return 0;
140 }
141 static constexpr int tail_samples() noexcept {
142 return 0;
143 }
144
145 private:
146 static std::uint32_t amplitude_seed(std::uint32_t seed) noexcept {
147 const auto derived = static_cast<std::uint32_t>(mix64(seed, 0u, 0x44555354u));
148 return derived == 0u ? Xorshift32::kDefaultSeed : derived;
149 }
150
151 Xorshift32 event_rng_{kDefaultSeed};
152 Xorshift32 amplitude_rng_{amplitude_seed(kDefaultSeed)};
153 double sample_rate_ = kDefaultSampleRate;
154 double density_hz_ = 0.0;
155 double probability_ = 0.0;
156 SampleType level_ = SampleType{1};
158 std::uint32_t seed_ = kDefaultSeed;
159 bool triggered_ = false;
160};
161
164
165} // namespace pulp::signal
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...