#include "PluginProcessor.h" #include "PluginEditor.h" PascalcompressorAudioProcessor::PascalcompressorAudioProcessor() : AudioProcessor (BusesProperties() .withInput ("Input", juce::AudioChannelSet::stereo(), true) .withOutput ("Output", juce::AudioChannelSet::stereo(), true)), apvts (*this, nullptr, "PARAMS", createParameterLayout()) { } PascalcompressorAudioProcessor::~PascalcompressorAudioProcessor() = default; juce::AudioProcessorValueTreeState::ParameterLayout PascalcompressorAudioProcessor::createParameterLayout() { juce::AudioProcessorValueTreeState::ParameterLayout layout; layout.add (std::make_unique ("input", "Input", juce::NormalisableRange (-24.0f, 24.0f, 0.1f, 1.0f), 0.0f)); layout.add (std::make_unique ("threshold", "Threshold", juce::NormalisableRange (-60.0f, 0.0f, 0.1f, 1.0f), -18.0f)); layout.add (std::make_unique ("ratio", "Ratio", juce::NormalisableRange (1.0f, 20.0f, 0.05f, 0.4f), 2.0f)); layout.add (std::make_unique ("attack", "Attack", juce::NormalisableRange (0.1f, 200.0f, 0.1f, 0.35f), 10.0f)); layout.add (std::make_unique ("release", "Release", juce::NormalisableRange (10.0f, 3000.0f, 1.0f, 0.35f), 250.0f)); layout.add (std::make_unique ("makeup", "Makeup", juce::NormalisableRange (0.0f, 24.0f, 0.1f, 1.0f), 0.0f)); layout.add (std::make_unique ("drywet", "Dry/Wet", juce::NormalisableRange (0.0f, 100.0f, 1.0f, 1.0f), 100.0f)); return layout; } void PascalcompressorAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { juce::dsp::ProcessSpec spec; spec.sampleRate = sampleRate; spec.maximumBlockSize = static_cast (samplesPerBlock); spec.numChannels = static_cast (juce::jmax (1, getTotalNumInputChannels())); compressor.prepare (spec); } void PascalcompressorAudioProcessor::releaseResources() { } void PascalcompressorAudioProcessor::updateParameters() { compressor.setInputDb (*apvts.getRawParameterValue ("input")); compressor.setThresholdDb (*apvts.getRawParameterValue ("threshold")); compressor.setRatio (*apvts.getRawParameterValue ("ratio")); compressor.setAttackMs (*apvts.getRawParameterValue ("attack")); compressor.setReleaseMs (*apvts.getRawParameterValue ("release")); compressor.setMakeupDb (*apvts.getRawParameterValue ("makeup")); compressor.setDryWet (*apvts.getRawParameterValue ("drywet") * 0.01f); } void PascalcompressorAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer&) { updateParameters(); if (getTotalNumInputChannels() > 0) compressor.processBlock (buffer); } bool PascalcompressorAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const { if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono() && layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo()) return false; if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) return false; return true; } juce::AudioProcessorEditor* PascalcompressorAudioProcessor::createEditor() { return new pascal::PascalcompressorAudioProcessorEditor (*this); } void PascalcompressorAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = apvts.copyState(); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void PascalcompressorAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState != nullptr && xmlState->hasTagName (apvts.state.getType())) apvts.replaceState (juce::ValueTree::fromXml (*xmlState)); } juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new PascalcompressorAudioProcessor(); }