Merge pull request #935 from paulfd/pianobook
Store files to load and their offset and defer loading
This commit is contained in:
commit
6748c1ed02
4 changed files with 46 additions and 13 deletions
|
|
@ -129,7 +129,7 @@ bool Layer::registerNoteOff(int noteNumber, float velocity, float randValue) noe
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Layer::registerCC(int ccNumber, float ccValue) noexcept
|
bool Layer::registerCC(int ccNumber, float ccValue, bool dontTrigger) noexcept
|
||||||
{
|
{
|
||||||
const Region& region = region_;
|
const Region& region = region_;
|
||||||
|
|
||||||
|
|
@ -152,14 +152,16 @@ bool Layer::registerCC(int ccNumber, float ccValue) noexcept
|
||||||
else
|
else
|
||||||
ccSwitched_.set(ccNumber, false);
|
ccSwitched_.set(ccNumber, false);
|
||||||
|
|
||||||
if (!isSwitchedOn())
|
if (dontTrigger || !region.triggerOnCC)
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!region.triggerOnCC)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (auto triggerRange = region.ccTriggers.get(ccNumber)) {
|
if (auto triggerRange = region.ccTriggers.get(ccNumber)) {
|
||||||
if (triggerRange->containsWithEnd(ccValue))
|
if (!triggerRange->containsWithEnd(ccValue))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
sequenceSwitched_ =
|
||||||
|
((sequenceCounter_++ % region.sequenceLength) == region.sequencePosition - 1);
|
||||||
|
if (isSwitchedOn())
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ public:
|
||||||
* @return true if the region should trigger on this event
|
* @return true if the region should trigger on this event
|
||||||
* @return false
|
* @return false
|
||||||
*/
|
*/
|
||||||
bool registerCC(int ccNumber, float ccValue) noexcept;
|
bool registerCC(int ccNumber, float ccValue, bool dontTrigger = false) noexcept;
|
||||||
/**
|
/**
|
||||||
* @brief Register a new pitch wheel event.
|
* @brief Register a new pitch wheel event.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -581,6 +581,8 @@ void Synth::Impl::finalizeSfzLoad()
|
||||||
size_t currentRegionIndex = 0;
|
size_t currentRegionIndex = 0;
|
||||||
size_t currentRegionCount = layers_.size();
|
size_t currentRegionCount = layers_.size();
|
||||||
|
|
||||||
|
absl::flat_hash_map<sfz::FileId, int64_t> filesToLoad;
|
||||||
|
|
||||||
auto removeCurrentRegion = [this, ¤tRegionIndex, ¤tRegionCount]() {
|
auto removeCurrentRegion = [this, ¤tRegionIndex, ¤tRegionCount]() {
|
||||||
const Region& region = layers_[currentRegionIndex]->getRegion();
|
const Region& region = layers_[currentRegionIndex]->getRegion();
|
||||||
DBG("Removing the region with sample " << *region.sampleId);
|
DBG("Removing the region with sample " << *region.sampleId);
|
||||||
|
|
@ -679,10 +681,8 @@ void Synth::Impl::finalizeSfzLoad()
|
||||||
return Default::offsetMod.bounds.clamp(sumOffsetCC);
|
return Default::offsetMod.bounds.clamp(sumOffsetCC);
|
||||||
}();
|
}();
|
||||||
|
|
||||||
if (!filePool.preloadFile(*region.sampleId, maxOffset)) {
|
auto& toLoad = filesToLoad[*region.sampleId];
|
||||||
removeCurrentRegion();
|
toLoad = max(toLoad, maxOffset);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (!region.isGenerator()) {
|
else if (!region.isGenerator()) {
|
||||||
if (!wavePool.createFileWave(filePool, std::string(region.sampleId->filename()))) {
|
if (!wavePool.createFileWave(filePool, std::string(region.sampleId->filename()))) {
|
||||||
|
|
@ -726,7 +726,7 @@ void Synth::Impl::finalizeSfzLoad()
|
||||||
// Defaults
|
// Defaults
|
||||||
MidiState& midiState = resources_.getMidiState();
|
MidiState& midiState = resources_.getMidiState();
|
||||||
for (int cc = 0; cc < config::numCCs; cc++) {
|
for (int cc = 0; cc < config::numCCs; cc++) {
|
||||||
layer.registerCC(cc, midiState.getCCValue(cc));
|
layer.registerCC(cc, midiState.getCCValue(cc), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -763,6 +763,11 @@ void Synth::Impl::finalizeSfzLoad()
|
||||||
|
|
||||||
++currentRegionIndex;
|
++currentRegionIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto& toLoad: filesToLoad) {
|
||||||
|
filePool.preloadFile(toLoad.first, toLoad.second);
|
||||||
|
}
|
||||||
|
|
||||||
if (currentRegionCount < layers_.size()) {
|
if (currentRegionCount < layers_.size()) {
|
||||||
DBG("Removing " << (layers_.size() - currentRegionCount)
|
DBG("Removing " << (layers_.size() - currentRegionCount)
|
||||||
<< " out of " << layers_.size() << " regions");
|
<< " out of " << layers_.size() << " regions");
|
||||||
|
|
@ -1946,7 +1951,7 @@ void Synth::Impl::resetAllControllers(int delay) noexcept
|
||||||
for (const LayerPtr& layerPtr : layers_) {
|
for (const LayerPtr& layerPtr : layers_) {
|
||||||
Layer& layer = *layerPtr;
|
Layer& layer = *layerPtr;
|
||||||
for (int cc = 0; cc < config::numCCs; ++cc)
|
for (int cc = 0; cc < config::numCCs; ++cc)
|
||||||
layer.registerCC(cc, defaultCCValues_[cc]);
|
layer.registerCC(cc, defaultCCValues_[cc], true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1983,3 +1983,29 @@ TEST_CASE("[Synth] Resets all controllers to default values")
|
||||||
REQUIRE( synth.getHdcc(56) == 64_norm );
|
REQUIRE( synth.getHdcc(56) == 64_norm );
|
||||||
REQUIRE( synth.getHdcc(78) == 0.0f );
|
REQUIRE( synth.getHdcc(78) == 0.0f );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("[Synth] Sequences also work on cc triggers")
|
||||||
|
{
|
||||||
|
sfz::Synth synth;
|
||||||
|
std::vector<std::string> messageList;
|
||||||
|
sfz::Client client(&messageList);
|
||||||
|
client.setReceiveCallback(&simpleMessageReceiver);
|
||||||
|
sfz::AudioBuffer<float> buffer { 2, static_cast<unsigned>(synth.getSamplesPerBlock()) };
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sequence_cc_triggers.sfz", R"(
|
||||||
|
<global> seq_length=3
|
||||||
|
<region> sample=*sine hikey=-1 start_locc61=0 start_hicc61=64 seq_position=1
|
||||||
|
<region> sample=*saw hikey=-1 start_locc61=0 start_hicc61=64 seq_position=2
|
||||||
|
)");
|
||||||
|
synth.cc(0, 61, 10);
|
||||||
|
synth.renderBlock(buffer);
|
||||||
|
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine" } );
|
||||||
|
synth.cc(0, 61, 20);
|
||||||
|
synth.renderBlock(buffer);
|
||||||
|
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine", "*saw" } );
|
||||||
|
synth.cc(0, 61, 20);
|
||||||
|
synth.renderBlock(buffer);
|
||||||
|
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine", "*saw" } );
|
||||||
|
synth.cc(0, 61, 20);
|
||||||
|
synth.renderBlock(buffer);
|
||||||
|
REQUIRE( playingSamples(synth) == std::vector<std::string> { "*sine", "*saw", "*sine" } );
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue