-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathLimiter.h
More file actions
56 lines (47 loc) · 1.62 KB
/
Copy pathLimiter.h
File metadata and controls
56 lines (47 loc) · 1.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#pragma once
#include "Commons.h"
class Limiter
{
private:
float peak_;
public:
Limiter(float peak)
{
peak_ = peak;
}
~Limiter() { }
static Limiter* create(float peak = 0.5f)
{
return new Limiter(peak);
}
static void destroy(Limiter* obj)
{
delete obj;
}
// Ported and adapted from Emilie Gillet's Limiter in Rings.
void Process(AudioBuffer& input, AudioBuffer& output, float preGain = 1.f)
{
for (size_t i = 0; i < output.getSize(); i++)
{
float l_pre = input.getSamples(LEFT_CHANNEL).getElement(i) * preGain;
float r_pre = input.getSamples(RIGHT_CHANNEL).getElement(i) * preGain;
float l_peak = fabs(l_pre);
float r_peak = fabs(r_pre);
float s_peak = fabs(r_pre - l_pre);
float peak = Max(Max(l_peak, r_peak), s_peak);
SLOPE(peak_, peak, 0.05f, 0.00002f);
// Clamp to 8Vpp, clipping softly towards 10Vpp
float gain = (peak_ <= 1.0f ? 1.0f : 1.0f / peak_);
output.getSamples(LEFT_CHANNEL).setElement(i, SoftLimit(l_pre * gain * 0.8f));
output.getSamples(RIGHT_CHANNEL).setElement(i, SoftLimit(r_pre * gain * 0.8f));
}
}
void ProcessSoft(AudioBuffer& input, AudioBuffer& output)
{
for (size_t i = 0; i < output.getSize(); i++)
{
output.getSamples(LEFT_CHANNEL).setElement(i, SoftLimit(input.getSamples(LEFT_CHANNEL).getElement(i)));
output.getSamples(RIGHT_CHANNEL).setElement(i, SoftLimit(input.getSamples(RIGHT_CHANNEL).getElement(i)));
}
}
};