diff --git a/Source/OperatorComponent.cpp b/Source/OperatorComponent.cpp index 37ced28..7f02a7c 100644 --- a/Source/OperatorComponent.cpp +++ b/Source/OperatorComponent.cpp @@ -15,7 +15,7 @@ OperatorComponent::OperatorComponent(int index, juce::AudioProcessorValueTreeState* pTree) : opIndex(index), envGraph(&delaySlider, &attackSlider, &holdSlider, &decaySlider, &sustainSlider, &releaseSlider), -waveButtons(index), +waveButtons(index, pTree), levelSlider(index), ratioSlider(index), ratioLabel(&ratioSlider.slider, ""), diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 9b829d5..e69f8d7 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -174,6 +174,7 @@ synthFilter(juce::dsp::IIR::Coefficients::makeLowPass(44100.0f, 2500.0f, modIndexIds.push_back("indexParam" + iStr); audibleIds.push_back("audibleParam" + iStr); panIds.push_back("panParam" + iStr); + waveIds.push_back("waveParam" + iStr); delayIds.push_back("delayParam" + iStr); attackIds.push_back("attackParam" + iStr); diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index a4ca211..e351b23 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -72,6 +72,7 @@ class HexFmAudioProcessor : public juce::AudioProcessor std::vector levelIds; std::vector modIndexIds; std::vector audibleIds; + std::vector waveIds; std::vector delayIds; std::vector attackIds; diff --git a/Source/WaveTypeSelector.cpp b/Source/WaveTypeSelector.cpp index 8fac7c7..d621430 100644 --- a/Source/WaveTypeSelector.cpp +++ b/Source/WaveTypeSelector.cpp @@ -23,7 +23,8 @@ void ImageToggle::paintButton(juce::Graphics &g, bool down, bool highlighted) } //============================================================================== -WaveButtonSet::WaveButtonSet(int opIndex) : +WaveButtonSet::WaveButtonSet(int opIndex, juce::AudioProcessorValueTreeState* tree) : +currentType(Sine), sineButton(ImageToggle::getForWave(Sine, true), ImageToggle::getForWave(Sine, false)), squareButton(ImageToggle::getForWave(Square, true), ImageToggle::getForWave(Square, false)), sawButton(ImageToggle::getForWave(Saw, true), ImageToggle::getForWave(Saw, false)), @@ -33,11 +34,25 @@ triButton(ImageToggle::getForWave(Tri, true), ImageToggle::getForWave(Tri, false addAndMakeVisible(&squareButton); addAndMakeVisible(&sawButton); addAndMakeVisible(&triButton); + sineButton.addListener(this); + squareButton.addListener(this); + sawButton.addListener(this); + triButton.addListener(this); + + addAndMakeVisible(&hiddenBox); + hiddenBox.addListener(this); + hiddenBox.addItem("Sine", 1); + hiddenBox.addItem("Square", 2); + hiddenBox.addItem("Saw", 3); + hiddenBox.addItem("Tri", 4); + int radioNum = 60 + opIndex; sineButton.setRadioGroupId(radioNum); squareButton.setRadioGroupId(radioNum); sawButton.setRadioGroupId(radioNum); triButton.setRadioGroupId(radioNum); + auto waveId = "waveParam" + juce::String(opIndex); + waveAttach.reset(new juce::AudioProcessorValueTreeState::ComboBoxAttachment(*tree, waveId, hiddenBox)); } void WaveButtonSet::resized() @@ -50,3 +65,39 @@ void WaveButtonSet::resized() triButton.setBounds(bounds); } +void WaveButtonSet::buttonClicked(juce::Button *b) +{ + if(b == &sineButton) + { + currentType = Sine; + hiddenBox.setSelectedId(1); + } + else if(b == &squareButton) + { + currentType = Square; + hiddenBox.setSelectedId(2); + } + else if(b == &sawButton) + { + currentType = Saw; + hiddenBox.setSelectedId(3); + } + else if(b == &triButton) + { + currentType = Tri; + hiddenBox.setSelectedId(4); + } +} + +void WaveButtonSet::comboBoxChanged(juce::ComboBox *box) +{ + auto waveId = box->getSelectedId(); + if(waveId == 1 && !sineButton.getToggleState()) + sineButton.triggerClick(); + else if(waveId == 2 && !squareButton.getToggleState()) + squareButton.triggerClick(); + else if(waveId == 3 && !sawButton.getToggleState()) + sawButton.triggerClick(); + else if(waveId == 4 && !triButton.getToggleState()) + triButton.triggerClick(); +} diff --git a/Source/WaveTypeSelector.h b/Source/WaveTypeSelector.h index ec8f58f..e6fb715 100644 --- a/Source/WaveTypeSelector.h +++ b/Source/WaveTypeSelector.h @@ -58,14 +58,22 @@ class ImageToggle : public juce::ImageButton }; -class WaveButtonSet : public juce::Component +class WaveButtonSet : +public juce::Component, +public juce::Button::Listener, +public juce::ComboBox::Listener { public: - WaveButtonSet(int opIndex); + WaveButtonSet(int opIndex, juce::AudioProcessorValueTreeState* tree); void resized() override; + void buttonClicked(juce::Button* b) override; + void comboBoxChanged(juce::ComboBox* box) override; private: + WaveType currentType; ImageToggle sineButton; ImageToggle squareButton; ImageToggle sawButton; ImageToggle triButton; + juce::ComboBox hiddenBox; + std::unique_ptr waveAttach; };