Fix wavetable menu

This commit is contained in:
Roland Rabien 2026-05-02 15:47:21 -07:00
commit e4f7246f45
3 changed files with 42 additions and 15 deletions

View file

@ -143,16 +143,16 @@ public:
}
else if (e.originalComponent == &h && e.mouseWasClicked() && e.x >= prevButton.getRight() && e.x <= nextButton.getX())
{
auto tables = proc.getWavetableNames();
auto files = proc.getWavetableFiles();
std::map<juce::String, juce::PopupMenu> menus;
for (auto t : tables)
for (auto& f : files)
{
auto prefix = t.upToFirstOccurrenceOf (" ", false, false);
auto suffix = t.fromFirstOccurrenceOf (" ", false, false);
auto t = f.getFileNameWithoutExtension();
auto category = f.getParentDirectory().getFileName();
menus[prefix].addItem (t, [this, t]
menus[category].addItem (t, [this, t]
{
if (idx == 0)
{

View file

@ -643,12 +643,15 @@ void WavetableAudioProcessor::reloadWavetables()
{
auto loadMemory = [&] (const juce::String& name) -> juce::MemoryBlock
{
auto file = systemResourceRoot().getChildFile ("Wavetables").getChildFile (name + ".wt2048");
if (file.existsAsFile())
auto wtDir = systemResourceRoot().getChildFile ("Wavetables");
if (wtDir.isDirectory())
{
juce::MemoryBlock mb;
if (file.loadFileAsData (mb))
return mb;
for (auto& file : wtDir.findChildFiles (juce::File::findFiles, true, name + ".wt2048"))
{
juce::MemoryBlock mb;
if (file.loadFileAsData (mb))
return mb;
}
}
return {};
};
@ -788,15 +791,38 @@ juce::Array<juce::File> WavetableAudioProcessor::getFactoryProgramDirectories()
juce::StringArray WavetableAudioProcessor::getWavetableNames() const
{
juce::StringArray tables;
auto wtDir = systemResourceRoot().getChildFile ("Wavetables");
if (wtDir.isDirectory())
for (auto f : wtDir.findChildFiles (juce::File::findFiles, false, "*.wt2048"))
tables.add (f.getFileNameWithoutExtension());
for (auto& f : getWavetableFiles())
tables.add (f.getFileNameWithoutExtension());
tables.sortNatural();
return tables;
}
juce::Array<juce::File> WavetableAudioProcessor::getWavetableFiles() const
{
juce::Array<juce::File> files;
auto wtDir = systemResourceRoot().getChildFile ("Wavetables");
if (wtDir.isDirectory())
files = wtDir.findChildFiles (juce::File::findFiles, true, "*.wt2048");
struct Sorter
{
static int compareElements (const juce::File& a, const juce::File& b)
{
auto categoryCmp = a.getParentDirectory().getFileName()
.compareNatural (b.getParentDirectory().getFileName());
if (categoryCmp != 0)
return categoryCmp;
return a.getFileNameWithoutExtension()
.compareNatural (b.getFileNameWithoutExtension());
}
};
Sorter sorter;
files.sort (sorter);
return files;
}
//==============================================================================
void WavetableAudioProcessor::setupModMatrix()
{

View file

@ -56,6 +56,7 @@ public:
void incWavetable (int osc, int delta);
bool loadUserWavetable (int osc, const juce::File& f, int sz);
juce::StringArray getWavetableNames() const;
juce::Array<juce::File> getWavetableFiles() const;
void applyEffects (juce::AudioSampleBuffer& buffer);
void applyEffect (juce::AudioSampleBuffer& buffer, int fxId);