Skip to content

Commit 6799c08

Browse files
committed
file writing/access for wavetablesfile
1 parent c1e2752 commit 6799c08

3 files changed

Lines changed: 84 additions & 4 deletions

File tree

plugin/include/Electrum/Identifiers.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ DECLARE_ID(patchAuthor)
120120
DECLARE_ID(patchDesc)
121121
DECLARE_ID(patchCategory)
122122

123+
// wave metadata stuff
124+
DECLARE_ID(WAVE_INFO)
125+
DECLARE_ID(waveName)
126+
DECLARE_ID(wavePath)
127+
DECLARE_ID(waveAuthor)
128+
DECLARE_ID(waveCategory)
129+
DECLARE_ID(waveStringData)
130+
123131
apvts::ParameterLayout getParameterLayout();
124132
} // namespace ID
125133

plugin/include/Electrum/Shared/FileSystem.h

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// the categories we'll divide the patch library into
66
enum patch_categ_t { Bass, Lead, Keys, Pad, Other };
77

8-
// our file extensions
8+
enum wave_categ_t { Analog, Digital, User };
99

1010
// what the library/patch browser system needs to know
1111
// about a patch
@@ -20,28 +20,47 @@ struct patch_meta_t {
2020
static patch_meta_t fromValueTree(ValueTree& vt);
2121
};
2222

23+
// same idea for wavetables
24+
struct wave_meta_t {
25+
String name = "untitled";
26+
String path;
27+
String author;
28+
int category;
29+
//------------
30+
// NOTE- the wave's serial data still needs to be attached
31+
// to this ValueTree before saving the fine
32+
static ValueTree toValueTree(const wave_meta_t& wave);
33+
static wave_meta_t fromValueTree(ValueTree& vt);
34+
};
35+
2336
/* Namespace for handling access to patches
2437
* on the file system
2538
* */
2639
namespace UserFiles {
2740

2841
const juce::StringArray PatchCategStrings = {"Bass", "Lead", "Keys", "Pad",
2942
"Other"};
30-
43+
const juce::StringArray WaveCategStrings = {"Analog", "Digital", "User"};
3144
#define NUM_PATCH_CATEGORIES 5
45+
#define NUM_WAVE_CATEGORIES 3
46+
3247
const String patchFileExt = ".epf";
3348
const String waveFileExt = ".ewf";
3449
File getPatchesFolder();
3550
File getWavetablesFolder();
3651
// check whether a file is a valid Electrum patch
3752
bool isValidPatch(const File& file);
53+
// check for a valid wavetable
54+
bool isValidWave(const File& file);
3855
// call this with the 'state' member of ElectrumState
3956
// save a patch. returns success or failure
4057
bool attemptPatchSave(ValueTree& state);
58+
bool attemptWaveSave(const wave_meta_t& wave, const String& waveString);
4159

4260
// this should run on startup to
4361
// save the list of patches on the system
4462
std::vector<patch_meta_t> getAvailiblePatches();
63+
std::vector<wave_meta_t> getAvailableWaves();
4564
} // namespace UserFiles
4665

4766
//====================================================
@@ -61,14 +80,15 @@ class ElectrumUserLib {
6180
struct Listener {
6281
Listener() {}
6382
virtual ~Listener() {}
64-
virtual void patchWasSaved(patch_meta_t* patch) {}
83+
virtual void patchWasSaved(patch_meta_t*) {}
6584
};
6685
ElectrumUserLib();
6786
// GUI should call this to check if
6887
// the user's entered metadata is legal
6988
bool validatePatchData(patch_meta_t* patch) const;
7089
int numPatches() const { return (int)patches.size(); }
7190
bool attemptPatchSave(apvts* tree, const patch_meta_t& patchData);
91+
bool attemptWaveSave(const wave_meta_t& waveData, const String& waveString);
7292
patch_meta_t* getPatchAtIndex(int index);
7393
patch_meta_t* getPatch(const String& name);
7494

plugin/source/FileSystem.cpp

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,26 @@ patch_meta_t patch_meta_t::fromValueTree(ValueTree& vt) {
2222
return patch;
2323
}
2424

25+
//--------------------------------------------------
26+
27+
ValueTree wave_meta_t::toValueTree(const wave_meta_t& wave) {
28+
ValueTree vt(ID::WAVE_INFO);
29+
vt.setProperty(ID::waveName, wave.name, nullptr);
30+
vt.setProperty(ID::wavePath, wave.path, nullptr);
31+
vt.setProperty(ID::waveAuthor, wave.author, nullptr);
32+
vt.setProperty(ID::waveCategory, wave.category, nullptr);
33+
34+
return vt;
35+
}
36+
37+
wave_meta_t wave_meta_t::fromValueTree(ValueTree& vt) {
38+
wave_meta_t wave;
39+
wave.name = vt[ID::waveName];
40+
wave.author = vt[ID::waveAuthor];
41+
wave.path = vt[ID::wavePath];
42+
wave.category = vt[ID::waveCategory];
43+
return wave;
44+
}
2545
//===================================================
2646
namespace UserFiles {
2747

@@ -32,7 +52,6 @@ File getPatchesFolder() {
3252
.getChildFile("Patches");
3353
if (!folder.exists() || !folder.isDirectory())
3454
folder.createDirectory();
35-
DLog::log("Patches folder is at: " + String(folder.getFullPathName()));
3655
return folder;
3756
}
3857

@@ -55,6 +74,14 @@ bool isValidPatch(const File& file) {
5574
return child.isValid();
5675
}
5776

77+
bool isValidWave(const File& file) {
78+
auto str = file.loadFileAsString();
79+
ValueTree parent = ValueTree::fromXml(str);
80+
if (!parent.isValid())
81+
return false;
82+
return parent.hasType(ID::PATCH_INFO);
83+
}
84+
5885
bool attemptPatchSave(ValueTree& state) {
5986
auto patchTree = state.getChildWithName(ID::PATCH_INFO);
6087
if (!patchTree.isValid())
@@ -69,6 +96,17 @@ bool attemptPatchSave(ValueTree& state) {
6996
return file.replaceWithText(xml);
7097
}
7198

99+
bool attemptWaveSave(const wave_meta_t& waveData, const String& waveString) {
100+
wave_meta_t wd = waveData;
101+
auto dir = getWavetablesFolder();
102+
auto file = dir.getNonexistentChildFile(wd.name, waveFileExt, false);
103+
wd.path = file.getRelativePathFrom(dir);
104+
auto vt = wave_meta_t::toValueTree(wd);
105+
vt.setProperty(ID::waveStringData, waveString, nullptr);
106+
auto xml = vt.toXmlString();
107+
return file.replaceWithText(xml);
108+
}
109+
72110
std::vector<patch_meta_t> getAvailiblePatches() {
73111
std::vector<patch_meta_t> vec;
74112
auto patches = getPatchesFolder();
@@ -84,6 +122,20 @@ std::vector<patch_meta_t> getAvailiblePatches() {
84122
return vec;
85123
}
86124

125+
std::vector<wave_meta_t> getAvailableWaves() {
126+
std::vector<wave_meta_t> vec;
127+
auto folder = getWavetablesFolder();
128+
auto waves = folder.findChildFiles(File::findFiles, true);
129+
for (auto& wave : waves) {
130+
auto str = wave.loadFileAsString();
131+
auto parent = ValueTree::fromXml(str);
132+
if (parent.isValid()) {
133+
vec.push_back(wave_meta_t::fromValueTree(parent));
134+
}
135+
}
136+
return vec;
137+
}
138+
87139
} // namespace UserFiles
88140
//===================================================
89141

0 commit comments

Comments
 (0)