#include "PluginProcessor.h"
#include "PluginEditor.h"
AudioPluginAudioProcessor::AudioPluginAudioProcessor()
: AudioProcessor(BusesProperties()
#if !JucePlugin_IsMidiEffect
#if !JucePlugin_IsSynth
.withInput("Input", juce::AudioChannelSet::stereo(), true)
#endif
.withOutput("Output", juce::AudioChannelSet::stereo(), true)
#endif
),
parameters(*this, nullptr, juce::Identifier("Parameters"),
{
std::make_unique<juce::AudioParameterFloat>("shroom", "Shroom", 0.0f, 1.0f, 0.0f)
})
{
shroomParameter = dynamic_cast<juce::AudioParameterFloat*>(parameters.getParameter("shroom"));
}
AudioPluginAudioProcessor::~AudioPluginAudioProcessor() {}
void AudioPluginAudioProcessor::prepareToPlay(double sampleRate, int samplesPerBlock)
{
juce::dsp::ProcessSpec spec;
spec.sampleRate = sampleRate;
spec.maximumBlockSize = samplesPerBlock;
spec.numChannels = getTotalNumOutputChannels();
compressor.prepare(spec);
eqFilterLow.prepare(spec);
eqFilterHigh.prepare(spec);
reverbParams.roomSize = 0.5f;
reverb.setParameters(reverbParams);
updateDspParameters();
}
void AudioPluginAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer, juce::MidiBuffer&)
{
juce::ScopedNoDenormals noDenormals;
auto totalNumInputChannels = getTotalNumInputChannels();
auto totalNumOutputChannels = getTotalNumOutputChannels();
if (totalNumInputChannels == 1 && totalNumOutputChannels == 2)
{
for (int sample = 0; sample < buffer.getNumSamples(); ++sample)
{
auto monoSample = buffer.getSample(0, sample);
buffer.setSample(0, sample, monoSample);
buffer.setSample(1, sample, monoSample);
}
}
for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
buffer.clear(i, 0, buffer.getNumSamples());
updateDspParameters();
juce::dsp::AudioBlock<float> block(buffer);
for (size_t chan = 0; chan < block.getNumChannels(); ++chan)
{
auto channelBlock = block.getSingleChannelBlock(chan);
juce::dsp::ProcessContextReplacing<float> context(channelBlock);
compressor.process(context);
eqFilterLow.process(context);
eqFilterHigh.process(context);
reverb.process(context);
}
}
void AudioPluginAudioProcessor::releaseResources() {}
void AudioPluginAudioProcessor::getStateInformation(juce::MemoryBlock& destData)
{
auto state = parameters.copyState();
std::unique_ptr<juce::XmlElement> xml(state.createXml());
copyXmlToBinary(*xml, destData);
}
void AudioPluginAudioProcessor::setStateInformation(const void* data, int sizeInBytes)
{
std::unique_ptr<juce::XmlElement> xmlState(getXmlFromBinary(data, sizeInBytes));
if (xmlState != nullptr && xmlState->hasTagName(parameters.state.getType()))
{
parameters.replaceState(juce::ValueTree::fromXml(*xmlState));
}
}
juce::AudioProcessorEditor* AudioPluginAudioProcessor::createEditor()
{
return new AudioPluginAudioProcessorEditor(*this);
}
bool AudioPluginAudioProcessor::hasEditor() const
{
return true;
}
const juce::String AudioPluginAudioProcessor::getName() const
{
return JucePlugin_Name;
}
bool AudioPluginAudioProcessor::acceptsMidi() const
{
#if JucePlugin_WantsMidiInput
return true;
#else
return false;
#endif
}
bool AudioPluginAudioProcessor::producesMidi() const
{
#if JucePlugin_ProducesMidiOutput
return true;
#else
return false;
#endif
}
bool AudioPluginAudioProcessor::isMidiEffect() const
{
#if JucePlugin_IsMidiEffect
return true;
#else
return false;
#endif
}
double AudioPluginAudioProcessor::getTailLengthSeconds() const
{
return 0.0;
}
int AudioPluginAudioProcessor::getNumPrograms()
{
return 1;
}
int AudioPluginAudioProcessor::getCurrentProgram()
{
return 0;
}
void AudioPluginAudioProcessor::setCurrentProgram(int index)
{
}
const juce::String AudioPluginAudioProcessor::getProgramName(int index)
{
return {};
}
void AudioPluginAudioProcessor::changeProgramName(int index, const juce::String& newName)
{
}
void AudioPluginAudioProcessor::updateDspParameters()
{
float shroomValue = *shroomParameter;
compressor.setThreshold(juce::jmap(shroomValue, 0.0f, 1.0f, -20.0f, -30.0f));
compressor.setRatio(juce::jmap(shroomValue, 0.0f, 1.0f, 1.5f, 8.0f));
compressor.setAttack(20.0f);
compressor.setRelease(100.0f);
auto eqCoefficientsLow = juce::dsp::IIR::Coefficients<float>::makePeakFilter(getSampleRate(), 330.0f, 0.671f, juce::Decibels::decibelsToGain(juce::jmap(shroomValue, 0.0f, 1.0f, 0.0f, -7.0f)));
eqFilterLow.coefficients = *eqCoefficientsLow;
auto eqCoefficientsHigh = juce::dsp::IIR::Coefficients<float>::makePeakFilter(getSampleRate(), 6000.0f, 0.263f, juce::Decibels::decibelsToGain(juce::jmap(shroomValue, 0.0f, 1.0f, 0.0f, 10.0f)));
eqFilterHigh.coefficients = *eqCoefficientsHigh;
reverbParams.roomSize = juce::jmap(shroomValue, 0.0f, 1.0f, 0.5f, 0.9f);
reverbParams.damping = 1.0f;
reverbParams.wetLevel = juce::jmap(shroomValue, 0.0f, 1.0f, 0.0f, 0.05f);
reverbParams.dryLevel = 1.0f - reverbParams.wetLevel;
reverbParams.width = 1.0f;
reverbParams.freezeMode = 0.0f;
reverb.setParameters(reverbParams);
}
juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter()
{
return new AudioPluginAudioProcessor();
}
This is my code… It has a comp, equalizer, and a reverberation function! But when I tried this plug-in, I got weird noise… What’s the reason? I’m attaching the Dry Wet file!