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()) 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; std::map<juce::String, juce::PopupMenu> menus;
for (auto t : tables) for (auto& f : files)
{ {
auto prefix = t.upToFirstOccurrenceOf (" ", false, false); auto t = f.getFileNameWithoutExtension();
auto suffix = t.fromFirstOccurrenceOf (" ", false, false); auto category = f.getParentDirectory().getFileName();
menus[prefix].addItem (t, [this, t] menus[category].addItem (t, [this, t]
{ {
if (idx == 0) if (idx == 0)
{ {

View file

@ -643,12 +643,15 @@ void WavetableAudioProcessor::reloadWavetables()
{ {
auto loadMemory = [&] (const juce::String& name) -> juce::MemoryBlock auto loadMemory = [&] (const juce::String& name) -> juce::MemoryBlock
{ {
auto file = systemResourceRoot().getChildFile ("Wavetables").getChildFile (name + ".wt2048"); auto wtDir = systemResourceRoot().getChildFile ("Wavetables");
if (file.existsAsFile()) if (wtDir.isDirectory())
{ {
juce::MemoryBlock mb; for (auto& file : wtDir.findChildFiles (juce::File::findFiles, true, name + ".wt2048"))
if (file.loadFileAsData (mb)) {
return mb; juce::MemoryBlock mb;
if (file.loadFileAsData (mb))
return mb;
}
} }
return {}; return {};
}; };
@ -788,15 +791,38 @@ juce::Array<juce::File> WavetableAudioProcessor::getFactoryProgramDirectories()
juce::StringArray WavetableAudioProcessor::getWavetableNames() const juce::StringArray WavetableAudioProcessor::getWavetableNames() const
{ {
juce::StringArray tables; juce::StringArray tables;
auto wtDir = systemResourceRoot().getChildFile ("Wavetables"); for (auto& f : getWavetableFiles())
if (wtDir.isDirectory()) tables.add (f.getFileNameWithoutExtension());
for (auto f : wtDir.findChildFiles (juce::File::findFiles, false, "*.wt2048"))
tables.add (f.getFileNameWithoutExtension());
tables.sortNatural(); tables.sortNatural();
return tables; 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() void WavetableAudioProcessor::setupModMatrix()
{ {

View file

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