From 576e6f52bcb2a292e39fbc8d49f5e09b34627b7e Mon Sep 17 00:00:00 2001 From: George Reales Date: Tue, 30 Mar 2021 18:27:29 +0200 Subject: [PATCH] 2.3 update Preset management. Dark background menu. JUCE 6.0.8 update. --- Source/Components/SetPresetNameWindow.cpp | 206 +++++++++++++++++ Source/Components/SetPresetNameWindow.h | 75 +++++++ Source/Images/main.psd | Bin 0 -> 401632 bytes Source/PluginEditor.cpp | 260 +++++++++++++++++++++- Source/PluginEditor.h | 26 ++- Source/PluginProcessor.cpp | 196 ++++++++++++---- Source/PluginProcessor.h | 22 +- 7 files changed, 735 insertions(+), 50 deletions(-) create mode 100644 Source/Components/SetPresetNameWindow.cpp create mode 100644 Source/Components/SetPresetNameWindow.h create mode 100644 Source/Images/main.psd diff --git a/Source/Components/SetPresetNameWindow.cpp b/Source/Components/SetPresetNameWindow.cpp new file mode 100644 index 0000000..7283cc4 --- /dev/null +++ b/Source/Components/SetPresetNameWindow.cpp @@ -0,0 +1,206 @@ +/* + ============================================================================== + + This is an automatically generated GUI class created by the Projucer! + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Created with Projucer version: 6.0.8 + + ------------------------------------------------------------------------------ + + The Projucer is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited. + + ============================================================================== +*/ + +//[Headers] You can add your own extra header files here... +//[/Headers] + +#include "SetPresetNameWindow.h" + + +//[MiscUserDefs] You can add your own user definitions and misc code here... +//[/MiscUserDefs] + +//============================================================================== +SetPresetNameWindow::SetPresetNameWindow () +{ + //[Constructor_pre] You can add your own custom stuff here.. + //[/Constructor_pre] + + nameTextEditor.reset (new juce::TextEditor ("nameTextEditor")); + addAndMakeVisible (nameTextEditor.get()); + nameTextEditor->setMultiLine (false); + nameTextEditor->setReturnKeyStartsNewLine (false); + nameTextEditor->setReadOnly (false); + nameTextEditor->setScrollbarsShown (true); + nameTextEditor->setCaretVisible (true); + nameTextEditor->setPopupMenuEnabled (false); + nameTextEditor->setColour (juce::TextEditor::backgroundColourId, juce::Colours::black); + nameTextEditor->setColour (juce::CaretComponent::caretColourId, juce::Colours::white); + nameTextEditor->setText (juce::String()); + + cancel.reset (new juce::TextButton ("cancel")); + addAndMakeVisible (cancel.get()); + cancel->setButtonText (TRANS("Cancel")); + cancel->addListener (this); + cancel->setColour (juce::TextButton::buttonColourId, juce::Colours::black); + + Ok.reset (new juce::TextButton ("Ok")); + addAndMakeVisible (Ok.get()); + Ok->setButtonText (TRANS("OK")); + Ok->addListener (this); + Ok->setColour (juce::TextButton::buttonColourId, juce::Colours::black); + + + //[UserPreSize] + cancel->setColour (juce::ComboBox::ColourIds::outlineColourId, juce::Colours::white); + Ok->setColour (juce::ComboBox::ColourIds::outlineColourId, juce::Colours::white); + //[/UserPreSize] + + setSize (300, 150); + + + //[Constructor] You can add your own custom stuff here.. + //[/Constructor] +} + +SetPresetNameWindow::~SetPresetNameWindow() +{ + //[Destructor_pre]. You can add your own custom destruction code here.. + //[/Destructor_pre] + + nameTextEditor = nullptr; + cancel = nullptr; + Ok = nullptr; + + + //[Destructor]. You can add your own custom destruction code here.. + //[/Destructor] +} + +//============================================================================== +void SetPresetNameWindow::paint (juce::Graphics& g) +{ + //[UserPrePaint] Add your own custom painting code here.. + //[/UserPrePaint] + + g.fillAll (juce::Colours::black); + + { + int x = 0, y = proportionOfHeight (0.0000f), width = proportionOfWidth (1.0000f), height = proportionOfHeight (1.0000f); + juce::Colour fillColour = juce::Colours::black; + juce::Colour strokeColour = juce::Colour (0xff666666); + //[UserPaintCustomArguments] Customize the painting arguments here.. + //[/UserPaintCustomArguments] + g.setColour (fillColour); + g.fillRect (x, y, width, height); + g.setColour (strokeColour); + g.drawRect (x, y, width, height, 1); + + } + + { + int x = proportionOfWidth (0.0000f), y = proportionOfHeight (0.1000f), width = proportionOfWidth (1.0000f), height = proportionOfHeight (0.2000f); + juce::String text (TRANS("Preset Name")); + juce::Colour fillColour = juce::Colours::white; + //[UserPaintCustomArguments] Customize the painting arguments here.. + //[/UserPaintCustomArguments] + g.setColour (fillColour); + g.setFont (juce::Font (15.00f, juce::Font::plain).withTypefaceStyle ("Regular")); + g.drawText (text, x, y, width, height, + juce::Justification::centred, true); + } + + //[UserPaint] Add your own custom painting code here.. + //[/UserPaint] +} + +void SetPresetNameWindow::resized() +{ + //[UserPreResize] Add your own custom resize code here.. + //[/UserPreResize] + + nameTextEditor->setBounds (proportionOfWidth (0.1500f), proportionOfHeight (0.3467f), proportionOfWidth (0.7000f), proportionOfHeight (0.1733f)); + cancel->setBounds (proportionOfWidth (0.2000f), proportionOfHeight (0.7000f), proportionOfWidth (0.2500f), proportionOfHeight (0.1600f)); + Ok->setBounds (proportionOfWidth (0.5500f), proportionOfHeight (0.7000f), proportionOfWidth (0.2500f), proportionOfHeight (0.1600f)); + //[UserResized] Add your own custom resize handling here.. + //[/UserResized] +} + +void SetPresetNameWindow::buttonClicked (juce::Button* buttonThatWasClicked) +{ + //[UserbuttonClicked_Pre] + //[/UserbuttonClicked_Pre] + + if (buttonThatWasClicked == cancel.get()) + { + //[UserButtonCode_cancel] -- add your button handler code here.. + callback(0, nameTextEditor->getText()); + //[/UserButtonCode_cancel] + } + else if (buttonThatWasClicked == Ok.get()) + { + //[UserButtonCode_Ok] -- add your button handler code here.. + callback(1, nameTextEditor->getText()); + //[/UserButtonCode_Ok] + } + + //[UserbuttonClicked_Post] + //[/UserbuttonClicked_Post] +} + + + +//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... +void SetPresetNameWindow::grabTextEditorFocus() +{ + nameTextEditor->grabKeyboardFocus(); +}; +//[/MiscUserCode] + + +//============================================================================== +#if 0 +/* -- Projucer information section -- + + This is where the Projucer stores the metadata that describe this GUI layout, so + make changes in here at your peril! + +BEGIN_JUCER_METADATA + + + + + + + + + + + +END_JUCER_METADATA +*/ +#endif + + +//[EndFile] You can add extra defines here... +//[/EndFile] + diff --git a/Source/Components/SetPresetNameWindow.h b/Source/Components/SetPresetNameWindow.h new file mode 100644 index 0000000..6478180 --- /dev/null +++ b/Source/Components/SetPresetNameWindow.h @@ -0,0 +1,75 @@ +/* + ============================================================================== + + This is an automatically generated GUI class created by the Projucer! + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Created with Projucer version: 6.0.8 + + ------------------------------------------------------------------------------ + + The Projucer is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited. + + ============================================================================== +*/ + +#pragma once + +//[Headers] -- You can add your own extra header files here -- +#include +//[/Headers] + + + +//============================================================================== +/** + //[Comments] + An auto-generated component, created by the Projucer. + + Describe your class and how it works here! + //[/Comments] +*/ +class SetPresetNameWindow : public juce::Component, + public juce::Button::Listener +{ +public: + //============================================================================== + SetPresetNameWindow (); + ~SetPresetNameWindow() override; + + //============================================================================== + //[UserMethods] -- You can add your own custom methods in this section. + std::function callback; + void setText(const String &txt){ + nameTextEditor->setText(txt); + } + void grabTextEditorFocus(); + //[/UserMethods] + + void paint (juce::Graphics& g) override; + void resized() override; + void buttonClicked (juce::Button* buttonThatWasClicked) override; + + + +private: + //[UserVariables] -- You can add your own custom variables in this section. + //[/UserVariables] + + //============================================================================== + std::unique_ptr nameTextEditor; + std::unique_ptr cancel; + std::unique_ptr Ok; + + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SetPresetNameWindow) +}; + +//[EndFile] You can add extra defines here... +//[/EndFile] + diff --git a/Source/Images/main.psd b/Source/Images/main.psd new file mode 100644 index 0000000000000000000000000000000000000000..c7b831ee831ec4da0764ca9f239641ee9d202166 GIT binary patch literal 401632 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 nH!AmAsXvvoN8?YB(processor.getActiveEditor())) + { + + auto w = proportionOfWidth(0.25f); + auto h = proportionOfHeight(0.3f); + auto x = proportionOfWidth(0.5f) - (w / 2); + auto y = wrapper->getY(); + + if (setPresetNameWindow != nullptr) + { + y += proportionOfHeight(0.15f); + setPresetNameWindow->setBounds(x, y, w, h); + } + } + } +} void ObxdAudioProcessorEditor::loadSkin (ObxdAudioProcessor& ownerFilter) { knobAttachments.clear(); @@ -377,13 +402,64 @@ void ObxdAudioProcessorEditor::rebuildComponents (ObxdAudioProcessor& ownerFilte void ObxdAudioProcessorEditor::createMenu () { + popupMenus.clear(); PopupMenu* menu = new PopupMenu(); PopupMenu progMenu; PopupMenu bankMenu; PopupMenu skinMenu; - + PopupMenu fileMenu; skins = processor.getSkinFiles(); banks = processor.getBankFiles(); + { + + fileMenu.addItem(static_cast(MenuAction::ImportPreset), + "Import Preset...", + true, + false); + + fileMenu.addItem(static_cast(MenuAction::ImportBank), + "Import Bank...", + true, + false); + + fileMenu.addItem(static_cast(MenuAction::ExportPreset), + "Export Preset...", + true, + false); + + fileMenu.addItem(static_cast(MenuAction::ExportBank), + "Export Bank...", + true, + false); + + fileMenu.addItem(static_cast(MenuAction::SavePreset), + "Save Preset...", + true, + false); + + fileMenu.addItem(static_cast(MenuAction::RenamePreset), + "Rename Preset...", + true, + false); + + fileMenu.addItem(static_cast(MenuAction::NewPreset), + "New Preset...", + true,//enableNewPresetOption, + false); + + fileMenu.addItem(static_cast(MenuAction::DeletePreset), + "Delete Preset...", + true, + false); + + /* + fileMenu.addItem(static_cast(MenuAction::DeleteBank), + "Delete Bank...", + true, + false); + */ + menu->addSubMenu("File", fileMenu); + } { for (int i = 0; i < processor.getNumPrograms(); ++i) @@ -463,8 +539,180 @@ void ObxdAudioProcessorEditor::resultFromMenu (const Point pos) clean(); loadSkin (processor); } + else if (result < progStart){ + MenuActionCallback(result); + } } +void ObxdAudioProcessorEditor::MenuActionCallback(int action){ + + + if (action == MenuAction::ImportBank) + { + fileChooser = std::make_unique("Import Bank (*.fxb)", juce::File(), "*.fxb", true); + + if (fileChooser->browseForFileToOpen()) { + File result = fileChooser->getResult(); + auto name = result.getFileName().replace("%20", " "); + auto file = processor.getBanksFolder().getChildFile(name); + + if (result == file || result.copyFileTo(file)){ + processor.loadFromFXBFile(file); + processor.scanAndUpdateBanks(); + createMenu(); + } + } + }; + + if (action == MenuAction::ExportBank) + { + auto file = processor.getDocumentFolder().getChildFile("Banks"); + FileChooser myChooser ("Export Bank (*.fxb)", file, "*.fxb", true); + if(myChooser.browseForFileToSave(true)) + { + File result = myChooser.getResult(); + + String temp = result.getFullPathName(); + if (!temp.endsWith(".fxb")) { + temp += ".fxb"; + } + processor.saveBank(File(temp)); + + } + }; + + if (action == MenuAction::DeleteBank) + { + if(NativeMessageBox::showOkCancelBox(AlertWindow::NoIcon, "Delete Bank", "Delete current bank: " + processor.currentBank + "?")){ + processor.deleteBank(); + } + } + + + if (action == MenuAction::SavePreset) + { + auto presetName = processor.currentPreset; + if (presetName.isEmpty() ) + { + processor.saveBank(); + return; + } + processor.savePreset(); + processor.saveBank(); + } + + if (action == MenuAction::NewPreset) + { + setPresetNameWindow = std::make_unique(); + //preventBackgroundClick(); + addAndMakeVisible(setPresetNameWindow.get()); + resized(); + + auto callback = [this](int i, juce::String name) + { + if (i) + { + if (name.isNotEmpty()) + { + processor.newPreset(name); + createMenu(); + } + } + + setPresetNameWindow.reset(); + //preventBackgroundClickComponent.reset(); + }; + + setPresetNameWindow->callback = callback; + setPresetNameWindow->grabTextEditorFocus(); + + return; + } + + if (action == MenuAction::RenamePreset) + { + setPresetNameWindow = std::make_unique(); + //preventBackgroundClick(); + setPresetNameWindow->setText(processor.getProgramName(processor.getCurrentProgram())); + addAndMakeVisible(setPresetNameWindow.get()); + resized(); + + auto callback = [this](int i, juce::String name) + { + if (i) + { + if (name.isNotEmpty()) + { + processor.changePresetName(name); + createMenu(); + } + } + + setPresetNameWindow.reset(); + //preventBackgroundClickComponent.reset(); + }; + + setPresetNameWindow->callback = callback; + setPresetNameWindow->grabTextEditorFocus(); + + return; + } + + if (action == MenuAction::DeletePreset) + { + if(NativeMessageBox::showOkCancelBox(AlertWindow::NoIcon, "Delete Preset", "Delete current preset " + processor.currentPreset + "?")){ + processor.deletePreset(); + createMenu(); + } + return; + } + + + if (action == MenuAction::ImportPreset) + { + DBG("Import Preset"); + fileChooser = std::make_unique("Import Preset (*.fxp)", juce::File(), "*.fxp", true); + + if (fileChooser->browseForFileToOpen()) { + File result = fileChooser->getResult(); + //auto name = result.getFileName().replace("%20", " "); + //auto file = processor.getPresetsFolder().getChildFile(name); + DBG("Import Preset: " << result.getFileName()); + //if (result == file || result.copyFileTo(file)){ + processor.loadPreset(result); + createMenu(); + //} + } + }; + + if (action == MenuAction::ExportPreset) + { + + auto file = processor.getPresetsFolder(); + FileChooser myChooser ("Export Preset (*.fxp)", file, "*.fxp", true); + if(myChooser.browseForFileToSave(true)) + { + File result = myChooser.getResult(); + + String temp = result.getFullPathName(); + if (!temp.endsWith(".fxp")) { + temp += ".fxp"; + } + processor.savePreset(File(temp)); + + } + }; + +} + + + +void ObxdAudioProcessorEditor::deleteBank() +{ +} + + + void ObxdAudioProcessorEditor::nextProgram() { int cur = processor.getCurrentProgram() + 1; if (cur == processor.getNumPrograms()) { diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index 586ee8c..7d63dbd 100755 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -17,6 +17,7 @@ #include "Gui/Knob.h" #include "Gui/TooglableButton.h" #include "Gui/ButtonList.h" +#include "Components/SetPresetNameWindow.h" enum KeyPressCommandIDs { @@ -26,6 +27,23 @@ enum KeyPressCommandIDs buttonPadPrevProgram, }; + +enum MenuAction +{ + Cancel = 0, + ToggleMidiKeyboard, + ImportPreset, + ImportBank, + ExportBank, + ExportPreset, + SavePreset, + NewPreset, + RenamePreset, + DeletePreset, + DeleteBank, + ShowBanks, + LoadBank // LoadBank must be the last enum value +}; //============================================================================== /** */ @@ -121,6 +139,11 @@ public: void nextProgram(); void prevProgram(); + + void MenuActionCallback(int action); + void deleteBank(); + + void resized() override; private: Knob* addKnob (int x, int y, int d, ObxdAudioProcessor& filter, int parameter, String name, float defval); void placeLabel (int x, int y, String text); @@ -227,7 +250,8 @@ private: int skinStart; Array skins; Array banks; - + std::unique_ptr setPresetNameWindow; + std::unique_ptr fileChooser; // Command manager ApplicationCommandManager commandManager; }; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 6a520ad..b5d8e29 100755 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -63,7 +63,7 @@ ObxdAudioProcessor::ObxdAudioProcessor() lastUsedParameter = 0; synth.setSampleRate (44100); - + PropertiesFile::Options options; options.applicationName = JucePlugin_Name; options.storageFormat = PropertiesFile::storeAsXML; @@ -225,33 +225,6 @@ inline void ObxdAudioProcessor::processMidiPerSample (MidiBuffer::Iterator* iter { synth.procModWheel (midiMsg->getControllerValue() / 127.0f); } - if (midiMsg->isController()) - { - lastMovedController = midiMsg->getControllerNumber(); - - if (programs.currentProgramPtr->values[MIDILEARN] > 0.5f){ - midiControlledParamSet = true; - bindings[lastMovedController] = lastUsedParameter; - setEngineParameterValue (MIDILEARN, 0, true); - lastMovedController = 0; - lastUsedParameter = 0; - midiControlledParamSet = false; - } - - if (bindings[lastMovedController] > 0) - { - midiControlledParamSet = true; - setEngineParameterValue (bindings[lastMovedController], - midiMsg->getControllerValue() / 127.0f, true); - - setEngineParameterValue (MIDILEARN, 0, true); - lastMovedController = 0; - lastUsedParameter = 0; - - midiControlledParamSet = false; - } - - } if(midiMsg->isSustainPedalOn()) { synth.sustainOn(); @@ -267,20 +240,39 @@ inline void ObxdAudioProcessor::processMidiPerSample (MidiBuffer::Iterator* iter if(midiMsg->isAllSoundOff()) { synth.allSoundOff(); - } - char* midi_data = (char*)midiMsg->getRawData(); - int const status = midi_data[0] & 0xF0; - if (status == 0xC0) - { - { - //const ScopedUnlock unlocker(criticalSection); - // TODO - must issue setProgram - setCurrentProgram(midi_data[1]); - } - //sendChangeMessage(); - //updateHostDisplay(); } + + DBG(" Message: " << midiMsg->getChannel() << " "<getRawData()[0] << " "<< midiMsg->getRawData()[1] << " "<< midiMsg->getRawData()[2]); + + if (midiMsg->isProgramChange()){ // xC0 + setCurrentProgram(midiMsg->getProgramChangeNumber()); + + } else + if (midiMsg->isController()) // xB0 + { + lastMovedController = midiMsg->getControllerNumber(); + if (programs.currentProgramPtr->values[MIDILEARN] > 0.5f){ + midiControlledParamSet = true; + bindings[lastMovedController] = lastUsedParameter; + setEngineParameterValue (MIDILEARN, 0, true); + lastMovedController = 0; + lastUsedParameter = 0; + midiControlledParamSet = false; + } + if (bindings[lastMovedController] > 0) + { + midiControlledParamSet = true; + setEngineParameterValue (bindings[lastMovedController], + midiMsg->getControllerValue() / 127.0f, true); + + setEngineParameterValue (MIDILEARN, 0, true); + lastMovedController = 0; + lastUsedParameter = 0; + + midiControlledParamSet = false; + } + } } } @@ -469,6 +461,119 @@ void ObxdAudioProcessor::setCurrentProgramStateInformation(const void* data, in } //============================================================================== +bool ObxdAudioProcessor::deleteBank() { + currentBankFile.deleteFile(); + scanAndUpdateBanks(); + if (bankFiles.size() > 0) + { + loadFromFXBFile (bankFiles[0]); + } +} + +void ObxdAudioProcessor::saveBank() { + saveFXBFile(currentBankFile); +} + +bool ObxdAudioProcessor::loadPreset(const File& fxpFile) { + loadFromFXBFile(fxpFile); + currentPreset = fxpFile.getFileName(); + currentPresetFile = fxpFile; +} + +bool ObxdAudioProcessor::saveFXPFile(const File& fxpFile){ + //auto xml = std::unique_ptr(new juce::XmlElement("")); + juce::MemoryBlock m, memoryBlock; + getCurrentProgramStateInformation(m); + { + memoryBlock.reset(); + auto totalLen = sizeof (fxProgramSet) + m.getSize() - 8; + memoryBlock.setSize (totalLen, true); + + auto set = static_cast(memoryBlock.getData()); + set->chunkMagic = fxbName ("CcnK"); + set->byteSize = 0; + set->fxMagic = fxbName ("FPCh"); + set->version = fxbSwap (fxbVersionNum); + set->fxID = fxbName ("Obxd"); + set->fxVersion = fxbSwap (fxbVersionNum); + set->numPrograms = fxbSwap (getNumPrograms()); + programs.currentProgramPtr->name.copyToUTF8(set->name, 28); + set->chunkSize = fxbSwap (static_cast(m.getSize())); + + m.copyTo (set->chunk, 0, m.getSize()); + + fxpFile.replaceWithData(memoryBlock.getData(), memoryBlock.getSize()); + } +} + +bool ObxdAudioProcessor::savePreset(const File& fxpFile) { + saveFXPFile(fxpFile); + currentPreset = fxpFile.getFileName(); + currentPresetFile = fxpFile; +} + +void ObxdAudioProcessor::changePresetName(const String &name){ + programs.currentProgramPtr->name = name; + //savePreset(); + saveBank(); +} + +void ObxdAudioProcessor::deletePreset(){ + programs.currentProgramPtr->setDefaultValues(); + programs.currentProgramPtr->name = "Default"; + saveBank(); +} + +void ObxdAudioProcessor::newPreset(const String &name) { + for (int i = 0; i < PROGRAMCOUNT; ++i) + { + if (programs.programs[i].name == "Default"){ + setCurrentProgram(i); + break; + } + } + //savePreset(); + saveBank(); +} + +void ObxdAudioProcessor::savePreset() { + savePreset(currentPresetFile); + +} + +bool ObxdAudioProcessor::saveBank(const File& fxbFile){ + saveFXBFile(fxbFile); + currentBankFile = fxbFile; +} + +bool ObxdAudioProcessor::saveFXBFile(const File& fxbFile) { + //auto xml = std::unique_ptr(new juce::XmlElement("")); + juce::MemoryBlock m, memoryBlock; + getStateInformation(m); + + { + memoryBlock.reset(); + auto totalLen = sizeof (fxChunkSet) + m.getSize() - 8; + memoryBlock.setSize (totalLen, true); + + auto set = static_cast( memoryBlock.getData()); + set->chunkMagic = fxbName ("CcnK"); + set->byteSize = 0; + set->fxMagic = fxbName ("FBCh"); + set->version = fxbSwap (fxbVersionNum); + set->fxID = fxbName ("Obxd"); + set->fxVersion = fxbSwap (fxbVersionNum); + set->numPrograms = fxbSwap (getNumPrograms()); + set->chunkSize = fxbSwap (static_cast(m.getSize())); + + m.copyTo (set->chunk, 0, m.getSize()); + fxbFile.replaceWithData(memoryBlock.getData(), memoryBlock.getSize()); + } + + + return true; +} + bool ObxdAudioProcessor::loadFromFXBFile(const File& fxbFile) { MemoryBlock mb; @@ -563,7 +668,7 @@ bool ObxdAudioProcessor::loadFromFXBFile(const File& fxbFile) } currentBank = fxbFile.getFileName(); - + currentBankFile = fxbFile; updateHostDisplay(); return true; @@ -588,13 +693,14 @@ bool ObxdAudioProcessor::restoreProgramSettings(const fxProgram* const prog) //============================================================================== void ObxdAudioProcessor::scanAndUpdateBanks() { - bankFiles.clearQuick(); + bankFiles.clear(); DirectoryIterator it (getBanksFolder(), false, "*.fxb", File::findFiles); while (it.next()) { bankFiles.addUsingDefaultSort (it.getFile()); + DBG("Scan Banks: " << it.getFile().getFullPathName()); } } @@ -650,6 +756,11 @@ File ObxdAudioProcessor::getBanksFolder() const return getDocumentFolder().getChildFile("Banks"); } +File ObxdAudioProcessor::getPresetsFolder() const +{ + return getDocumentFolder().getChildFile("Presets"); +} + File ObxdAudioProcessor::getCurrentSkinFolder() const { return getSkinFolder().getChildFile(currentSkin); @@ -783,6 +894,7 @@ void ObxdAudioProcessor::setEngineParameterValue (int index, float newValue, boo apvtState.getParameter(getEngineParameterId(index))->setValue(newValue); } + //DBG("Set Value Parameter: " << getEngineParameterId(index) << " Val: " << newValue); switch (index) { case SELF_OSC_PUSH: diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index 104ab81..a03a87d 100755 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -167,7 +167,17 @@ public: void scanAndUpdateSkins(); const Array& getBankFiles() const; const Array& getSkinFiles() const; + bool deleteBank(); + bool loadPreset(const File& fxpFile); + bool savePreset(const File& fxpFile); + void changePresetName(const String &name); + void newPreset(const String &name); + void deletePreset(); + bool loadFromFXBFile(const File& fxbFile); + bool saveFXBFile(const File& fxbFile); + bool saveFXPFile(const File& fxpFile); + bool saveBank(const File& fxbFile); bool restoreProgramSettings(const fxProgram* const prog); File getCurrentBankFile() const; @@ -178,8 +188,9 @@ public: //============================================================================== File getDocumentFolder() const; File getSkinFolder() const; + File getPresetsFolder() const; File getBanksFolder() const; - + File getCurrentSkinFolder() const; void setCurrentSkinFolder(const String& folderName); @@ -209,7 +220,16 @@ private: ObxdBank programs; String currentSkin; +public: String currentBank; + File currentBankFile; + void saveBank(); + + + String currentPreset; + File currentPresetFile; + void savePreset(); +private: Array bankFiles; Array skinFiles;