2#include "ase/processor.hh"
15class Freeverb :
public AudioProcessor {
20 bool mix_smooth_reset_ =
false;
22 Freeverb (
const ProcessorSetup &psetup) :
23 AudioProcessor (psetup)
26 static_info (AudioProcessorInfo &info)
29 info.label =
"Freeverb3";
30 info.category =
"Reverb";
31 info.website_url =
"https://beast.testbit.eu";
32 info.creator_name =
"Jezar at Dreampoint";
34 enum Params { MODE = 1, MIX, ROOMSIZE, DAMPING, WIDTH };
40 stereoin = add_input_bus (
"Stereo In", SpeakerArrangement::STEREO);
41 stereout = add_output_bus (
"Stereo Out", SpeakerArrangement::STEREO);
45 pmap.
group =
_(
"Reverb Settings");
46 pmap[MIX] =
Param {
"mix",
"Mix dry/wet",
"Mix", 30,
"%", { 0, 100 } };
49 centries += {
"Signflip 2000",
_(
"Preserve May 2000 Freeverb damping sign flip") };
50 centries += {
"VLC Damping",
_(
"The VLC Freeverb version disables one damping feedback chain") };
51 centries += {
"Normal Damping",
_(
"Damping with sign correction as implemented in STK Freeverb") };
52 pmap[MODE] =
Param (
"mode",
_(
"Mode"),
_(
"Mode"), 2,
"", std::move (centries),
"",
53 {
String (
"blurb=") +
_(
"Damping mode found in different Freeverb variants"), });
55 pmap.
group =
_(
"Room Settings");
56 pmap[ROOMSIZE] =
Param (
"roomsize",
_(
"Room size"),
_(
"RS"), offsetroom + scaleroom * initialroom,
_(
"size"), { offsetroom, offsetroom + scaleroom });
57 pmap[WIDTH] =
Param (
"width",
_(
"Width"),
_(
"W"), 100 * initialwidth,
"%", { 0, 100 });
58 pmap[DAMPING] =
Param (
"damping",
_(
"Damping"),
_(
"D"), 100 * initialdamp,
"%", { 0, 100 });
60 install_params (pmap);
63 adjust_param (uint32_t paramid)
override
65 switch (Params (paramid))
67 case MIX: mix_smooth_.set (get_param (paramid) * 0.01, mix_smooth_reset_);
68 mix_smooth_reset_ =
false;
70 case ROOMSIZE:
return model.setroomsize ((get_param (paramid) - offsetroom) / scaleroom);
71 case WIDTH:
return model.setwidth (0.01 * get_param (paramid));
73 case DAMPING:
return model.setdamp (0.01 * get_param (ParamId (DAMPING)),
74 1 -
irintf (get_param (ParamId (MODE))));
78 reset (
uint64 target_stamp)
override
84 mix_smooth_.reset (sample_rate(), 0.020);
85 mix_smooth_reset_ =
true;
89 render_audio (
float *input0,
float *input1,
float *output0,
float *output1,
uint n_frames)
95 model.processreplace (input0, input1, output0, output1, n_frames, 1);
97 if (mix_smooth_.is_constant())
99 float mix = mix_smooth_.get_next();
100 for (
uint i = 0; i < n_frames; i++)
102 output0[i] = input0[i] * (1 - mix) + output0[i] * mix;
103 output1[i] = input1[i] * (1 - mix) + output1[i] * mix;
108 for (
uint i = 0; i < n_frames; i++)
110 float mix = mix_smooth_.get_next();
111 output0[i] = input0[i] * (1 - mix) + output0[i] * mix;
112 output1[i] = input1[i] * (1 - mix) + output1[i] * mix;
117 render (
uint n_frames)
override
119 float *input0 =
const_cast<float*
> (ifloats (stereoin, 0));
120 float *input1 =
const_cast<float*
> (ifloats (stereoin, 1));
121 float *output0 = oblock (stereout, 0);
122 float *output1 = oblock (stereout, 1);
125 MidiEventInput evinput = midi_event_input();
126 for (
const auto &ev : evinput)
129 render_audio (input0 + offset, input1 + offset, output0 + offset, output1 + offset, ev.frame - offset);
132 switch (ev.message())
134 case MidiMessage::PARAM_VALUE:
136 adjust_param (ev.param);
142 render_audio (input0 + offset, input1 + offset, output0 + offset, output1 + offset, n_frames - offset);
145static auto freeverb = register_audio_processor<Freeverb> (
"Ase::Devices::Freeverb");
#define _(...)
Retrieve the translation of a C or C++ string.
The Anklang C++ API namespace.
uint64_t uint64
A 64-bit unsigned integer, use PRI*64 in format strings.
SpeakerArrangement
Flags to indicate channel arrangements of a bus.
std::string String
Convenience alias for std::string.
int irintf(float f)
Round float to int, using round-to-nearest Fast version of f < 0 ? int (f - 0.5) : int (f + 0....
uint32_t uint
Provide 'uint' as convenience type.
Structured initializer for Parameter.
Parameter list construction helper.
String group
Group to be applied to all newly inserted Parameter objects.