13 rmix_ (seed1 | 1), next_ (seed2 ? seed2 : 0x14057b7ef767814fU)
22 constexpr uint64_t M = 0xd3833e804f4c574bU;
25 rmix_ =
rotr (rmix_ - last, 37);
33 constexpr float i2f = 4.65661287416159475086293992373695129617e-10;
41template<
size_t N,
class D,
class F>
extern inline F
42iir_eval_tdf2 (
const D *b,
const D *a, D *w, F x)
44 static_assert (N >= 1);
45 const D y = x * b[0] + w[0];
46 D v = x * b[N] - y * a[N];
52 v = x * b[n] + t - y * a[n];
62 static constexpr size_t N = 3;
63 static constexpr Float B[N + 1] = { 0.049922035, -0.095993537, 0.050612699, -0.004408786 };
64 static constexpr Float A[N + 1] = { 1, -2.494956002, 2.017265875, -0.522189400 };
65 float delays_[N] = { 0, };
66 void reset () {
floatfill (delays_, 0.0, N); }
67 Float eval (Float x) {
return iir_eval_tdf2<N> (B, A, delays_, x); }
70template<
class F>
static inline F
73 constexpr F db2log2 = 0.166096404744368117393515971474469508793;
79 using Pink = PinkFilter<float>;
81 WhiteRand white_rand_;
83 float gain_factor_ = 1.0;
86 enum Params { GAIN = 1,
MONO, PINK };
88 ColoredNoise (
const ProcessorSetup &psetup) :
95 info.
label =
"Pink & White Noise";
104 stereout_ =
add_output_bus (
"Stereo Out", SpeakerArrangement::STEREO);
108 pmap.
group =
_(
"Noise Settings");
109 pmap[GAIN] =
Param {
"gain",
_(
"Gain"),
_(
"Gain"), 0,
"dB", { -96, 24, }, };
110 pmap[
MONO] =
Param {
"mono",
_(
"Monophonic"),
_(
"Mono"),
false };
111 pmap[PINK] =
Param {
"pink",
_(
"Pink Noise"),
_(
"Pink"),
true };
116 adjust_param (uint32_t tag)
override
118 switch (Params (tag))
120 case GAIN: gain_factor_ = db2amp (get_param (tag));
break;
122 case PINK: pink_ =
get_param (tag);
break;
126 reset (
uint64 target_stamp)
override
132 void render (
uint n_frames)
override;
134 enum Cases { INSTEREO = 1, WITHPINK = 2, WITHGAIN = 4, MASK = 0x7 };
135 template<Cases>
void render_cases (
float *out0,
float *out1,
uint n_frames,
const float gain);
139static auto noise_module = register_audio_processor<ColoredNoise> (
"Ase::Devices::ColoredNoise");
141template<ColoredNoise::Cases CASES>
void
142ColoredNoise::render_cases (
float *out0,
float *out1,
uint n_frames,
const float gain)
144 static_assert (CASES <= MASK);
145 for (
size_t i = 0; i < n_frames; i++)
147 auto [f0, f1] = white_rand_.randf2();
148 if_constexpr (
bool (CASES & WITHPINK) &&
bool (CASES & INSTEREO))
150 f0 = pink0.eval (f0);
151 f1 = pink1.eval (f1);
153 if_constexpr (
bool (CASES & WITHPINK) && !
bool (CASES & INSTEREO))
155 f0 = pink0.eval (f0);
156 f1 = pink0.eval (f1);
180static const auto render_table = make_case_table<ColoredNoise::MASK> ([] (
auto CASE)
182 return &ColoredNoise::render_cases<ColoredNoise::Cases (CASE.value)>;
186ColoredNoise::render (
uint n_frames)
188 apply_input_events();
189 float *out0 = oblock (stereout_, 0);
190 float *out1 = oblock (stereout_, 1);
191 const float gain = gain_factor_;
192 const uint index = INSTEREO * !mono_ + WITHPINK * pink_ + WITHGAIN * (gain != 1.0);
193 (this->*render_table[index]) (out0, out1, n_frames, gain);
Audio signal AudioProcessor base class, implemented by all effects and instruments.
void remove_all_buses()
Remove existing bus configurations, useful at the start of configure().
double get_param(Id32 paramid)
Fetch value of parameter id.
OBusId add_output_bus(CString uilabel, SpeakerArrangement speakerarrangement, const String &hints="", const String &blurb="")
Add an output bus with uilabel and channels configured via speakerarrangement.
virtual void initialize(SpeakerArrangement busses)=0
Mandatory method to setup parameters and I/O busses.
void install_params(const AudioParams::Map ¶ms)
Reset list of parameters, enqueues parameter value initializaiton events.
#define _(...)
Retrieve the translation of a C or C++ string.
#define if_constexpr
Indentation helper for editors that cannot (yet) decipher if constexpr
The Anklang C++ API namespace.
CString website_url
Website of/about this AudioProcessor.
uint64_t uint64
A 64-bit unsigned integer, use PRI*64 in format strings.
void floatfill(float *dst, float f, size_t n)
Fill n values of dst with f.
SpeakerArrangement
Flags to indicate channel arrangements of a bus.
OBusId
ID type for AudioProcessor output buses, buses are numbered with increasing index.
CString version
Version identifier.
CString creator_name
Name of the creator.
CString label
Preferred user interface name.
uint32_t uint
Provide 'uint' as convenience type.
CString category
Category to allow grouping for processors of similar function.
uint64_t random_int64()
Generate a non-deterministic, uniformly distributed 64 bit pseudo-random number.
Detailed information and common properties of AudioProcessor subclasses.
Structured initializer for Parameter.
Parameter list construction helper.
String group
Group to be applied to all newly inserted Parameter objects.