NeuralPi

Raspberry Pi guitar pedal using neural networks to emulate real amps and effects
Log | Files | Refs | Submodules | README

commit 58a2a7754479ee7f8094c28189ce4d975ab2965d
parent f1393acd2b9ad9d34a1d74ee4aadeafa5c1ea2ef
Author: keith <kbloemer89@gmail.com>
Date:   Sun, 11 Jul 2021 20:46:04 -0500

Added toggle buttons for ir and model

Diffstat:
MSource/CabSim.h | 16----------------
MSource/PluginEditor.cpp | 25+++++++++++++++++++++++--
MSource/PluginEditor.h | 4++++
MSource/PluginProcessor.cpp | 21++++++++++++---------
MSource/PluginProcessor.h | 3++-
5 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/Source/CabSim.h b/Source/CabSim.h @@ -9,34 +9,19 @@ #pragma once - //============================================================================== -//template <typename Type> class CabSim { public: //============================================================================== CabSim() { - auto dir = juce::File::getCurrentWorkingDirectory(); - //auto dir = juce::File("C:\\Users\\rache\\Desktop\\dev\\NeuralPi\\resources"); - int numTries = 0; - - while (! dir.getChildFile ("resources").exists() && numTries++ < 15) - dir = dir.getParentDirectory(); - auto& convolution = processorChain.template get<convolutionIndex>(); - //convolution.loadImpulseResponse(dir.getChildFile("cassette_recorder.wav"), - convolution.loadImpulseResponse(dir.getChildFile("resources").getChildFile("guitar_amp.wav"), - juce::dsp::Convolution::Stereo::yes, - juce::dsp::Convolution::Trim::no, - 1024); } //============================================================================== void prepare (const juce::dsp::ProcessSpec& spec) { - //juce::ignoreUnused (spec); processorChain.prepare(spec); } @@ -63,7 +48,6 @@ public: } private: - //============================================================================== enum { convolutionIndex diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp @@ -96,6 +96,17 @@ NeuralPiAudioProcessorEditor::NeuralPiAudioProcessorEditor (NeuralPiAudioProcess loadIR.setColour(juce::Label::textColourId, juce::Colours::black); loadIR.addListener(this); + // Toggle IR + addAndMakeVisible(irButton); + irButton.setToggleState(true, juce::NotificationType::dontSendNotification); + irButton.onClick = [this] { updateToggleState(&irButton, "IR"); }; + + // Toggle LSTM + addAndMakeVisible(lstmButton); + lstmButton.setToggleState(true, juce::NotificationType::dontSendNotification); + lstmButton.onClick = [this] { updateToggleState(&lstmButton, "LSTM"); }; + + //gainSliderAttach = std::make_unique<AudioProcessorValueTreeState::SliderAttachment>(processor.treeState, GAIN_ID, ampGainKnob); addAndMakeVisible(ampGainKnob); //ampGainKnob.setLookAndFeel(&ampSilverKnobLAF); @@ -430,12 +441,14 @@ void NeuralPiAudioProcessorEditor::resized() { // This is generally where you'll want to lay out the positions of any // subcomponents in your editor.. - modelSelect.setBounds(19, 10, 234, 25); + modelSelect.setBounds(11, 10, 234, 25); loadButton.setBounds(19, 74, 100, 25); modelKnob.setBounds(140, 40, 75, 95); - irSelect.setBounds(19, 42, 234, 25); + irSelect.setBounds(11, 42, 234, 25); loadIR.setBounds(125, 74, 100, 25); + irButton.setBounds(248, 42, 257, 25); + lstmButton.setBounds(248, 10, 257, 25); // Amp Widgets ampGainKnob.setBounds(15, 120, 75, 95); @@ -491,6 +504,14 @@ void NeuralPiAudioProcessorEditor::irSelectChanged() //modelKnob.setValue(processor.current_model_index); } +void NeuralPiAudioProcessorEditor::updateToggleState(juce::Button* button, juce::String name) +{ + if (name == "IR") + processor.ir_state = button->getToggleState(); + else + processor.lstm_state = button->getToggleState(); +} + void NeuralPiAudioProcessorEditor::loadButtonClicked() { FileChooser chooser("Select one or more .json tone files to import", diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h @@ -93,10 +93,14 @@ private: TextButton loadButton; TextButton loadIR; + ToggleButton irButton; + ToggleButton lstmButton; + juce::String fname; virtual void buttonClicked(Button* button) override; void modelSelectChanged(); void loadButtonClicked(); + void updateToggleState(juce::Button* button, juce::String name); void irSelectChanged(); void loadIRClicked(); virtual void sliderValueChanged(Slider* slider) override; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp @@ -30,18 +30,18 @@ NeuralPiAudioProcessor::NeuralPiAudioProcessor() setupDataDirectories(); installTones(); resetDirectory(userAppDataDirectory_tones); + // Sort jsonFiles alphabetically + std::sort(jsonFiles.begin(), jsonFiles.end()); if (jsonFiles.size() > 0) { loadConfig(jsonFiles[current_model_index]); } - // Sort jsonFiles alphabetically - std::sort(jsonFiles.begin(), jsonFiles.end()); - + resetDirectoryIR(userAppDataDirectory_irs); + // Sort irFiles alphabetically + std::sort(irFiles.begin(), irFiles.end()); if (irFiles.size() > 0) { loadIR(irFiles[current_ir_index]); } - // Sort irFiles alphabetically - std::sort(irFiles.begin(), irFiles.end()); // initialize parameters: addParameter(gainParam = new AudioParameterFloat(GAIN_ID, GAIN_NAME, NormalisableRange<float>(0.0f, 1.0f, 0.01f), 0.5f)); @@ -194,7 +194,7 @@ void NeuralPiAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffe eq4band.process(buffer.getReadPointer(0), buffer.getWritePointer(0), midiMessages, numSamples, numInputChannels, sampleRate); // Apply LSTM model - if (model_loaded == 1) { + if (model_loaded == 1 && lstm_state == true) { if (current_model_index != model_index) { loadConfig(jsonFiles[model_index]); current_model_index = model_index; @@ -203,9 +203,11 @@ void NeuralPiAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffe } // Process IR - auto block = dsp::AudioBlock<float>(buffer).getSingleChannelBlock(0); - auto context = juce::dsp::ProcessContextReplacing<float>(block); - cabSimIR.process(context); + if (ir_state == true) { + auto block = dsp::AudioBlock<float>(buffer).getSingleChannelBlock(0); + auto context = juce::dsp::ProcessContextReplacing<float>(block); + cabSimIR.process(context); + } // Master Volume buffer.applyGain(master); @@ -315,6 +317,7 @@ void NeuralPiAudioProcessor::resetDirectoryIR(const File& file) file.findChildFiles(results, juce::File::findFiles, false, "*.wav"); for (int i = results.size(); --i >= 0;) irFiles.push_back(File(results.getReference(i).getFullPathName())); + } } diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h @@ -76,7 +76,6 @@ public: void getStateInformation (MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; - bool compareFunction(juce::File a, juce::File b); int getModelIndex(float model_param); void loadConfig(File configFile); void loadIR(File irFile); @@ -110,12 +109,14 @@ public: int current_model_index = 0; float num_models = 0.0; int model_index = 0; // Used in processBlock when converting slider param to model index + bool lstm_state = true; juce::String loaded_ir_name; float num_irs = 0.0; int ir_loaded = 0; int custom_ir = 0; // 0 = custom tone loaded, 1 = default channel tone File loaded_ir; + bool ir_state = true; int current_ir_index = 0;