Import Prests from Bank
This commit is contained in:
+299
-271
@@ -23,316 +23,344 @@
|
||||
#include "Pedalboard.hpp"
|
||||
#include "PiPedalException.hpp"
|
||||
|
||||
namespace pipedal {
|
||||
namespace pipedal
|
||||
{
|
||||
|
||||
#define GETTER_SETTER_REF(name) \
|
||||
decltype(name##_)& name() { return name##_;} \
|
||||
const decltype(name##_)& name() const { return name##_;} \
|
||||
#define GETTER_SETTER_REF(name) \
|
||||
decltype(name##_) &name() { return name##_; } \
|
||||
const decltype(name##_) &name() const { return name##_; } \
|
||||
void name(const decltype(name##_) &value) { name##_ = value; }
|
||||
|
||||
#define GETTER_SETTER_VEC(name) \
|
||||
decltype(name##_)& name() { return name##_;} \
|
||||
const decltype(name##_)& name() const { return name##_;}
|
||||
#define GETTER_SETTER_VEC(name) \
|
||||
decltype(name##_) &name() { return name##_; } \
|
||||
const decltype(name##_) &name() const { return name##_; }
|
||||
|
||||
|
||||
#define GETTER_SETTER(name) \
|
||||
decltype(name##_) name() const { return name##_;} \
|
||||
#define GETTER_SETTER(name) \
|
||||
decltype(name##_) name() const { return name##_; } \
|
||||
void name(decltype(name##_) value) { name##_ = value; }
|
||||
|
||||
class PresetIndexEntry
|
||||
{
|
||||
int64_t instanceId_ = 0;
|
||||
std::string name_;
|
||||
|
||||
class PresetIndexEntry {
|
||||
int64_t instanceId_ = 0;
|
||||
std::string name_;
|
||||
public:
|
||||
GETTER_SETTER(instanceId);
|
||||
GETTER_SETTER(name);
|
||||
DECLARE_JSON_MAP(PresetIndexEntry);
|
||||
};
|
||||
|
||||
class PresetIndex {
|
||||
int64_t selectedInstanceId_ = -1;
|
||||
bool presetChanged_ = false;
|
||||
std::vector<PresetIndexEntry> presets_;
|
||||
public:
|
||||
bool GetPresetName(int64_t instanceId, std::string*pResult) {
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
public:
|
||||
PresetIndexEntry() {}
|
||||
PresetIndexEntry(uint64_t instanceId, const std::string &name)
|
||||
: instanceId_(instanceId), name_(name)
|
||||
{
|
||||
if (presets_[i].instanceId() == instanceId)
|
||||
}
|
||||
|
||||
GETTER_SETTER(instanceId);
|
||||
GETTER_SETTER(name);
|
||||
DECLARE_JSON_MAP(PresetIndexEntry);
|
||||
};
|
||||
|
||||
class PresetIndex
|
||||
{
|
||||
int64_t selectedInstanceId_ = -1;
|
||||
bool presetChanged_ = false;
|
||||
std::vector<PresetIndexEntry> presets_;
|
||||
|
||||
public:
|
||||
bool GetPresetName(int64_t instanceId, std::string *pResult)
|
||||
{
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
*pResult = presets_[i].name();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
GETTER_SETTER(selectedInstanceId);
|
||||
GETTER_SETTER_VEC(presets);
|
||||
GETTER_SETTER(presetChanged);
|
||||
|
||||
DECLARE_JSON_MAP(PresetIndex);
|
||||
};
|
||||
|
||||
|
||||
class BankFileEntry {
|
||||
int64_t instanceId_;
|
||||
Pedalboard preset_;
|
||||
public:
|
||||
GETTER_SETTER(instanceId);
|
||||
GETTER_SETTER_REF(preset);
|
||||
|
||||
DECLARE_JSON_MAP(BankFileEntry);
|
||||
};
|
||||
class BankFile {
|
||||
std::string name_;
|
||||
int64_t nextInstanceId_ = 0;
|
||||
int64_t selectedPreset_ = -1;
|
||||
std::vector<std::unique_ptr<BankFileEntry>> presets_;
|
||||
|
||||
public:
|
||||
GETTER_SETTER(name);
|
||||
GETTER_SETTER(nextInstanceId);
|
||||
GETTER_SETTER(selectedPreset);
|
||||
GETTER_SETTER_VEC(presets);
|
||||
|
||||
void clear()
|
||||
{
|
||||
nextInstanceId_ = 0;
|
||||
presets_.clear();
|
||||
selectedPreset_ = -1;
|
||||
}
|
||||
|
||||
void move(size_t from, size_t to)
|
||||
{
|
||||
if (from >= this->presets_.size()) {
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
if (to >= this->presets_.size()) {
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
std::unique_ptr<BankFileEntry> t = std::move(this->presets_[from]);
|
||||
presets_.erase(presets_.begin()+from);
|
||||
presets_.insert(presets_.begin()+to,std::move(t));
|
||||
}
|
||||
void updateNextIndex() {
|
||||
int64_t t = 0;
|
||||
for (size_t i = 0; i < this->presets_.size(); ++i)
|
||||
{
|
||||
int64_t instanceId = this->presets_[i]->instanceId();
|
||||
if (instanceId > t) t = instanceId;
|
||||
|
||||
}
|
||||
this->nextInstanceId_ = t;
|
||||
}
|
||||
int64_t addPreset(const Pedalboard&preset, int64_t afterItem = -1)
|
||||
{
|
||||
if (hasName(preset.name()))
|
||||
{
|
||||
throw PiPedalStateException("A preset by that name already exists.");
|
||||
}
|
||||
std::unique_ptr<BankFileEntry> entry = std::make_unique<BankFileEntry>();
|
||||
entry->instanceId(++nextInstanceId_);
|
||||
entry->preset(preset);
|
||||
int64_t instanceId = entry->instanceId();
|
||||
if (afterItem == -1)
|
||||
{
|
||||
this->presets_.push_back(std::move(entry));
|
||||
} else {
|
||||
for (auto it = this->presets_.begin(); it != this->presets_.end(); ++it)
|
||||
{
|
||||
if ((*it)->instanceId() == afterItem)
|
||||
if (presets_[i].instanceId() == instanceId)
|
||||
{
|
||||
++it;
|
||||
this->presets_.insert(it,std::move(entry));
|
||||
break;
|
||||
*pResult = presets_[i].name();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return instanceId;
|
||||
}
|
||||
bool hasItem(int64_t instanceId)
|
||||
{
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
if (presets_[i]->instanceId() == instanceId)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool hasName(const std::string &name) {
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
if (presets_[i]->preset().name() == name)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool renamePreset(int64_t instanceId, const std::string&name)
|
||||
{
|
||||
if (hasName(name))
|
||||
{
|
||||
throw PiPedalStateException("A preset by that name already exists.");
|
||||
}
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
if (presets_[i]->instanceId() ==instanceId)
|
||||
{
|
||||
presets_[i]->preset().name(name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
GETTER_SETTER(selectedInstanceId);
|
||||
GETTER_SETTER_VEC(presets);
|
||||
GETTER_SETTER(presetChanged);
|
||||
|
||||
}
|
||||
DECLARE_JSON_MAP(PresetIndex);
|
||||
};
|
||||
|
||||
BankFileEntry &getItem(int64_t instanceId)
|
||||
class BankFileEntry
|
||||
{
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
int64_t instanceId_;
|
||||
Pedalboard preset_;
|
||||
|
||||
public:
|
||||
GETTER_SETTER(instanceId);
|
||||
GETTER_SETTER_REF(preset);
|
||||
|
||||
DECLARE_JSON_MAP(BankFileEntry);
|
||||
};
|
||||
class BankFile
|
||||
{
|
||||
std::string name_;
|
||||
int64_t nextInstanceId_ = 0;
|
||||
int64_t selectedPreset_ = -1;
|
||||
std::vector<std::unique_ptr<BankFileEntry>> presets_;
|
||||
|
||||
public:
|
||||
GETTER_SETTER(name);
|
||||
GETTER_SETTER(nextInstanceId);
|
||||
GETTER_SETTER(selectedPreset);
|
||||
GETTER_SETTER_VEC(presets);
|
||||
|
||||
void clear()
|
||||
{
|
||||
if (presets_[i]->instanceId() == instanceId)
|
||||
{
|
||||
return *(presets_[i].get());
|
||||
}
|
||||
nextInstanceId_ = 0;
|
||||
presets_.clear();
|
||||
selectedPreset_ = -1;
|
||||
}
|
||||
throw PiPedalArgumentException("Instance not found.");
|
||||
}
|
||||
int64_t deletePreset(int64_t instanceId) {
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
|
||||
void move(size_t from, size_t to)
|
||||
{
|
||||
if (presets_[i]->instanceId() == instanceId)
|
||||
if (from >= this->presets_.size())
|
||||
{
|
||||
presets_.erase(presets_.begin()+i);
|
||||
int64_t newSelection;
|
||||
if (i < presets_.size())
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
if (to >= this->presets_.size())
|
||||
{
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
std::unique_ptr<BankFileEntry> t = std::move(this->presets_[from]);
|
||||
presets_.erase(presets_.begin() + from);
|
||||
presets_.insert(presets_.begin() + to, std::move(t));
|
||||
}
|
||||
void updateNextIndex()
|
||||
{
|
||||
int64_t t = 0;
|
||||
for (size_t i = 0; i < this->presets_.size(); ++i)
|
||||
{
|
||||
int64_t instanceId = this->presets_[i]->instanceId();
|
||||
if (instanceId > t)
|
||||
t = instanceId;
|
||||
}
|
||||
this->nextInstanceId_ = t;
|
||||
}
|
||||
int64_t addPreset(const Pedalboard &preset, int64_t afterItem = -1)
|
||||
{
|
||||
if (hasName(preset.name()))
|
||||
{
|
||||
throw PiPedalStateException("A preset by that name already exists.");
|
||||
}
|
||||
std::unique_ptr<BankFileEntry> entry = std::make_unique<BankFileEntry>();
|
||||
entry->instanceId(++nextInstanceId_);
|
||||
entry->preset(preset);
|
||||
int64_t instanceId = entry->instanceId();
|
||||
if (afterItem == -1)
|
||||
{
|
||||
this->presets_.push_back(std::move(entry));
|
||||
}
|
||||
else
|
||||
{
|
||||
for (auto it = this->presets_.begin(); it != this->presets_.end(); ++it)
|
||||
{
|
||||
newSelection = presets_[i]->instanceId();
|
||||
} else if (presets_.size() > 1) {
|
||||
newSelection = presets_[0]->instanceId();
|
||||
} else {
|
||||
// zero length? We can never have a zero-length bank.
|
||||
// Add a default preset and make it the selected preset.
|
||||
Pedalboard pedalboard = Pedalboard::MakeDefault();
|
||||
this->addPreset(pedalboard);
|
||||
newSelection = presets_[0]->instanceId();
|
||||
if ((*it)->instanceId() == afterItem)
|
||||
{
|
||||
++it;
|
||||
this->presets_.insert(it, std::move(entry));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (instanceId == this->selectedPreset_)
|
||||
}
|
||||
return instanceId;
|
||||
}
|
||||
bool hasItem(int64_t instanceId)
|
||||
{
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
if (presets_[i]->instanceId() == instanceId)
|
||||
{
|
||||
this->selectedPreset_ = newSelection;
|
||||
return true;
|
||||
}
|
||||
return newSelection;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
throw PiPedalStateException("Preset not found.");
|
||||
}
|
||||
|
||||
DECLARE_JSON_MAP(BankFile);
|
||||
};
|
||||
|
||||
class BankIndexEntry {
|
||||
int64_t instanceId_ = 0;
|
||||
std::string name_;
|
||||
public:
|
||||
GETTER_SETTER(instanceId);
|
||||
GETTER_SETTER_REF(name);
|
||||
|
||||
DECLARE_JSON_MAP(BankIndexEntry);
|
||||
};
|
||||
|
||||
class BankIndex {
|
||||
int64_t selectedBank_ = 0;
|
||||
int64_t nextInstanceId_ = 0;
|
||||
std::vector<BankIndexEntry> entries_;
|
||||
public:
|
||||
GETTER_SETTER(selectedBank);
|
||||
GETTER_SETTER_VEC(entries);
|
||||
|
||||
DECLARE_JSON_MAP(BankIndex);
|
||||
|
||||
bool hasName(const std::string&name) const {
|
||||
for (size_t i = 0; i < this->entries_.size(); ++i)
|
||||
bool hasName(const std::string &name)
|
||||
{
|
||||
if (this->entries_[i].name() == name) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void move(size_t from, size_t to)
|
||||
{
|
||||
if (from >= this->entries_.size()) {
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
if (to >= this->entries_.size()) {
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
BankIndexEntry t = std::move(this->entries_[from]);
|
||||
entries_.erase(entries_.begin()+from);
|
||||
entries_.insert(entries_.begin()+to,std::move(t));
|
||||
}
|
||||
|
||||
void clear() {
|
||||
entries_.clear();
|
||||
selectedBank_ = 0;
|
||||
}
|
||||
int64_t addBank(int64_t afterId,const std::string& name)
|
||||
{
|
||||
BankIndexEntry bank;
|
||||
bank.name(name);
|
||||
bank.instanceId(++nextInstanceId_);
|
||||
|
||||
for (size_t i = 0; i < this->entries_.size(); ++i)
|
||||
{
|
||||
if (entries_[i].instanceId() == afterId)
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
entries_.insert(entries_.begin()+(i+1), bank);
|
||||
return bank.instanceId();
|
||||
if (presets_[i]->preset().name() == name)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// else at the end.
|
||||
entries_.push_back(bank);
|
||||
return bank.instanceId();
|
||||
}
|
||||
BankIndexEntry* getEntryByName(const std::string &name)
|
||||
{
|
||||
for (size_t i = 0; i < entries_.size(); ++i)
|
||||
bool renamePreset(int64_t instanceId, const std::string &name)
|
||||
{
|
||||
if (entries_[i].name() == name)
|
||||
if (hasName(name))
|
||||
{
|
||||
return &entries_[i];
|
||||
throw PiPedalStateException("A preset by that name already exists.");
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
BankIndexEntry&getBankIndexEntry(int64_t instanceId)
|
||||
{
|
||||
for (size_t i = 0; i < entries_.size(); ++i)
|
||||
{
|
||||
if (entries_[i].instanceId() == instanceId)
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
return entries_[i];
|
||||
if (presets_[i]->instanceId() == instanceId)
|
||||
{
|
||||
presets_[i]->preset().name(name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
throw PiPedalArgumentException("Bank not found.");
|
||||
}
|
||||
const BankIndexEntry&getBankIndexEntry(int64_t instanceId) const
|
||||
{
|
||||
for (size_t i = 0; i < entries_.size(); ++i)
|
||||
{
|
||||
if (entries_[i].instanceId() == instanceId)
|
||||
{
|
||||
return entries_[i];
|
||||
}
|
||||
}
|
||||
throw PiPedalArgumentException("Bank not found.");
|
||||
}
|
||||
|
||||
};
|
||||
BankFileEntry &getItem(int64_t instanceId)
|
||||
{
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
if (presets_[i]->instanceId() == instanceId)
|
||||
{
|
||||
return *(presets_[i].get());
|
||||
}
|
||||
}
|
||||
throw PiPedalArgumentException("Instance not found.");
|
||||
}
|
||||
int64_t deletePreset(int64_t instanceId)
|
||||
{
|
||||
for (size_t i = 0; i < presets_.size(); ++i)
|
||||
{
|
||||
if (presets_[i]->instanceId() == instanceId)
|
||||
{
|
||||
presets_.erase(presets_.begin() + i);
|
||||
int64_t newSelection;
|
||||
if (i < presets_.size())
|
||||
{
|
||||
newSelection = presets_[i]->instanceId();
|
||||
}
|
||||
else if (presets_.size() > 1)
|
||||
{
|
||||
newSelection = presets_[0]->instanceId();
|
||||
}
|
||||
else
|
||||
{
|
||||
// zero length? We can never have a zero-length bank.
|
||||
// Add a default preset and make it the selected preset.
|
||||
Pedalboard pedalboard = Pedalboard::MakeDefault();
|
||||
this->addPreset(pedalboard);
|
||||
newSelection = presets_[0]->instanceId();
|
||||
}
|
||||
if (instanceId == this->selectedPreset_)
|
||||
{
|
||||
this->selectedPreset_ = newSelection;
|
||||
}
|
||||
return newSelection;
|
||||
}
|
||||
}
|
||||
throw PiPedalStateException("Preset not found.");
|
||||
}
|
||||
|
||||
DECLARE_JSON_MAP(BankFile);
|
||||
};
|
||||
|
||||
class BankIndexEntry
|
||||
{
|
||||
int64_t instanceId_ = 0;
|
||||
std::string name_;
|
||||
|
||||
public:
|
||||
GETTER_SETTER(instanceId);
|
||||
GETTER_SETTER_REF(name);
|
||||
|
||||
DECLARE_JSON_MAP(BankIndexEntry);
|
||||
};
|
||||
|
||||
class BankIndex
|
||||
{
|
||||
int64_t selectedBank_ = 0;
|
||||
int64_t nextInstanceId_ = 0;
|
||||
std::vector<BankIndexEntry> entries_;
|
||||
|
||||
public:
|
||||
GETTER_SETTER(selectedBank);
|
||||
GETTER_SETTER_VEC(entries);
|
||||
|
||||
DECLARE_JSON_MAP(BankIndex);
|
||||
|
||||
bool hasName(const std::string &name) const
|
||||
{
|
||||
for (size_t i = 0; i < this->entries_.size(); ++i)
|
||||
{
|
||||
if (this->entries_[i].name() == name)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void move(size_t from, size_t to)
|
||||
{
|
||||
if (from >= this->entries_.size())
|
||||
{
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
if (to >= this->entries_.size())
|
||||
{
|
||||
throw std::invalid_argument("Argument out of range.");
|
||||
}
|
||||
BankIndexEntry t = std::move(this->entries_[from]);
|
||||
entries_.erase(entries_.begin() + from);
|
||||
entries_.insert(entries_.begin() + to, std::move(t));
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
entries_.clear();
|
||||
selectedBank_ = 0;
|
||||
}
|
||||
int64_t addBank(int64_t afterId, const std::string &name)
|
||||
{
|
||||
BankIndexEntry bank;
|
||||
bank.name(name);
|
||||
bank.instanceId(++nextInstanceId_);
|
||||
|
||||
for (size_t i = 0; i < this->entries_.size(); ++i)
|
||||
{
|
||||
if (entries_[i].instanceId() == afterId)
|
||||
{
|
||||
entries_.insert(entries_.begin() + (i + 1), bank);
|
||||
return bank.instanceId();
|
||||
}
|
||||
}
|
||||
// else at the end.
|
||||
entries_.push_back(bank);
|
||||
return bank.instanceId();
|
||||
}
|
||||
BankIndexEntry *getEntryByName(const std::string &name)
|
||||
{
|
||||
for (size_t i = 0; i < entries_.size(); ++i)
|
||||
{
|
||||
if (entries_[i].name() == name)
|
||||
{
|
||||
return &entries_[i];
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
BankIndexEntry &getBankIndexEntry(int64_t instanceId)
|
||||
{
|
||||
for (size_t i = 0; i < entries_.size(); ++i)
|
||||
{
|
||||
if (entries_[i].instanceId() == instanceId)
|
||||
{
|
||||
return entries_[i];
|
||||
}
|
||||
}
|
||||
throw PiPedalArgumentException("Bank not found.");
|
||||
}
|
||||
const BankIndexEntry &getBankIndexEntry(int64_t instanceId) const
|
||||
{
|
||||
for (size_t i = 0; i < entries_.size(); ++i)
|
||||
{
|
||||
if (entries_[i].instanceId() == instanceId)
|
||||
{
|
||||
return entries_[i];
|
||||
}
|
||||
}
|
||||
throw PiPedalArgumentException("Bank not found.");
|
||||
}
|
||||
};
|
||||
#undef GETTER_SETTER
|
||||
#undef GETTER_SETTER_VEC
|
||||
#undef GETTER_SETTER_REF
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user