-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMultiband_Compressor.java
More file actions
114 lines (99 loc) · 4.29 KB
/
Multiband_Compressor.java
File metadata and controls
114 lines (99 loc) · 4.29 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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <JuceHeader.h>
class MultibandCompressorProcessor
{
public:
MultibandCompressorProcessor() {}
void prepareToPlay(double sampleRate, int samplesPerBlock)
{
dsp::ProcessSpec spec;
spec.sampleRate = sampleRate;
spec.maximumBlockSize = samplesPerBlock;
spec.numChannels = 2;
for (auto& compressor : compressors)
{
compressor.prepare(spec);
compressor.setAttackTime(20.0f);
compressor.setReleaseTime(50.0f);
compressor.setRatio(2.5f);
compressor.setThreshold(-12.0f);
}
// Set specific parameters for each band
compressors[0].setRatio(4.0f); // Low Band
compressors[1].setThreshold(-10.0f); // Low-Mid Band
compressors[2].setAttackTime(10.0f); // High-Mid Band
compressors[3].setReleaseTime(30.0f); // High Band
}
void setAttack(float value) { for (auto& c : compressors) c.setAttackTime(value); }
void setRelease(float value) { for (auto& c : compressors) c.setReleaseTime(value); }
void setThreshold(float value) { for (auto& c : compressors) c.setThreshold(value); }
void setRatio(float value) { for (auto& c : compressors) c.setRatio(value); }
void processBlock(AudioBuffer<float>& buffer)
{
dsp::AudioBlock<float> audioBlock(buffer);
dsp::ProcessContextReplacing<float> context(audioBlock);
// Split into frequency bands and apply compression
splitBands(buffer);
for (size_t i = 0; i < compressors.size(); ++i)
{
compressors[i].process(context);
}
}
private:
std::array<dsp::Compressor<float>, 4> compressors; // 4-band compressor
void splitBands(AudioBuffer<float>& buffer)
{
// Example band splitting logic using crossover filters
// This would split the audio into four frequency bands
}
};
class MultibandCompressorEditor : public juce::AudioProcessorEditor
{
public:
MultibandCompressorEditor(MultibandCompressorProcessor& p) : processor(p)
{
setSize(400, 300);
addAndMakeVisible(attackSlider);
addAndMakeVisible(releaseSlider);
addAndMakeVisible(thresholdSlider);
addAndMakeVisible(ratioSlider);
configureSlider(attackSlider, "Attack", juce::Colours::red, 1.0, 100.0, 20.0);
configureSlider(releaseSlider, "Release", juce::Colours::blue, 10.0, 200.0, 50.0);
configureSlider(thresholdSlider, "Threshold", juce::Colours::yellow, -60.0, 0.0, -12.0);
configureSlider(ratioSlider, "Ratio", juce::Colours::green, 1.0, 10.0, 2.5);
}
void paint(juce::Graphics& g) override
{
g.fillAll(juce::Colours::black);
g.setColour(juce::Colours::white);
g.setFont(15.0f);
g.drawFittedText("Multiband Compressor", getLocalBounds(), juce::Justification::centred, 1);
}
void resized() override
{
auto area = getLocalBounds();
auto sliderArea = area.removeFromTop(200).reduced(10);
attackSlider.setBounds(sliderArea.removeFromLeft(90));
releaseSlider.setBounds(sliderArea.removeFromLeft(90));
thresholdSlider.setBounds(sliderArea.removeFromLeft(90));
ratioSlider.setBounds(sliderArea.removeFromLeft(90));
}
private:
MultibandCompressorProcessor& processor;
juce::Slider attackSlider, releaseSlider, thresholdSlider, ratioSlider;
void configureSlider(juce::Slider& slider, const juce::String& name, juce::Colour colour, double min, double max, double value)
{
slider.setSliderStyle(juce::Slider::Rotary);
slider.setTextBoxStyle(juce::Slider::TextBoxBelow, false, 50, 20);
slider.setRange(min, max, 0.1);
slider.setValue(value);
slider.setName(name);
slider.setColour(juce::Slider::rotarySliderFillColourId, colour);
slider.onValueChange = [this, &slider, name]()
{
if (name == "Attack") processor.setAttack(slider.getValue());
else if (name == "Release") processor.setRelease(slider.getValue());
else if (name == "Threshold") processor.setThreshold(slider.getValue());
else if (name == "Ratio") processor.setRatio(slider.getValue());
};
}
};