Merge pull request #1039 from paulfd/sw-last-octave-offset
sw_last is affected by octave/note offsets
This commit is contained in:
commit
2aab560f39
3 changed files with 67 additions and 4 deletions
|
|
@ -205,7 +205,7 @@ void Synth::Impl::buildRegion(const std::vector<Opcode>& regionOpcodes)
|
||||||
previousKeyswitchLists_.push_back(lastLayer);
|
previousKeyswitchLists_.push_back(lastLayer);
|
||||||
|
|
||||||
if (lastRegion->defaultSwitch)
|
if (lastRegion->defaultSwitch)
|
||||||
currentSwitch_ = *lastRegion->defaultSwitch;
|
setCurrentSwitch(*lastRegion->defaultSwitch);
|
||||||
|
|
||||||
// There was a combination of group= and polyphony= on a region, so set the group polyphony
|
// There was a combination of group= and polyphony= on a region, so set the group polyphony
|
||||||
if (lastRegion->group != Default::group && lastRegion->polyphony != config::maxVoices) {
|
if (lastRegion->group != Default::group && lastRegion->polyphony != config::maxVoices) {
|
||||||
|
|
@ -320,7 +320,7 @@ void Synth::Impl::handleMasterOpcodes(const std::vector<Opcode>& members)
|
||||||
currentSet_->setPolyphonyLimit(member.read(Default::polyphony));
|
currentSet_->setPolyphonyLimit(member.read(Default::polyphony));
|
||||||
break;
|
break;
|
||||||
case hash("sw_default"):
|
case hash("sw_default"):
|
||||||
currentSwitch_ = member.read(Default::key);
|
setCurrentSwitch(member.read(Default::key));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -337,7 +337,7 @@ void Synth::Impl::handleGlobalOpcodes(const std::vector<Opcode>& members)
|
||||||
currentSet_->setPolyphonyLimit(member.read(Default::polyphony));
|
currentSet_->setPolyphonyLimit(member.read(Default::polyphony));
|
||||||
break;
|
break;
|
||||||
case hash("sw_default"):
|
case hash("sw_default"):
|
||||||
currentSwitch_ = member.read(Default::key);
|
setCurrentSwitch(member.read(Default::key));
|
||||||
break;
|
break;
|
||||||
case hash("volume"):
|
case hash("volume"):
|
||||||
// FIXME : Probably best not to mess with this and let the host control the volume
|
// FIXME : Probably best not to mess with this and let the host control the volume
|
||||||
|
|
@ -363,7 +363,7 @@ void Synth::Impl::handleGroupOpcodes(const std::vector<Opcode>& members, const s
|
||||||
maxPolyphony = member.read(Default::polyphony);
|
maxPolyphony = member.read(Default::polyphony);
|
||||||
break;
|
break;
|
||||||
case hash("sw_default"):
|
case hash("sw_default"):
|
||||||
currentSwitch_ = member.read(Default::key);
|
setCurrentSwitch(member.read(Default::key));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -645,6 +645,11 @@ bool Synth::loadSfzString(const fs::path& path, absl::string_view text)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Synth::Impl::setCurrentSwitch(uint8_t noteValue)
|
||||||
|
{
|
||||||
|
currentSwitch_ = noteValue + 12 * octaveOffset_ + noteOffset_;
|
||||||
|
}
|
||||||
|
|
||||||
void Synth::Impl::finalizeSfzLoad()
|
void Synth::Impl::finalizeSfzLoad()
|
||||||
{
|
{
|
||||||
FilePool& filePool = resources_.getFilePool();
|
FilePool& filePool = resources_.getFilePool();
|
||||||
|
|
|
||||||
|
|
@ -197,6 +197,13 @@ struct Synth::Impl final: public Parser::Listener {
|
||||||
*/
|
*/
|
||||||
void finalizeSfzLoad();
|
void finalizeSfzLoad();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the current keyswitch, taking into account octave offsets and the like.
|
||||||
|
*
|
||||||
|
* @param noteValue
|
||||||
|
*/
|
||||||
|
void setCurrentSwitch(uint8_t noteValue);
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
static void collectUsedCCsFromCCMap(BitArray<config::numCCs>& usedCCs, const CCMap<T> map) noexcept
|
static void collectUsedCCsFromCCMap(BitArray<config::numCCs>& usedCCs, const CCMap<T> map) noexcept
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#include "sfizz/Region.h"
|
#include "sfizz/Region.h"
|
||||||
#include "sfizz/Synth.h"
|
#include "sfizz/Synth.h"
|
||||||
#include "sfizz/SfzHelpers.h"
|
#include "sfizz/SfzHelpers.h"
|
||||||
|
#include "TestHelpers.h"
|
||||||
#include "catch2/catch.hpp"
|
#include "catch2/catch.hpp"
|
||||||
using namespace Catch::literals;
|
using namespace Catch::literals;
|
||||||
using namespace sfz::literals;
|
using namespace sfz::literals;
|
||||||
|
|
@ -655,3 +656,53 @@ TEST_CASE("[Region activation] Polyphonic aftertouch")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("[Keyswitches] sw_default with octave_offset")
|
||||||
|
{
|
||||||
|
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()) };
|
||||||
|
std::vector<std::string> expected {
|
||||||
|
"/sw/last/current,i : { 59 }",
|
||||||
|
};
|
||||||
|
|
||||||
|
SECTION("In <global>") {
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_previous.sfz", R"(
|
||||||
|
<control> octave_offset=1 note_offset=-1
|
||||||
|
<global> sw_default=48
|
||||||
|
<region> sample=*sine
|
||||||
|
)");
|
||||||
|
synth.dispatchMessage(client, 0, "/sw/last/current", "", nullptr);
|
||||||
|
REQUIRE(messageList == expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("In <master>") {
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_previous.sfz", R"(
|
||||||
|
<control> octave_offset=1 note_offset=-1
|
||||||
|
<master> sw_default=48
|
||||||
|
<region> sample=*sine
|
||||||
|
)");
|
||||||
|
synth.dispatchMessage(client, 0, "/sw/last/current", "", nullptr);
|
||||||
|
REQUIRE(messageList == expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("In <group>") {
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_previous.sfz", R"(
|
||||||
|
<control> octave_offset=1 note_offset=-1
|
||||||
|
<group> sw_default=48
|
||||||
|
<region> sample=*sine
|
||||||
|
)");
|
||||||
|
synth.dispatchMessage(client, 0, "/sw/last/current", "", nullptr);
|
||||||
|
REQUIRE(messageList == expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("In <region>") {
|
||||||
|
synth.loadSfzString(fs::current_path() / "tests/TestFiles/sw_previous.sfz", R"(
|
||||||
|
<control> octave_offset=1 note_offset=-1
|
||||||
|
<region> sample=*sine sw_default=48
|
||||||
|
)");
|
||||||
|
synth.dispatchMessage(client, 0, "/sw/last/current", "", nullptr);
|
||||||
|
REQUIRE(messageList == expected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue