gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit 3719c0e6d88c074fa4a451f3cfcde7567d9aa29a
parent 982bac3425919b0cf3a41d1fdc164bb49614898b
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat, 28 Sep 2024 23:55:49 +0200

add save functionality for wave

Diffstat:
Msource/xtJucePlugin/weWaveCategoryTreeItem.cpp | 16++++++++++++++++
Msource/xtJucePlugin/weWaveCategoryTreeItem.h | 1+
Msource/xtJucePlugin/weWaveTree.cpp | 10++++++++++
Msource/xtJucePlugin/weWaveTree.h | 2++
Msource/xtJucePlugin/weWaveTreeItem.h | 2++
Msource/xtJucePlugin/xtWaveEditor.cpp | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msource/xtJucePlugin/xtWaveEditor.h | 8++++++++
7 files changed, 101 insertions(+), 0 deletions(-)

diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.cpp b/source/xtJucePlugin/weWaveCategoryTreeItem.cpp @@ -34,6 +34,22 @@ namespace xtJucePlugin } } + bool WaveCategoryTreeItem::setSelectedWave(const xt::WaveId _id) + { + for(int i=0; i<getNumSubItems(); ++i) + { + auto* subItem = dynamic_cast<WaveTreeItem*>(getSubItem(i)); + if(subItem && subItem->getWaveId() == _id) + { + subItem->setSelected(true, true, juce::dontSendNotification); + setOpen(true); + getOwnerView()->scrollToKeepItemVisible(subItem); + return true; + } + } + return false; + } + std::string WaveCategoryTreeItem::getCategoryName(WaveCategory _category) { return g_categoryNames[static_cast<uint32_t>(_category)]; diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.h b/source/xtJucePlugin/weWaveCategoryTreeItem.h @@ -12,6 +12,7 @@ namespace xtJucePlugin public: explicit WaveCategoryTreeItem(WaveEditor& _editor, WaveCategory _category); bool mightContainSubItems() override { return true; } + bool setSelectedWave(xt::WaveId _id); static std::string getCategoryName(WaveCategory _category); diff --git a/source/xtJucePlugin/weWaveTree.cpp b/source/xtJucePlugin/weWaveTree.cpp @@ -12,6 +12,16 @@ namespace xtJucePlugin addCategory(WaveCategory::User); } + bool WaveTree::setSelectedWave(const xt::WaveId _id) + { + for (const auto& [category, item] : m_items) + { + if(item->setSelectedWave(_id)) + return true; + } + return false; + } + void WaveTree::addCategory(WaveCategory _category) { if(m_items.find(_category) != m_items.end()) diff --git a/source/xtJucePlugin/weWaveTree.h b/source/xtJucePlugin/weWaveTree.h @@ -12,6 +12,8 @@ namespace xtJucePlugin public: explicit WaveTree(WaveEditor& _editor); + bool setSelectedWave(xt::WaveId _id); + private: void addCategory(WaveCategory _category); diff --git a/source/xtJucePlugin/weWaveTreeItem.h b/source/xtJucePlugin/weWaveTreeItem.h @@ -15,6 +15,8 @@ namespace xtJucePlugin public: WaveTreeItem(WaveEditor& _editor, WaveCategory _category, xt::WaveId _waveIndex); + auto getWaveId() const { return m_waveIndex; } + bool mightContainSubItems() override { return false; } static void paintWave(const xt::WaveData& _data, juce::Graphics& _g, int _x, int _y, int _width, int _height, const juce::Colour& _colour); diff --git a/source/xtJucePlugin/xtWaveEditor.cpp b/source/xtJucePlugin/xtWaveEditor.cpp @@ -6,6 +6,7 @@ #include "weGraphFreq.h" #include "weGraphPhase.h" #include "weGraphTime.h" +#include "weWaveTreeItem.h" #include "xtController.h" #include "xtEditor.h" @@ -70,9 +71,11 @@ namespace xtJucePlugin m_btWavePreview = m_editor.findComponentT<juce::Button>("btWavePreview"); m_ledWavePreview = m_editor.findComponentT<juce::Button>("ledWavePreview"); + m_btWaveSave = m_editor.findComponentT<juce::Button>("btWaveSave"); m_btWavetablePreview = m_editor.findComponentT<juce::Button>("btWavetablePreview"); m_ledWavetablePreview = m_editor.findComponentT<juce::Button>("ledWavetablePreview"); + m_btWavetableSave = m_editor.findComponentT<juce::Button>("btWavetableSave"); m_btWavePreview->onClick = [this] { @@ -83,6 +86,16 @@ namespace xtJucePlugin { toggleWavetablePreview(m_btWavePreview->getToggleState()); }; + + m_btWaveSave->onClick = [this] + { + saveWave(); + }; + + m_btWavetableSave->onClick = [this] + { + saveWavetable(); + }; } void WaveEditor::destroy() @@ -136,6 +149,53 @@ namespace xtJucePlugin } } + void WaveEditor::saveWave() + { + if(WaveEditorData::isReadOnly(m_selectedWave)) + { + // open menu and let user select one of the wave slots + juce::PopupMenu menu; + + + uint16_t count = 0; + for(uint16_t i=xt::Wave::g_firstRamWaveIndex; i<xt::Wave::g_firstRamWaveIndex+xt::Wave::g_ramWaveCount; ++i) + { + const auto id = xt::WaveId(i); + menu.addItem(WaveTreeItem::getWaveName(id), true, false, [this, id] + { + saveWaveTo(id); + }); + + ++count; + if((count % 25) == 0) + menu.addColumnBreak(); + } + + menu.showMenuAsync({}); + } + else + { + saveWaveTo(m_selectedWave); + } + } + + bool WaveEditor::saveWaveTo(const xt::WaveId _target) + { + if(WaveEditorData::isReadOnly(_target)) + return false; + + m_data.setWave(_target, m_graphData.getSource()); + + if(_target != m_selectedWave) + setSelectedWave(_target); + + return true; + } + + void WaveEditor::saveWavetable() + { + } + void WaveEditor::onReceiveWave(const pluginLib::MidiPacket::Data& _data, const std::vector<uint8_t>& _msg) { m_data.onReceiveWave(_data, _msg); @@ -162,6 +222,8 @@ namespace xtJucePlugin m_selectedWave = _waveIndex; + m_waveTree->setSelectedWave(m_selectedWave); + if(const auto wave = m_data.getWave(_waveIndex)) { m_graphData.set(*wave); diff --git a/source/xtJucePlugin/xtWaveEditor.h b/source/xtJucePlugin/xtWaveEditor.h @@ -61,6 +61,11 @@ namespace xtJucePlugin void onWaveDataChanged(const xt::WaveData& _data) const; + void saveWave(); + bool saveWaveTo(xt::WaveId _target); + + void saveWavetable(); + Editor& m_editor; std::unique_ptr<WaveTree> m_waveTree; @@ -77,6 +82,9 @@ namespace xtJucePlugin juce::Button* m_btWavetablePreview = nullptr; juce::Button* m_ledWavetablePreview = nullptr; + juce::Button* m_btWaveSave = nullptr; + juce::Button* m_btWavetableSave = nullptr; + WaveEditorData m_data; GraphData m_graphData;