How to call a varible that is in the PluginEditor.cpp to a file called ShelvingLowPass.cpp?

Hi,
I’m new with programming in C++ and JUCE, How do i get a value from a Slider as a double variable? or How do i get the value from it?

Welcome! There is a getValue() function you can call on the slider.

https://docs.juce.com/develop/classSlider.html#a288c6f5c7a76100a1e7526e002e10eb5

auto value = slider.getValue();

Thaks a lot, I alredy fix the problem looking a that link, it was a dumb question sorry. XD

no questions are dumb when you’re new to programming, JUCE or C++. We all have to start somewhere. That’s why I made this, to speed up the process and ease some of the ‘new programmer’ struggle: https://www.programmingformusicians.com/pfmcpp/

Thanks, a lot, now i’m having a new issue, I declared in the editor class a frequency slider and a gain slider, i got the value and i wanted to use those values in a .h and .ccp.

void EqAudioProcessorEditor::ObtenerValores(){

double g1 =  gananciaSlider.getValue();
double g2 =  ganancia2Slider.getValue();
double g3 =  ganancia3Slider.getValue();
double g4 =  ganancia4Slider.getValue();
double f1 =  frecuenciaSlider.getValue();
double f2 =  frecuencia2Slider.getValue();
double f3 = frecuencia3Slider.getValue();
double f4 = frecuencia4Slider.getValue();
double q1 = qSlider.getValue();
double q3 = q2Slider.getValue();

}

this is where i get the vaules at the PluginEditor.cpp

void ShelvingLowPass::coeficientes(double ganancia, double frecuencia,double frecuenciamuestreo)
{
double k= tan((PI*frecuencia)/frecuenciamuestreo);
if ((ganancia<-1)&& (ganancia>1)){
double gdB = 1.0;
}

if (ganancia>=1){ //Modo Boost
    double gdB = pow(10.0, ganancia/20.0);
    double b0 = ((gdB*pow(k,2.0)+sqrt(2.0*gdB)+1.0)/(pow(k,2.0)+sqrt(2.0)*k+1.0));
    double b1 = (2.0*gdB*pow(k,2.0)-2.0)/(pow(k,2.0)+sqrt(2.0)*k+1.0);
    double b2 = (gdB*pow(k,2)-sqrt(2*gdB)*k+1)/(pow(k,2.0)+sqrt(2.0)*k+1.0);
    double a0 = 1.0;
    double a1 = (2.0*pow(k,2.0)-2.0)/(pow(k,2.0)*sqrt(2.0)*k+1.0);
    double a2 = (pow(k,2)-sqrt(2)*k+1)/(pow(k,2)*sqrt(2.0)*k+1.0);
    double num[]= {b0, b1, b2};
    double den[]= {a0, a1, a2};
    
}

if (ganancia<=-1){ //Modo Cut
    double gdB = pow(10, ganancia/20);
    double b0 = (pow(k,2.0)+sqrt(2.0)*k+1.0)/(gdB*pow(k,2.0)+sqrt(2.0*gdB)*k+1.0);
    double b1 = (2.0*pow(k,2.0)-2.0)/(gdB*pow(k,2.0)+sqrt(2.0*gdB)*k+1.0);
    double b2 = (pow(k, 2.0)-sqrt(2.0)*k+1.0)/(gdB*pow(k,2.0)+sqrt(2.0*gdB)*k+1.0);
    double a0 = 1.0;
    double a1 = (2.0*pow(k,2.0)-2.0)/(gdB*pow(k,2.0)+sqrt(2.0*gdB)*k+1.0);
    double a2 = (gdB*pow(k, 2.0)-sqrt(2.0*gdB*k+1.0))/(gdB*pow(k,2.0)+sqrt(2.0*gdB)*k+1.0);
    double num[]= {b0, b1, b2};
    double den[]= {a0, a1, a2};
}

}

this is where i want to use those values that i got back in the PluginEditor.cpp

Thanks for the attention

Have a read through the tutorials here, specifically the ones about audio plugins:

https://juce.com/learn/tutorials

also, 3 backticks should surround your code to format it:

```
code
```

code

Especially this tutorial “Saving and loading values in a sophisticated manner”.

TL;DR: In your AudioProcessor create an AudioProcessorValueTreeState, that acts as data model for all audio parameters and handles host communication. To create GUI controls, use the suitable Attachment classes. That way the values are persistent, consistent with the parameters and always up to date in the processor, regardless if the user has a ProcessorEditor open or not.

Thanks a lot, I’ll try using the AudioprocessorValueTreeState with all of the parametres i need to use.

Hi, I’ve alredy used the AudioprocessorValueTreeState, the problem is now i’m getting this error.
“Constructor for ‘EqAudioProcessor’ must explicitly initialize the member ‘tree’ which does not have a default constructor”

/*
  ==============================================================================

    This file was auto-generated!

    It contains the basic framework code for a JUCE plugin processor.

  ==============================================================================
*/

#include "PluginProcessor.h"
#include "PluginEditor.h"
#include "ShelvingLowPass.h"
#include "PeakBandPass.h"


//==============================================================================
EqAudioProcessor::EqAudioProcessor()
#ifndef JucePlugin_PreferredChannelConfigurations
     : AudioProcessor (BusesProperties()
                     #if ! JucePlugin_IsMidiEffect
                      #if ! JucePlugin_IsSynth
                       .withInput  ("Input",  AudioChannelSet::stereo(), true)
                      #endif
                       .withOutput ("Output", AudioChannelSet::stereo(), true)
                     #endif
                       )
#endif
{
    NormalisableRange<float> Ganancia_1Range (-30.0, 30);
}

EqAudioProcessor::~EqAudioProcessor()
{
}

//==============================================================================
const String EqAudioProcessor::getName() const
{
    return JucePlugin_Name;
}

bool EqAudioProcessor::acceptsMidi() const
{
   #if JucePlugin_WantsMidiInput
    return true;
   #else
    return false;
   #endif
}

bool EqAudioProcessor::producesMidi() const
{
   #if JucePlugin_ProducesMidiOutput
    return true;
   #else
    return false;
   #endif
}

bool EqAudioProcessor::isMidiEffect() const
{
   #if JucePlugin_IsMidiEffect
    return true;
   #else
    return false;
   #endif
}

double EqAudioProcessor::getTailLengthSeconds() const
{
    return 0.0;
}

int EqAudioProcessor::getNumPrograms()
{
    return 1;   // NB: some hosts don't cope very well if you tell them there are 0 programs,
                // so this should be at least 1, even if you're not really implementing programs.
}

int EqAudioProcessor::getCurrentProgram()
{
    return 0;
}

void EqAudioProcessor::setCurrentProgram (int index)
{
}

const String EqAudioProcessor::getProgramName (int index)
{
    return {};
}

void EqAudioProcessor::changeProgramName (int index, const String& newName)
{
}

//==============================================================================
void EqAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
    // Use this method as the place to do any pre-playback
    // initialisation that you need..
}

void EqAudioProcessor::releaseResources()
{
    // When playback stops, you can use this as an opportunity to free up any
    // spare memory, etc.
}

#ifndef JucePlugin_PreferredChannelConfigurations
bool EqAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const
{
  #if JucePlugin_IsMidiEffect
    ignoreUnused (layouts);
    return true;
  #else
    // This is the place where you check if the layout is supported.
    // In this template code we only support mono or stereo.
    if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono()
     && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo())
        return false;

    // This checks if the input layout matches the output layout
   #if ! JucePlugin_IsSynth
    if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet())
        return false;
   #endif

    return true;
  #endif
}
#endif

void EqAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)
{
    ScopedNoDenormals noDenormals;
    auto totalNumInputChannels  = getTotalNumInputChannels();
    auto totalNumOutputChannels = getTotalNumOutputChannels();

    // In case we have more outputs than inputs, this code clears any output
    // channels that didn't contain input data, (because these aren't
    // guaranteed to be empty - they may contain garbage).
    // This is here to avoid people getting screaming feedback
    // when they first compile a plugin, but obviously you don't need to keep
    // this code if your algorithm always overwrites all the output channels.
    for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
        buffer.clear (i, 0, buffer.getNumSamples());

    // This is the place where you'd normally do the guts of your plugin's
    // audio processing...
    // Make sure to reset the state if your inner loop is processing
    // the samples and the outer loop is handling the channels.
    // Alternatively, you can process the samples with the channels
    // interleaved by keeping the same state.
    for (int channel = 0; channel < totalNumInputChannels; ++channel)
    {
        auto* channelData = buffer.getWritePointer (channel);

        // ..do something to the data...
    }
}

//==============================================================================
bool EqAudioProcessor::hasEditor() const
{
    return true; // (change this to false if you choose to not supply an editor)
}

AudioProcessorEditor* EqAudioProcessor::createEditor()
{
    return new EqAudioProcessorEditor (*this);
}

//==============================================================================
void EqAudioProcessor::getStateInformation (MemoryBlock& destData)
{
    // You should use this method to store your parameters in the memory block.
    // You could do that either as raw data, or use the XML or ValueTree classes
    // as intermediaries to make it easy to save and load complex data.
}

void EqAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
{
    // You should use this method to restore your parameters from this memory block,
    // whose contents will have been created by the getStateInformation() call.
}

void EqAudioProcessor::obtenerCoeficientes(){
    double FrecuenciaMuestreo = 44100.00;
    double G1 = *tree.getRawParameterValue("Ganancia_1");
    double Frecuencia1 = *tree.getRawParameterValue("Frecuencia_1");
    double G2 = *tree.getRawParameterValue("Ganancia_2");
    double Frecuencia2 = *tree.getRawParameterValue("Frecuencia_2");
    double Q1 = *tree.getRawParameterValue("Q_1");
    double G3 = *tree.getRawParameterValue("Ganancia_3");
    double Frecuencia3 = *tree.getRawParameterValue("Frecuencia_3");
    double Q2 = *tree.getRawParameterValue("Q_2");
    double G4 = *tree.getRawParameterValue("Ganancia_4");
    double Frecuencia4 = *tree.getRawParameterValue("Frecuencia_4");
    
    
    ShelvingLowPass* shelvingLowPass = new ShelvingLowPass;
    shelvingLowPass-> coeficientes(G1, Frecuencia1, FrecuenciaMuestreo);
    
    PeakBandPass* peakBandPass = new PeakBandPass;
    peakBandPass-> coeficientes(G2, Frecuencia2, FrecuenciaMuestreo, Q1);
    
    PeakBandPass* peakBandPass2 = new PeakBandPass;
    peakBandPass2-> coeficientes(G3, Frecuencia3, FrecuenciaMuestreo, Q2);
    
    std::cout <<shelvingLowPass << std::endl;
}
//==============================================================================
// This creates new instances of the plugin..
AudioProcessor* JUCE_CALLTYPE createPluginFilter()
{
    return new EqAudioProcessor();
}

This is the pluginprocessor.cpp

Thanks for helping me!!!

You need to initialize your ValueTree member named tree by passing arguments to its constructor in your member initializer list. Have you spent much time at www.learncpp.com or anything and learned about member initialization?

This continues in this thread: