-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathErosion.cpp
More file actions
116 lines (82 loc) · 4.04 KB
/
Copy pathErosion.cpp
File metadata and controls
116 lines (82 loc) · 4.04 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
115
116
#include "Erosion.h"
#include <JuceHeader.h>
void Erosion::processBlock(dsp::AudioBlock<float>& block, double sampleRate)
{
auto leftBlock = block.getSingleChannelBlock(0);
auto rightBlock = block.getSingleChannelBlock(1);
for (int i = 0; i < block.getNumSamples(); i++) {
delayLine.pushSample(0, leftBlock.getSample(0, i));
delayLine.pushSample(1, rightBlock.getSample(0, i));
}
// get the current value of the saturation knob to figure out how much to multiply a random value by
float saturationAmount = erosionAmount->get() * 0.1f;
// create buffer to store the random values
randomBuffer.clear();
for (int i = 0; i < block.getNumSamples(); i++) {
// store the filtered random value in the buffer
float randomValue = random.nextFloat() * 2.0f - 1.0f;
randomBuffer.setSample(0, i, randomValue);
randomValue = random.nextFloat() * 2.0f - 1.0f;
randomBuffer.setSample(1, i, randomValue);
}
*iirFilter.state = *dsp::IIR::Coefficients<float>::makeBandPass(sampleRate, erosionFrequency->get(), erosionQ->get());
// now, filter the random values
iirFilter.process(dsp::ProcessContextReplacing<float>(randomBlock));
// now with the filtered values, multiply them by the saturation amount
for (int i = 0; i < block.getNumSamples(); i++) {
float leftEroded = delayLine.popSample(0, 5.f + (randomBuffer.getSample(0, i)) * (saturationAmount));
float rightEroded = delayLine.popSample(1, 5.f + (randomBuffer.getSample(1, i)) * (saturationAmount));
block.setSample(0, i, leftEroded);
block.setSample(1, i, rightEroded);
}
}
void Erosion::processSidechainedBlock(dsp::AudioBlock<float>& block, dsp::AudioBlock<float>& sidechain, double sampleRate) {
auto leftBlock = block.getSingleChannelBlock(0);
auto rightBlock = block.getSingleChannelBlock(1);
for (int i = 0; i < block.getNumSamples(); i++) {
delayLine.pushSample(0, leftBlock.getSample(0, i));
delayLine.pushSample(1, rightBlock.getSample(0, i));
}
// get the current value of the saturation knob to figure out how much to multiply our sidechain value by
float saturationAmount = erosionAmount->get() * 0.5f;
*iirFilter.state = *dsp::IIR::Coefficients<float>::makeBandPass(sampleRate, erosionFrequency->get(), erosionQ->get());
// create buffer to store the random values
// randomBuffer.clear();
// for (int i = 0; i < block.getNumSamples(); i++) {
// // store the filtered random value in the buffer
// float randomValue = sidechain.getSample(0, i) * 2.0f - 1.0f;
// randomBuffer.setSample(0, i, randomValue);
// randomValue = sidechain.getSample(1, i) * 2.0f - 1.0f;
// randomBuffer.setSample(1, i, randomValue);
// }
// now, filter the random values
// iirFilter.process(dsp::ProcessContextReplacing<float>(randomBlock));
// now with the filtered values, multiply them by the saturation amount
for (int i = 0; i < block.getNumSamples(); i++) {
float leftEroded = delayLine.popSample(0, (sidechain.getSample(0, i) + 1.f) * saturationAmount);
float rightEroded = delayLine.popSample(1, (sidechain.getSample(1, i) + 1.f) * saturationAmount);
block.setSample(0, i, leftEroded);
block.setSample(1, i, rightEroded);
}
}
void Erosion::prepareToPlay(double sampleRate, int samplesPerBlock)
{
// init delay
dsp::ProcessSpec spec;
spec.sampleRate = sampleRate;
spec.maximumBlockSize = samplesPerBlock;
spec.numChannels = 2;
delayLine.prepare(spec);
delayLine.setMaximumDelayInSamples(0.1 * sampleRate);
// init iir filter
*iirFilter.state = dsp::IIR::ArrayCoefficients<float>::makeBandPass(sampleRate, 880.0, 3.0);
iirFilter.prepare(spec);
// init random
random.setSeedRandomly();
// init random buffer
randomBuffer.setSize(2, samplesPerBlock);
randomBuffer.clear();
randomBlock = dsp::AudioBlock<float>(randomBuffer);
oldSampleRate = sampleRate;
oldSamplesPerBlock = samplesPerBlock;
}