Add the lookup functions by identifier
This commit is contained in:
parent
37ef2b9942
commit
2c10173356
3 changed files with 58 additions and 0 deletions
|
|
@ -27,5 +27,15 @@ struct NumericId {
|
||||||
return number != -1;
|
return number != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr bool operator==(NumericId other) const noexcept
|
||||||
|
{
|
||||||
|
return number == other.number;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool operator!=(NumericId other) const noexcept
|
||||||
|
{
|
||||||
|
return number != other.number;
|
||||||
|
}
|
||||||
|
|
||||||
const int number = -1;
|
const int number = -1;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1056,6 +1056,40 @@ const sfz::EffectBus* sfz::Synth::getEffectBusView(int idx) const noexcept
|
||||||
return (size_t)idx < effectBuses.size() ? effectBuses[idx].get() : nullptr;
|
return (size_t)idx < effectBuses.size() ? effectBuses[idx].get() : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sfz::Region* sfz::Synth::getRegionById(NumericId<Region> id) const noexcept
|
||||||
|
{
|
||||||
|
const size_t size = regions.size();
|
||||||
|
|
||||||
|
if (size == 0 || !id.valid())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
// search a sequence of ordered identifiers with potential gaps
|
||||||
|
size_t index = static_cast<size_t>(id.number);
|
||||||
|
index = std::min(index, size - 1);
|
||||||
|
|
||||||
|
while (index > 0 && regions[index]->getId().number > id.number)
|
||||||
|
--index;
|
||||||
|
|
||||||
|
return (regions[index]->getId() == id) ? regions[index].get() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sfz::Voice* sfz::Synth::getVoiceById(NumericId<Voice> id) const noexcept
|
||||||
|
{
|
||||||
|
const size_t size = voices.size();
|
||||||
|
|
||||||
|
if (size == 0 || !id.valid())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
// search a sequence of ordered identifiers with potential gaps
|
||||||
|
size_t index = static_cast<size_t>(id.number);
|
||||||
|
index = std::min(index, size - 1);
|
||||||
|
|
||||||
|
while (index > 0 && voices[index]->getId().number > id.number)
|
||||||
|
--index;
|
||||||
|
|
||||||
|
return (voices[index]->getId() == id) ? voices[index].get() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
const sfz::Voice* sfz::Synth::getVoiceView(int idx) const noexcept
|
const sfz::Voice* sfz::Synth::getVoiceView(int idx) const noexcept
|
||||||
{
|
{
|
||||||
return (size_t)idx < voices.size() ? voices[idx].get() : nullptr;
|
return (size_t)idx < voices.size() ? voices[idx].get() : nullptr;
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,20 @@ public:
|
||||||
* @brief Export a MIDI Name document describing the loaded instrument
|
* @brief Export a MIDI Name document describing the loaded instrument
|
||||||
*/
|
*/
|
||||||
std::string exportMidnam(absl::string_view model = {}) const;
|
std::string exportMidnam(absl::string_view model = {}) const;
|
||||||
|
/**
|
||||||
|
* @brief Find the region which is associated with the given identifier.
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return const Region*
|
||||||
|
*/
|
||||||
|
const Region* getRegionById(NumericId<Region> id) const noexcept;
|
||||||
|
/**
|
||||||
|
* @brief Find the voice which is associated with the given identifier.
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return const Voice*
|
||||||
|
*/
|
||||||
|
const Voice* getVoiceById(NumericId<Voice> id) const noexcept;
|
||||||
/**
|
/**
|
||||||
* @brief Get a raw view into a specific region. This is mostly used
|
* @brief Get a raw view into a specific region. This is mostly used
|
||||||
* for testing.
|
* for testing.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue