Proteus

Guitar amp and pedal capture plugin using neural networks
Log | Files | Refs | Submodules | README

commit aa3f53d60cc50c97874196c40078fd44583a81c3
parent 585810a7c6a29e0cce2570e1d1d3b5eee23e3f63
Author: Keith <smartguitarml@gmail.com>
Date:   Thu,  6 Oct 2022 20:39:39 -0500

Updates

Diffstat:
Msrc/PluginProcessor.cpp | 11++++++-----
Msrc/RTNeuralLSTM.cpp | 55+++++++++++++++++++++++++++++++++++++++++++++----------
Msrc/RTNeuralLSTM.h | 3+++
3 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/src/PluginProcessor.cpp b/src/PluginProcessor.cpp @@ -171,10 +171,10 @@ void ProteusAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer // Apply ramped changes for gain smoothing if (driveValue == previousDriveValue) { - buffer.applyGain(driveValue*10.0); + buffer.applyGain(driveValue*2.5); } else { - buffer.applyGainRamp(0, (int) buffer.getNumSamples(), previousDriveValue * 10.0, driveValue * 10.0); + buffer.applyGainRamp(0, (int) buffer.getNumSamples(), previousDriveValue * 2.5, driveValue * 2.5); previousDriveValue = driveValue; } auto block44k = resampler.processIn(block); @@ -190,7 +190,7 @@ void ProteusAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer } resampler.processOut(block44k, block); } else { - buffer.applyGain(5.0); // Apply default boost to help sound + buffer.applyGain(1.5); // Apply default boost to help sound // resample to target sample rate auto block44k = resampler.processIn(block); @@ -213,10 +213,10 @@ void ProteusAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer // Apply ramped changes for gain smoothing if (masterValue == previousMasterValue) { - buffer.applyGain(masterValue); + buffer.applyGain(masterValue*1.2); } else { - buffer.applyGainRamp(0, (int) buffer.getNumSamples(), previousMasterValue, masterValue); + buffer.applyGainRamp(0, (int) buffer.getNumSamples(), previousMasterValue * 1.2, masterValue * 1.2); previousMasterValue = masterValue; } } @@ -285,6 +285,7 @@ void ProteusAudioProcessor::loadConfig(File configFile) LSTM.reset(); LSTM2.reset(); + LSTM.load_json(char_filename); LSTM2.load_json(char_filename); diff --git a/src/RTNeuralLSTM.cpp b/src/RTNeuralLSTM.cpp @@ -52,23 +52,39 @@ void RT_LSTM::load_json(const char* filename) { // Read in the JSON file std::ifstream i2(filename); - nlohmann::json weights_json; - i2 >> weights_json; + nlohmann::json weights_json; + i2 >> weights_json; + + // Check that format is correct + /* + int hidden_size_temp = 0; + std::string network; + try { + hidden_size_temp = weights_json["/model_data/hidden_size"_json_pointer]; + network = weights_json["/model_data/unit_type"_json_pointer]; + throw(hidden_size_temp); + } + catch (int hidden_size_temp) { + return; + } + */ + //if (hidden_size_temp == 40 && network == "LSTM") { // Get the input size of the JSON file - int input_size_json = weights_json["/model_data/input_size"_json_pointer]; - input_size = input_size_json; + int input_size_json = weights_json["/model_data/input_size"_json_pointer]; + input_size = input_size_json; // Load the appropriate model if (input_size == 1) { - set_weights(&model, filename); + set_weights(&model, filename); } else if (input_size == 2) { - set_weights(&model_cond1, filename); - } + set_weights(&model_cond1, filename); + } else if (input_size == 3) { - set_weights(&model_cond2, filename); - } + set_weights(&model_cond2, filename); + } + //} } @@ -83,17 +99,36 @@ void RT_LSTM::reset() void RT_LSTM::process(const float* inData, float* outData, int numSamples) { + for (int i = 0; i < numSamples; ++i) outData[i] = model.forward(inData + i) + inData[i]; } void RT_LSTM::process(const float* inData, float param, float* outData, int numSamples) { + // Check for parameter changes for smoothing calculations + if (param != previousParam1) { + steppedValue1 = (param - previousParam1) / numSamples; + changedParam1 = true; + } + else { + changedParam1 = false; + } + for (int i = 0; i < numSamples; ++i) { inArray1[0] = inData[i]; - inArray1[1] = param; + + // Perform ramped value calculations to smooth out sound + if (changedParam1 == true) { + inArray1[1] = previousParam1 + (i + 1) * steppedValue1; + } + else { + inArray1[1] = param; + } + outData[i] = model_cond1.forward(inArray1) + inData[i]; } + previousParam1 = param; } void RT_LSTM::process(const float* inData, float param1, float param2, float* outData, int numSamples) diff --git a/src/RTNeuralLSTM.h b/src/RTNeuralLSTM.h @@ -18,6 +18,9 @@ public: void process(const float* inData, float param1, float param2, float* outData, int numSamples); int input_size = 1; + float previousParam1 = 0.0; + float steppedValue1 = 0.0; + bool changedParam1 = false; private: RTNeural::ModelT<float, 1, 1,