Skip to content

Commit ee86d90

Browse files
committed
works yay
1 parent e53bcc6 commit ee86d90

11 files changed

Lines changed: 144 additions & 157 deletions

File tree

Project.jucer

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
pluginCharacteristicsValue="pluginWantsMidiIn" pluginDesc="Absorbs a sidechain-input's signal in creative ways."
77
pluginManufacturer="Mrugalla" pluginManufacturerCode="Mrug" pluginCode="ID29"
88
pluginVSTNumMidiInputs="1" pluginVST3Category="Distortion,Fx"
9-
cppLanguageStandard="latest" pluginName="Absorb" defines="PPDEditorWidth=774
PPDEditorHeight=448

PPDHasEditor=true
PPDHasPatchBrowser=true

PPDHasSidechain=true

PPDHasGainIn=true
PPDHasHQ=true
PPDHasUnityGain=true && PPDHasGainIn
PPDHasStereoConfig=true
PPDHasPolarity=true

PPDEqualLoudnessMix=false

PPDFPSKnobs=30
PPDFPSMeters=30.f
PPDFPSTextEditor=3

PPDFPSValueBubble=24.f
PPDValueBubbleVisibleTimeMs=1500.f

PPDMetersUseRMS=false

PPD_GainIn_Min=-12.f
PPD_GainIn_Max=12.f
PPD_GainOut_Min=-24.f
PPD_GainOut_Max=24.f
PPD_UnityGainDefault=true

PPD_DebugFormularParser=false

PPDPitchShifterSizeMs=1000.f
PPDPitchShifterNumVoices=7

JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=0">
9+
cppLanguageStandard="latest" pluginName="Absorb" defines="PPDEditorWidth=774
PPDEditorHeight=448

PPDHasEditor=true
PPDHasPatchBrowser=true

PPDHasSidechain=true

PPDHasGainIn=true
PPDHasHQ=true
PPDHasUnityGain=true && PPDHasGainIn
PPDHasStereoConfig=true
PPDHasPolarity=true

PPDEqualLoudnessMix=false

PPDFPSKnobs=30
PPDFPSMeters=30
PPDFPSTextEditor=3

PPDFPSValueBubble=24
PPDValueBubbleVisibleTimeMs=1500

PPDMetersUseRMS=false

PPD_GainIn_Min=-12
PPD_GainIn_Max=12
PPD_GainOut_Min=-24
PPD_GainOut_Max=24
PPD_UnityGainDefault=true

PPD_DebugFormularParser=false

PPDPitchShifterSizeMs=1000
PPDPitchShifterNumVoices=7

JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=0">
1010
<MAINGROUP id="c82PPq" name="Absorb">
1111
<GROUP id="{329F0704-CF49-5A90-357A-72806BBA6C7A}" name="Source">
1212
<GROUP id="{C3E83797-8352-773C-9028-12ECA83F553B}" name="svg">

Source/Processor.cpp

Lines changed: 106 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ namespace audio
3636
meters()
3737
#if PPDHasStereoConfig
3838
, midSideEnabled(false)
39-
#endif
40-
#if PPDHasSidechain
41-
, scBuffer()
4239
#endif
4340
{
4441
{
@@ -78,6 +75,9 @@ namespace audio
7875

7976
bool ProcessorBackEnd::canAddBus(bool isInput) const
8077
{
78+
if (wrapperType == wrapperType_Standalone)
79+
return false;
80+
8181
return PPDHasSidechain ? isInput : false;
8282
}
8383

@@ -161,14 +161,19 @@ namespace audio
161161
void ProcessorBackEnd::processBlockBypassed(AudioBuffer& buffer, juce::MidiBuffer&)
162162
{
163163
macroProcessor();
164-
if (sus.suspendIfNeeded(buffer))
164+
165+
auto mainBus = getBus(true, 0);
166+
auto mainBuffer = mainBus->getBusBuffer(buffer);
167+
168+
if (sus.suspendIfNeeded(mainBuffer))
165169
return;
166-
const auto numSamples = buffer.getNumSamples();
170+
const auto numSamples = mainBuffer.getNumSamples();
167171
if (numSamples == 0)
168172
return;
169-
auto samples = buffer.getArrayOfWritePointers();
170-
const auto constSamples = buffer.getArrayOfReadPointers();
171-
const auto numChannels = buffer.getNumChannels();
173+
174+
auto samples = mainBuffer.getArrayOfWritePointers();
175+
const auto constSamples = mainBuffer.getArrayOfReadPointers();
176+
const auto numChannels = mainBuffer.getNumChannels();
172177

173178
dryWetMix.processBypass(samples, numChannels, numSamples);
174179
#if PPDHasGainIn
@@ -177,25 +182,58 @@ namespace audio
177182
meters.processOut(constSamples, numChannels, numSamples);
178183
}
179184

180-
AudioBuffer* ProcessorBackEnd::processBlockStart(AudioBuffer& buffer, juce::MidiBuffer& midi) noexcept
185+
// PROCESSOR
186+
187+
Processor::Processor() :
188+
ProcessorBackEnd()
181189
{
182-
midiLearn(midi);
190+
}
191+
192+
void Processor::prepareToPlay(double sampleRate, int maxBlockSize)
193+
{
194+
auto latency = 0;
195+
#if PPDHasHQ
196+
oversampler.setEnabled(params[PID::HQ]->getValMod() > .5f);
197+
oversampler.prepare(sampleRate, maxBlockSize);
198+
//const auto sampleRateUp = oversampler.getFsUp();
199+
//const auto sampleRateUpF = static_cast<float>(sampleRateUp);
200+
//const auto blockSizeUp = oversampler.getBlockSizeUp();
201+
latency = oversampler.getLatency();
202+
#endif
203+
const auto sampleRateF = static_cast<float>(sampleRate);
204+
205+
dryWetMix.prepare(sampleRateF, maxBlockSize, latency);
206+
207+
meters.prepare(sampleRateF, maxBlockSize);
208+
209+
setLatencySamples(latency);
183210

211+
sus.prepareToPlay();
212+
}
213+
214+
void Processor::processBlock(AudioBuffer& buffer, juce::MidiBuffer& midi)
215+
{
216+
const ScopedNoDenormals noDenormals;
217+
218+
midiLearn(midi);
184219
macroProcessor();
185220

186-
const auto numSamples = buffer.getNumSamples();
221+
auto mainBus = getBus(true, 0);
222+
auto mainBuffer = mainBus->getBusBuffer(buffer);
223+
224+
if (sus.suspendIfNeeded(mainBuffer))
225+
return;
226+
227+
const auto numSamples = mainBuffer.getNumSamples();
187228
if (numSamples == 0)
188-
return nullptr;
229+
return;
189230

190231
if (params[PID::Power]->getValMod() < .5f)
191-
{
192-
processBlockBypassed(buffer, midi);
193-
return nullptr;
194-
}
195-
196-
const auto numChannels = buffer.getNumChannels() == 1 ? 1 : 2;
232+
return processBlockBypassed(buffer, midi);
197233

198-
auto samples = buffer.getArrayOfWritePointers();
234+
const auto samples = mainBuffer.getArrayOfWritePointers();
235+
const auto constSamples = mainBuffer.getArrayOfReadPointers();
236+
const auto numChannels = mainBuffer.getNumChannels();
199237

200238
dryWetMix.saveDry(
201239
samples,
@@ -213,49 +251,62 @@ namespace audio
213251
, params[PID::UnityGain]->getValMod()
214252
#endif
215253
);
254+
216255
#if PPDHasGainIn
217-
const auto constSamples = buffer.getArrayOfReadPointers();
218256
meters.processIn(constSamples, numChannels, numSamples);
219257
#endif
258+
220259
#if PPDHasStereoConfig
221260
midSideEnabled = numChannels == 2 && params[PID::StereoConfig]->getValMod() > .5f;
222261
if (midSideEnabled)
223-
{
224-
encodeMS(samples, numSamples);
225-
{
262+
encodeMS(samples, numSamples, 0);
263+
#endif
264+
226265
#if PPDHasHQ
227-
return &oversampler.upsample(buffer);
266+
auto resampledBuf = &oversampler.upsample(buffer);
228267
#else
229-
return &buffer;
268+
auto resampledBuf = &buffer;
230269
#endif
231-
}
270+
271+
#if PPDHasSidechain
272+
if (wrapperType != wrapperType_Standalone)
273+
{
274+
const auto scBus = getBus(true, 1);
275+
if (scBus != nullptr)
276+
if(scBus->isEnabled())
277+
{
278+
const auto scBuffer = scBus->getBusBuffer(*resampledBuf);
279+
280+
processBlockCustom(
281+
resampledBuf->getArrayOfWritePointers(),
282+
resampledBuf->getNumChannels(),
283+
resampledBuf->getNumSamples(),
284+
scBuffer.getArrayOfReadPointers(),
285+
scBuffer.getNumChannels()
286+
);
287+
}
232288
}
233289
else
234-
#endif
235290
{
236-
#if PPDHasHQ
237-
return &oversampler.upsample(buffer);
291+
292+
}
238293
#else
239-
return &buffer;
294+
processBlockCustom(
295+
resampledBuf->getArrayOfWritePointers(),
296+
resampledBuf->getNumChannels(),
297+
resampledBuf->getNumSamples()
298+
);
240299
#endif
241-
}
242-
}
243-
244-
void ProcessorBackEnd::processBlockEnd(AudioBuffer& buffer) noexcept
245-
{
300+
246301
#if PPDHasHQ
247-
oversampler.downsample(buffer);
302+
oversampler.downsample(mainBuffer);
248303
#endif
249-
const auto samples = buffer.getArrayOfWritePointers();
250-
const auto constSamples = buffer.getArrayOfReadPointers();
251-
const auto numChannels = buffer.getNumChannels();
252-
const auto numSamples = buffer.getNumSamples();
253304

254305
#if PPDHasStereoConfig
255306
if (midSideEnabled)
256-
decodeMS(samples, numSamples);
307+
decodeMS(samples, numSamples, 0);
257308
#endif
258-
309+
259310
dryWetMix.processOutGain(samples, numChannels, numSamples);
260311
meters.processOut(constSamples, numChannels, numSamples);
261312
dryWetMix.processMix(samples, numChannels, numSamples);
@@ -276,71 +327,22 @@ namespace audio
276327
#endif
277328
}
278329

279-
// PROCESSOR
280-
281-
Processor::Processor() :
282-
ProcessorBackEnd()
283-
{
284-
}
285-
286-
void Processor::prepareToPlay(double sampleRate, int maxBlockSize)
287-
{
330+
void Processor::processBlockCustom(float** samples, int numChannels, int numSamples
288331
#if PPDHasSidechain
289-
scBuffer.setSize(2, maxBlockSize, false, false, false);
290-
#endif
291-
292-
auto latency = 0;
293-
#if PPDHasHQ
294-
oversampler.setEnabled(params[PID::HQ]->getValMod() > .5f);
295-
oversampler.prepare(sampleRate, maxBlockSize);
296-
const auto sampleRateUp = oversampler.getFsUp();
297-
const auto sampleRateUpF = static_cast<float>(sampleRateUp);
298-
const auto blockSizeUp = oversampler.getBlockSizeUp();
299-
latency = oversampler.getLatency();
332+
, const float** samplesSC, int numChannelsSC
300333
#endif
301-
const auto sampleRateF = static_cast<float>(sampleRate);
302-
303-
dryWetMix.prepare(sampleRateF, maxBlockSize, latency);
304-
305-
meters.prepare(sampleRateF, maxBlockSize);
306-
307-
setLatencySamples(latency);
308-
309-
sus.prepareToPlay();
310-
}
311-
312-
void Processor::processBlock(AudioBuffer& buffer, juce::MidiBuffer& midi)
334+
) noexcept
313335
{
314-
const juce::ScopedNoDenormals noDenormals;
315-
316-
if (sus.suspendIfNeeded(buffer))
317-
return;
318-
319-
auto buf = processBlockStart(buffer, midi);
320-
if (buf == nullptr)
321-
return;
322-
323-
#if PPDHasSidechain
324-
//const auto scBus = getBus(true, 1);
325-
//if (scBus == nullptr || !scBus->isEnabled())
326-
// return;
327-
328-
//scBuffer = scBus->getBusBuffer(scBuffer);
329-
#endif
330-
331-
processBlockCustom(
332-
buf->getArrayOfWritePointers(),
333-
buf->getNumChannels(),
334-
buf->getNumSamples()
335-
);
336-
337-
processBlockEnd(buffer);
338-
}
336+
for (auto ch = 0; ch < numChannels; ++ch)
337+
{
338+
const auto chSC = ch % numChannelsSC;
339+
const auto smplsSC = samplesSC[chSC];
340+
341+
auto smpls = samples[ch];
339342

340-
void Processor::processBlockCustom(float** samples, int numChannels, int numSamples) noexcept
341-
{
342-
const auto crushGain = params[PID::CrushGain]->getValModDenorm();
343-
crush(samples, numChannels, numSamples, crushGain);
343+
for (auto s = 0; s < numSamples; ++s)
344+
smpls[s] *= smplsSC[s] * 2.f;
345+
}
344346
}
345347

346348
void Processor::releaseResources() {}
@@ -359,4 +361,4 @@ namespace audio
359361
juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter()
360362
{
361363
return new audio::Processor();
362-
}
364+
}

Source/Processor.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,13 @@ namespace audio
6868
Oversampler oversampler;
6969
#endif
7070
Meters meters;
71-
#if PPDHasSidechain
72-
AudioBuffer scBuffer;
73-
#endif
7471

7572
void forcePrepareToPlay();
7673

7774
void timerCallback() override;
7875

7976
void processBlockBypassed(AudioBuffer&, juce::MidiBuffer&) override;
8077

81-
protected:
82-
AudioBuffer* processBlockStart(AudioBuffer&, juce::MidiBuffer&) noexcept;
83-
84-
void processBlockEnd(AudioBuffer&) noexcept;
85-
86-
private:
8778
#if PPDHasStereoConfig
8879
bool midSideEnabled;
8980
#endif
@@ -100,7 +91,12 @@ namespace audio
10091

10192
void processBlock(AudioBuffer&, juce::MidiBuffer&);
10293

103-
void processBlockCustom(float** /*samples*/ , int /*numChannels*/, int /*numSamples*/) noexcept;
94+
/* samples,numChannels,numSamples,samplesSC,numChannelsSC */
95+
void processBlockCustom(float**, int, int
96+
#if PPDHasSidechain
97+
, const float**, int
98+
#endif
99+
) noexcept;
104100

105101
void releaseResources() override;
106102

Source/audio/AudioUtils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ namespace audio
1717
using MIDIIt = juce::MidiBufferIterator;
1818
using MIDIRef = MIDIIt::reference;
1919
using Decibels = juce::Decibels;
20+
using ScopedNoDenormals = juce::ScopedNoDenormals;
2021

2122
using Smooth = smooth::Smooth<float>;
2223
using PID = param::PID;

Source/audio/MidSide.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,34 @@
33

44
namespace audio
55
{
6-
void encodeMS(float** samples, int numSamples) noexcept
6+
void encodeMS(float** samples, int numSamples, int ch0) noexcept
77
{
8+
const auto ch1 = ch0 + 1;
9+
810
for (auto s = 0; s < numSamples; ++s)
911
{
10-
const auto mid = samples[0][s] + samples[1][s];
11-
const auto side = samples[0][s] - samples[1][s];
12+
const auto mid = samples[ch0][s] + samples[ch1][s];
13+
const auto side = samples[ch0][s] - samples[ch1][s];
1214

13-
samples[0][s] = mid;
14-
samples[1][s] = side;
15+
samples[ch0][s] = mid;
16+
samples[ch1][s] = side;
1517
}
1618

17-
for (auto ch = 0; ch < 2; ++ch)
19+
for (auto ch = ch0; ch < ch0 + 2; ++ch)
1820
SIMD::multiply(samples[ch], .5f, numSamples);
1921
}
2022

21-
void decodeMS(float** samples, int numSamples) noexcept
23+
void decodeMS(float** samples, int numSamples, int ch0) noexcept
2224
{
25+
const auto ch1 = ch0 + 1;
26+
2327
for (auto s = 0; s < numSamples; ++s)
2428
{
25-
const auto left = samples[0][s] + samples[1][s];
26-
const auto right = samples[0][s] - samples[1][s];
29+
const auto left = samples[ch0][s] + samples[ch1][s];
30+
const auto right = samples[ch0][s] - samples[ch1][s];
2731

28-
samples[0][s] = left;
29-
samples[1][s] = right;
32+
samples[ch0][s] = left;
33+
samples[ch1][s] = right;
3034
}
3135
}
3236
}

0 commit comments

Comments
 (0)