diff --git a/Source/Processors/Editors/FilterEditor.cpp b/Source/Processors/Editors/FilterEditor.cpp index 6f405d7fbc04154f001530140d3624da3f90d12b..9beedcc4edda560cea9e4a070473cf07b2709f3a 100755 --- a/Source/Processors/Editors/FilterEditor.cpp +++ b/Source/Processors/Editors/FilterEditor.cpp @@ -36,35 +36,52 @@ FilterEditor::FilterEditor(GenericProcessor* parentNode, bool useDefaultParamete lastHighCutString = " "; highCutLabel = new Label("high cut label", "High cut:"); - highCutLabel->setBounds(35,80,80,20); + highCutLabel->setBounds(10,65,80,20); highCutLabel->setFont(Font("Small Text", 12, Font::plain)); highCutLabel->setColour(Label::textColourId, Colours::darkgrey); addAndMakeVisible(highCutLabel); lowCutLabel = new Label("low cut label", "Low cut:"); - lowCutLabel->setBounds(35,30,80,20); + lowCutLabel->setBounds(10,25,80,20); lowCutLabel->setFont(Font("Small Text", 12, Font::plain)); lowCutLabel->setColour(Label::textColourId, Colours::darkgrey); addAndMakeVisible(lowCutLabel); lowCutValue = new Label("low cut value", lastLowCutString); - lowCutValue->setBounds(40,50,60,20); + lowCutValue->setBounds(15,42,60,18); lowCutValue->setFont(Font("Default", 15, Font::plain)); lowCutValue->setColour(Label::textColourId, Colours::white); lowCutValue->setColour(Label::backgroundColourId, Colours::grey); lowCutValue->setEditable(true); lowCutValue->addListener(this); + lowCutValue->setTooltip("Set the low cut for the selected channels"); addAndMakeVisible(lowCutValue); highCutValue = new Label("high cut label", lastHighCutString); - highCutValue->setBounds(40,100,60,20); + highCutValue->setBounds(15,82,60,18); highCutValue->setFont(Font("Default", 15, Font::plain)); highCutValue->setColour(Label::textColourId, Colours::white); highCutValue->setColour(Label::backgroundColourId, Colours::grey); highCutValue->setEditable(true); highCutValue->addListener(this); + highCutValue->setTooltip("Set the high cut for the selected channels"); addAndMakeVisible(highCutValue); + applyFilterOnADC = new UtilityButton("+ADCs",Font("Default", 10, Font::plain)); + applyFilterOnADC->addListener(this); + applyFilterOnADC->setBounds(90,70,40,18); + applyFilterOnADC->setClickingTogglesState(true); + applyFilterOnADC->setTooltip("When this button is off, ADC channels will not be filtered"); + addAndMakeVisible(applyFilterOnADC); + + applyFilterOnChan = new UtilityButton("+CH",Font("Default", 10, Font::plain)); + applyFilterOnChan->addListener(this); + applyFilterOnChan->setBounds(95,95,30,18); + applyFilterOnChan->setClickingTogglesState(true); + applyFilterOnChan->setToggleState(true, false); + applyFilterOnChan->setTooltip("When this button is off, selected channels will not be filtered"); + addAndMakeVisible(applyFilterOnChan); + } FilterEditor::~FilterEditor() @@ -117,11 +134,11 @@ void FilterEditor::labelTextChanged(Label* label) if (label == highCutValue) { - double minVal = fn->getLowCutValueForChannel(n); + double minVal = fn->getLowCutValueForChannel(chans[n]); if (requestedValue > minVal) { - fn->setCurrentChannel(n); + fn->setCurrentChannel(chans[n]); fn->setParameter(1, requestedValue); } @@ -130,11 +147,11 @@ void FilterEditor::labelTextChanged(Label* label) } else { - double maxVal = fn->getHighCutValueForChannel(n); + double maxVal = fn->getHighCutValueForChannel(chans[n]); if (requestedValue < maxVal) { - fn->setCurrentChannel(n); + fn->setCurrentChannel(chans[n]); fn->setParameter(0, requestedValue); } @@ -145,39 +162,42 @@ void FilterEditor::labelTextChanged(Label* label) } -void FilterEditor::buttonEvent(Button* button) +void FilterEditor::channelChanged(int chan) { - //std::cout << button->getRadioGroupId() << " " << button->getName() << std::endl; - - //if (!checkDrawerButton(button) && !checkChannelSelectors(button)) { - - // String value = button->getName(); - // float val; + FilterNode* fn = (FilterNode*) getProcessor(); - // val = value.getFloatValue(); + highCutValue->setText(String(fn->getHighCutValueForChannel(chan)), dontSendNotification); + lowCutValue->setText(String(fn->getLowCutValueForChannel(chan)), dontSendNotification); + applyFilterOnChan->setToggleState(fn->getBypassStatusForChannel(chan), false); - // Array<int> chans = getActiveChannels(); +} - // GenericProcessor* p = (GenericProcessor*) getAudioProcessor(); +void FilterEditor::buttonEvent(Button* button) +{ - // for (int n = 0; n < chans.size(); n++) - // { + if (button == applyFilterOnADC) + { + FilterNode* fn = (FilterNode*) getProcessor(); + fn->setApplyOnADC(applyFilterOnADC->getToggleState()); - // p->setCurrentChannel(chans[n]); + } else if (button == applyFilterOnChan) + { + FilterNode* fn = (FilterNode*) getProcessor(); - // if (button->getRadioGroupId() == 1) - // getAudioProcessor()->setParameter(0,val); - // else - // getAudioProcessor()->setParameter(1,val*1000.0f); + Array<int> chans = getActiveChannels(); - // } - //std::cout << button->getRadioGroupId() << " " << val << std::endl; - // } + for (int n = 0; n < chans.size(); n++) + { + float newValue = button->getToggleState() ? 1.0 : 0.0; + fn->setCurrentChannel(chans[n]); + fn->setParameter(2, newValue); + } + } } -void FilterEditor::saveEditorParameters(XmlElement* xml) +void FilterEditor::saveCustomParameters(XmlElement* xml) { xml->setAttribute("Type", "FilterEditor"); @@ -185,9 +205,10 @@ void FilterEditor::saveEditorParameters(XmlElement* xml) XmlElement* textLabelValues = xml->createNewChildElement("VALUES"); textLabelValues->setAttribute("HighCut",lastHighCutString); textLabelValues->setAttribute("LowCut",lastLowCutString); + textLabelValues->setAttribute("ApplyToADC", applyFilterOnADC->getToggleState()); } -void FilterEditor::loadEditorParameters(XmlElement* xml) +void FilterEditor::loadCustomParameters(XmlElement* xml) { forEachXmlChildElement(*xml, xmlNode) @@ -196,6 +217,7 @@ void FilterEditor::loadEditorParameters(XmlElement* xml) { highCutValue->setText(xmlNode->getStringAttribute("HighCut"),dontSendNotification); lowCutValue->setText(xmlNode->getStringAttribute("LowCut"),dontSendNotification); + applyFilterOnADC->setToggleState(xmlNode->getBoolAttribute("ApplyToADC",false),true); } } } diff --git a/Source/Processors/Editors/FilterEditor.h b/Source/Processors/Editors/FilterEditor.h index 907c20d1444fbbbc3592922fc25ef37e98b3adc0..58945523e182ceaf3ac40c6270526b85a7f3e7e1 100755 --- a/Source/Processors/Editors/FilterEditor.h +++ b/Source/Processors/Editors/FilterEditor.h @@ -39,20 +39,22 @@ class FilterViewport; */ class FilterEditor : public GenericEditor, - public Label::Listener + public Label::Listener { public: FilterEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); virtual ~FilterEditor(); - void buttonEvent(Button* button); + void buttonEvent(Button* button); void labelTextChanged(Label* label); - void saveEditorParameters(XmlElement* xml); - void loadEditorParameters(XmlElement* xml); + void saveCustomParameters(XmlElement* xml); + void loadCustomParameters(XmlElement* xml); void setDefaults(double lowCut, double highCut); + void channelChanged(int chan); + private: String lastHighCutString; @@ -63,6 +65,8 @@ private: ScopedPointer<Label> highCutValue; ScopedPointer<Label> lowCutValue; + ScopedPointer<UtilityButton> applyFilterOnADC; + ScopedPointer<UtilityButton> applyFilterOnChan; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FilterEditor); diff --git a/Source/Processors/FilterNode.cpp b/Source/Processors/FilterNode.cpp index 6a97cb9d7266bcd5f122fc9de43807c6f29d7e48..44c7346cd4f3586228828bf4b7cc1c03e0a3a9d4 100755 --- a/Source/Processors/FilterNode.cpp +++ b/Source/Processors/FilterNode.cpp @@ -46,7 +46,7 @@ FilterNode::FilterNode() // highCutValues.add(9000.0f); // parameters.add(Parameter("high cut",highCutValues, 2, 1)); - + applyOnADC = false; } FilterNode::~FilterNode() @@ -126,13 +126,20 @@ AudioProcessorEditor* FilterNode::createEditor() void FilterNode::updateSettings() { - - if (getNumInputs() < 1024 && getNumInputs() != filters.size()) + int id = nodeId; + int numInputs = getNumInputs(); + int numfilt = filters.size(); + if (numInputs < 1024 && numInputs != numfilt) { + // SO fixed this. I think values were never restored correctly because you cleared lowCuts. + Array<double> oldlowCuts, oldhighCuts; + oldlowCuts = lowCuts; + oldhighCuts = highCuts; filters.clear(); lowCuts.clear(); highCuts.clear(); + shouldFilterChannel.clear(); for (int n = 0; n < getNumInputs(); n++) { @@ -154,12 +161,14 @@ void FilterNode::updateSettings() // restore defaults + shouldFilterChannel.add(true); + float lc, hc; - if (lowCuts.size() > n) + if (oldlowCuts.size() > n) { - lc = lowCuts[n]; - hc = highCuts[n]; + lc = oldlowCuts[n]; + hc = oldhighCuts[n]; } else { lc = defaultLowCut; hc = defaultHighCut; @@ -173,6 +182,8 @@ void FilterNode::updateSettings() } + setApplyOnADC(applyOnADC); + } double FilterNode::getLowCutValueForChannel(int chan) @@ -185,6 +196,11 @@ double FilterNode::getHighCutValueForChannel(int chan) return highCuts[chan]; } +bool FilterNode::getBypassStatusForChannel(int chan) +{ + return shouldFilterChannel[chan]; +} + void FilterNode::setFilterParameters(double lowCut, double highCut, int chan) { @@ -202,52 +218,41 @@ void FilterNode::setFilterParameters(double lowCut, double highCut, int chan) void FilterNode::setParameter(int parameterIndex, float newValue) { - if (newValue <= 0.01 || newValue >= 10000.0f) - return; + if (parameterIndex < 2) // change filter settings + { - //std::cout << "Setting channel " << currentChannel;// << std::endl; + if (newValue <= 0.01 || newValue >= 10000.0f) + return; - if (parameterIndex == 0) - { - // std::cout << " low cut to " << newValue << std::endl; - lowCuts.set(currentChannel,newValue); - } - else - { - //std::cout << " high cut to " << newValue << std::endl; - highCuts.set(currentChannel,newValue); - } + //std::cout << "Setting channel " << currentChannel;// << std::endl; - //std::cout << newValue << std::endl; + if (parameterIndex == 0) + { + // std::cout << " low cut to " << newValue << std::endl; + lowCuts.set(currentChannel,newValue); + } + else if (parameterIndex == 1) + { + //std::cout << " high cut to " << newValue << std::endl; + highCuts.set(currentChannel,newValue); + } - setFilterParameters(lowCuts[currentChannel], + setFilterParameters(lowCuts[currentChannel], highCuts[currentChannel], currentChannel); + editor->updateParameterButtons(parameterIndex); - // Deprecated code: - //if (parameterIndex) - // - // Parameter& p = parameters.getReference(parameterIndex); - - // p.setValue(newValue, currentChannel); - - // Parameter& p1 = parameters.getReference(0); - // Parameter& p2 = parameters.getReference(1); - - // std::cout << float(p1[currentChannel]) << " "; - // std::cout << float(p2[currentChannel]) << std::endl; - - // if (parameterIndex == 0) { - // parameters[0].setValue(newValue, currentChannel); - // setFilterParameters(newValue, parameters[0][currentChannel], currentChannel); - // } else { - // parameters[1].setValue(newValue, currentChannel); - // setFilterParameters(lowCuts[currentChannel], newValue, currentChannel); - // } - - editor->updateParameterButtons(parameterIndex); - + } else // change channel bypass state + { + if (newValue == 0) + { + shouldFilterChannel.set(currentChannel, false); + } else { + shouldFilterChannel.set(currentChannel, true); + } + + } } void FilterNode::process(AudioSampleBuffer& buffer, @@ -257,12 +262,32 @@ void FilterNode::process(AudioSampleBuffer& buffer, for (int n = 0; n < getNumOutputs(); n++) { - float* ptr = buffer.getSampleData(n); - filters[n]->process(nSamples, &ptr); + if (shouldFilterChannel[n]) + { + float* ptr = buffer.getSampleData(n); + filters[n]->process(nSamples, &ptr); + } } } +void FilterNode::setApplyOnADC(bool state) +{ + + for (int n = 0; n < channels.size(); n++) + { + if (channels[n]->isADCchannel) + { + setCurrentChannel(n); + + if (state) + setParameter(2,1.0); + else + setParameter(2,0.0); + } + } +} + void FilterNode::saveCustomChannelParametersToXml(XmlElement* channelInfo, int channelNumber, bool isEventChannel) { @@ -275,6 +300,7 @@ void FilterNode::saveCustomChannelParametersToXml(XmlElement* channelInfo, int c XmlElement* channelParams = channelInfo->createNewChildElement("PARAMETERS"); channelParams->setAttribute("highcut",highCuts[channelNumber]); channelParams->setAttribute("lowcut",lowCuts[channelNumber]); + channelParams->setAttribute("shouldFilter",shouldFilterChannel[channelNumber]); } } @@ -292,6 +318,7 @@ void FilterNode::loadCustomChannelParametersFromXml(XmlElement* channelInfo, boo { highCuts.set(channelNum, subNode->getDoubleAttribute("highcut",defaultHighCut)); lowCuts.set(channelNum, subNode->getDoubleAttribute("lowcut",defaultLowCut)); + shouldFilterChannel.set(channelNum, subNode->getBoolAttribute("shouldFilter",true)); setFilterParameters(lowCuts[channelNum], highCuts[channelNum], diff --git a/Source/Processors/FilterNode.h b/Source/Processors/FilterNode.h index 82857b32fd64b7653aab26e7a1781697fb740cd0..b5ea5f337df644410b623258331f74b1c7dc47cb 100755 --- a/Source/Processors/FilterNode.h +++ b/Source/Processors/FilterNode.h @@ -58,18 +58,22 @@ public: double getLowCutValueForChannel(int chan); double getHighCutValueForChannel(int chan); + bool getBypassStatusForChannel(int chan); void updateSettings(); void saveCustomChannelParametersToXml(XmlElement* channelInfo, int channelNumber, bool isEventChannel); void loadCustomChannelParametersFromXml(XmlElement* channelInfo, bool isEventChannel); - + + void setApplyOnADC(bool state); private: Array<double> lowCuts, highCuts; OwnedArray<Dsp::Filter> filters; + Array<bool> shouldFilterChannel; + bool applyOnADC; double defaultLowCut; double defaultHighCut;