JUCE框架教程(6)——通过AudioProcessorValuetTeeState链接数据和UI
上节我们讲到了plugin的基本结构,processor和editor
https://blog.csdn.net/m0_56699208/article/details/126533353?spm=1001.2014.3001.5501
接下来我们会用一个叫AudioProcessorValuetTeeState的类来链接他们。
首先,我们进入PluginProcessor.h
文件,添加一个AudioProcessorValuetTeeState
类。
juce::AudioProcessorValueTreeState apvts;
在private下面,构建一个函数,返回值为juce::AudioProcessorValueTreeState::ParameterLayout
(JUCE的参数,数据)
private:
juce::AudioProcessorValueTreeState::ParameterLayout createParameters();
回到PluginProcessor.cpp
文件,末尾编写这个函数。
juce::AudioProcessorValueTreeState::ParameterLayout PlguinDemoAudioProcessor::createParameters() {
std::vector<std::unique_ptr<juce::RangedAudioParameter>> params; //points of RangedAudioParameters
//add params element to it
params.push_back(std::make_unique<juce::AudioParameterFloat>("Gain", "Gain", 0.0f,1.0f,0.5f));//id,name,min.max.startValue
return{ params.begin(),params.end() };
}
注意:
1.PlguinDemo是我这个项目的名字,你应该写成自己项目名字+AudioProcessor createParameters()
2.我们创建了一个指针vector,用来存放各个参数
3.我们使用push_back()
来新建参数,最后再return出去
写完这些,我们发现上方出现了报错,这是因为类AudioProcessorValuetTeeState不存在默认构造函数造成的
此时我们需要添加一个构造函数:
添加前:
PlguinDemoAudioProcessor::PlguinDemoAudioProcessor()
#ifndef JucePlugin_PreferredChannelConfigurations
: AudioProcessor(BusesProperties()
#if ! JucePlugin_IsMidiEffect
#if ! JucePlugin_IsSynth
.withInput("Input", juce::AudioChannelSet::stereo(), true)
#endif
.withOutput("Output", juce::AudioChannelSet::stereo(), true)
#endif
)
#endif
{
}
添加后:
PlguinDemoAudioProcessor::PlguinDemoAudioProcessor()
#ifndef JucePlugin_PreferredChannelConfigurations
: AudioProcessor(BusesProperties()
#if ! JucePlugin_IsMidiEffect
#if ! JucePlugin_IsSynth
.withInput("Input", juce::AudioChannelSet::stereo(), true)
#endif
.withOutput("Output", juce::AudioChannelSet::stereo(), true)
#endif
), apvts(*this, nullptr, "Parameters", createParameters())//this,null,name,functions
#endif
{
}
接下来,我们进行对ProcessorEditor的编写
首先添加一个Slider滑块
juce::Slider gainSlider
在cpp中将这个滑块实例化
gainSlider.setSliderStyle(juce::Slider::SliderStyle::RotaryHorizontalVerticalDrag);
gainSlider.setTextBoxStyle(juce::Slider::TextBoxBelow, true, 100, 50);
addAndMakeVisible(gainSlider);
void PlguinDemoAudioProcessorEditor::resized()
{
gainSlider.setBounds(getWidth() / 2 - 100, getHeight() / 2 - 50, 200, 100);
}
.h文件中添加用于绑定数据和界面的指针
std::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment> gainSliderAtachment;
.cpp
//attach the data to the slider
gainSliderAtachment = std::make_unique<juce::AudioProcessorValueTreeState::SliderAttachment>(audioProcessor.apvts,"Gain",gainSlider);
这里,我们使用了之前实例出的apvts,他存在于audioProcessor下
至此,我们成功使用AudioProcessorValuetTeeState链接数据和UI
我们可以在Processor中拿到这个变化的数据,并打印出来
auto g = apvts.getRawParameterValue("Gain");
std::cout << g->load();