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 d59a4e953730e1e0ff7d9a8390da9f1b53ac1dec
parent 314559327e13d1dc2b09df3a3ede19006e33a6e3
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat,  8 Mar 2025 12:50:36 +0100

support multiple waves/tables in D&D, add support to D&D all user waves to .mid file

Diffstat:
Msource/xtJucePlugin/weControlTreeItem.cpp | 15+++++++++++----
Msource/xtJucePlugin/weTablesTreeItem.cpp | 10++++++----
Msource/xtJucePlugin/weWaveCategoryTreeItem.cpp | 24++++++++++++++++++------
Msource/xtJucePlugin/weWaveCategoryTreeItem.h | 2++
Msource/xtJucePlugin/weWaveDesc.cpp | 41++++++++++++++++++++++++++++++-----------
Msource/xtJucePlugin/weWaveDesc.h | 8++++----
Msource/xtJucePlugin/weWaveTreeItem.cpp | 6+++---
7 files changed, 74 insertions(+), 32 deletions(-)

diff --git a/source/xtJucePlugin/weControlTreeItem.cpp b/source/xtJucePlugin/weControlTreeItem.cpp @@ -65,7 +65,7 @@ namespace xtJucePlugin auto* desc = new WaveDesc(m_editor); - desc->waveId = m_wave; + desc->waveIds = {m_wave}; desc->source = WaveDescSource::ControlTableList; desc->tableIndex = m_index; @@ -78,7 +78,14 @@ namespace xtJucePlugin { if(xt::wave::isReadOnly(m_table) || xt::wave::isReadOnly(m_index)) return false; - return WaveDesc::fromDragSource(_dragSourceDetails) != nullptr; + auto* desc = WaveDesc::fromDragSource(_dragSourceDetails); + if (desc == nullptr) + return false; + if (desc->source == WaveDescSource::WaveList && desc->waveIds.size() != 1) + return false; + if (desc->source == WaveDescSource::ControlTableList && desc->tableIndex == m_index) + return false; + return true; } void ControlTreeItem::itemDropped(const juce::DragAndDropTarget::SourceDetails& _dragSourceDetails, int _insertIndex) @@ -98,9 +105,9 @@ namespace xtJucePlugin data.sendTableToDevice(m_table); } } - else if(waveDesc->source == WaveDescSource::WaveList) + else if(waveDesc->source == WaveDescSource::WaveList && waveDesc->waveIds.size() == 1) { - if(data.setTableWave(m_table, m_index, waveDesc->waveId)) + if(data.setTableWave(m_table, m_index, waveDesc->waveIds.front())) data.sendTableToDevice(m_table); } } diff --git a/source/xtJucePlugin/weTablesTreeItem.cpp b/source/xtJucePlugin/weTablesTreeItem.cpp @@ -36,7 +36,7 @@ namespace xtJucePlugin { auto* waveDesc = new WaveDesc(m_editor); - waveDesc->tableId = m_index; + waveDesc->tableIds = {m_index}; waveDesc->source = WaveDescSource::TablesList; waveDesc->fillData(m_editor.getData()); @@ -51,7 +51,9 @@ namespace xtJucePlugin const auto* waveDesc = WaveDesc::fromDragSource(dragSourceDetails); if(!waveDesc || waveDesc->source != WaveDescSource::TablesList) return false; - return waveDesc->tableId != m_index; + if (waveDesc->tableIds.size() != -1) + return false; + return waveDesc->tableIds.front() != m_index; } void TablesTreeItem::itemDropped(const juce::DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) @@ -60,11 +62,11 @@ namespace xtJucePlugin const auto* waveDesc = WaveDesc::fromDragSource(dragSourceDetails); - if(!waveDesc || waveDesc->source != WaveDescSource::TablesList || waveDesc->tableId == m_index) + if(!waveDesc || waveDesc->source != WaveDescSource::TablesList || waveDesc->tableIds.size() != 1 || waveDesc->tableIds.front() == m_index) return; auto& data = m_editor.getData(); - if(data.copyTable(m_index, waveDesc->tableId)) + if(data.copyTable(m_index, waveDesc->tableIds.front())) { setSelected(true, true, juce::dontSendNotification); m_editor.setSelectedTable(m_index); diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.cpp b/source/xtJucePlugin/weWaveCategoryTreeItem.cpp @@ -1,5 +1,6 @@ #include "weWaveCategoryTreeItem.h" +#include "weWaveDesc.h" #include "weWaveTreeItem.h" #include "xtWaveEditor.h" @@ -59,7 +60,14 @@ namespace xtJucePlugin juce::var WaveCategoryTreeItem::getDragSourceDescription() { - return TreeItem::getDragSourceDescription(); + auto* desc = new WaveDesc(m_editor); + + desc->waveIds = getWaveIds(); + desc->source = WaveDescSource::WaveList; + + desc->fillData(m_editor.getData()); + + return desc; } void WaveCategoryTreeItem::itemClicked(const juce::MouseEvent& _mouseEvent) @@ -99,16 +107,20 @@ namespace xtJucePlugin void WaveCategoryTreeItem::exportAll(const bool _midi) const { - std::vector<xt::WaveId> waveIds; + auto waveIds = getWaveIds(); - waveIds.reserve(getNumSubItems()); + m_editor.exportAsSyxOrMid(waveIds, _midi); + } + std::vector<xt::WaveId> WaveCategoryTreeItem::getWaveIds() const + { + std::vector<xt::WaveId> waveIds; + waveIds.reserve(getNumSubItems()); for (int i = 0; i < getNumSubItems(); ++i) { - if (auto* subItem = dynamic_cast<WaveTreeItem*>(getSubItem(i))) + if (const auto* subItem = dynamic_cast<WaveTreeItem*>(getSubItem(i))) waveIds.push_back(subItem->getWaveId()); } - - m_editor.exportAsSyxOrMid(waveIds, _midi); + return waveIds; } } diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.h b/source/xtJucePlugin/weWaveCategoryTreeItem.h @@ -26,6 +26,8 @@ namespace xtJucePlugin void exportAll(bool _midi) const; + std::vector<xt::WaveId> getWaveIds() const; + WaveEditor& m_editor; const WaveCategory m_category; }; diff --git a/source/xtJucePlugin/weWaveDesc.cpp b/source/xtJucePlugin/weWaveDesc.cpp @@ -17,10 +17,13 @@ namespace xtJucePlugin { std::vector<xt::SysEx> sysex; - if(tableData) - sysex.emplace_back(xt::State::createTableData(*tableData, tableId.rawId(), false)); - if(waveData) - sysex.emplace_back(xt::State::createWaveData(*waveData, waveId.rawId(), false)); + sysex.reserve(tableIds.size() + waveIds.size()); + + for (size_t i = 0; i<tableIds.size(); ++i) + sysex.emplace_back(xt::State::createTableData(tableDatas[i], tableIds[i].rawId(), false)); + + for (size_t i = 0; i < waveIds.size(); ++i) + sysex.emplace_back(xt::State::createWaveData(waveDatas[i], waveIds[i].rawId(), false)); if(sysex.empty()) return false; @@ -30,7 +33,7 @@ namespace xtJucePlugin bool WaveDesc::canDropExternally() const { - return waveData || tableData; + return !waveDatas.empty() || !tableDatas.empty(); } std::string WaveDesc::getExportFileName(const pluginLib::Processor& _processor) const @@ -38,10 +41,14 @@ namespace xtJucePlugin std::stringstream name; name << _processor.getProperties().name << " - "; - if(tableData) - name << "Table " << m_editor.getTableName(tableId); - else if(waveData) - name << "Wave " << WaveTreeItem::getWaveName(waveId); + if (tableIds.size() > 1) + name << "Table " << m_editor.getTableName(tableIds.front()) << " - " << m_editor.getTableName(tableIds.back()); + else if (waveIds.size() > 1) + name << "Wave " << WaveTreeItem::getWaveName(waveIds.front()) << " - " << WaveTreeItem::getWaveName(waveIds.back()); + else if(!tableDatas.empty()) + name << "Table " << m_editor.getTableName(tableIds.front()); + else if(!waveDatas.empty()) + name << "Wave " << WaveTreeItem::getWaveName(waveIds.front()); else return DragAndDropObject::getExportFileName(_processor); @@ -52,7 +59,19 @@ namespace xtJucePlugin void WaveDesc::fillData(const WaveEditorData& _data) { - waveData = _data.getWave(waveId); - tableData = _data.getTable(tableId); + for (int32_t i=0; i<static_cast<int32_t>(waveIds.size()); ++i) + { + if (auto wave = _data.getWave(waveIds[i])) + waveDatas.push_back(*wave); + else + waveIds.erase(waveIds.begin() + i); + } + for (int32_t i = 0; i < static_cast<int32_t>(tableIds.size()); ++i) + { + if (auto table = _data.getTable(tableIds[i])) + tableDatas.push_back(*table); + else + tableIds.erase(tableIds.begin() + i); + } } } diff --git a/source/xtJucePlugin/weWaveDesc.h b/source/xtJucePlugin/weWaveDesc.h @@ -32,13 +32,13 @@ namespace xtJucePlugin WaveEditor& m_editor; - xt::WaveId waveId; - xt::TableId tableId; + std::vector<xt::WaveId> waveIds; + std::vector<xt::TableId> tableIds; xt::TableIndex tableIndex; - std::optional<xt::WaveData> waveData; - std::optional<xt::TableData> tableData; + std::vector<xt::WaveData> waveDatas; + std::vector<xt::TableData> tableDatas; WaveDescSource source = WaveDescSource::Invalid; }; diff --git a/source/xtJucePlugin/weWaveTreeItem.cpp b/source/xtJucePlugin/weWaveTreeItem.cpp @@ -72,7 +72,7 @@ namespace xtJucePlugin { auto* desc = new WaveDesc(m_editor); - desc->waveId = m_waveIndex; + desc->waveIds = {m_waveIndex}; desc->source = WaveDescSource::WaveList; desc->fillData(m_editor.getData()); @@ -87,7 +87,7 @@ namespace xtJucePlugin const auto* waveDesc = WaveDesc::fromDragSource(dragSourceDetails); if(!waveDesc) return false; - if(!waveDesc->waveId.isValid()) + if(waveDesc->waveIds.size() != 1) return false; return true; } @@ -102,7 +102,7 @@ namespace xtJucePlugin return; auto& data = m_editor.getData(); - if(data.copyWave(m_waveIndex, waveDesc->waveId)) + if(data.copyWave(m_waveIndex, waveDesc->waveIds.front())) { setSelected(true, true, juce::dontSendNotification); data.sendWaveToDevice(m_waveIndex);