Range was not in the namespace sfz

This commit is contained in:
paulfd 2019-09-28 14:17:34 +02:00
parent f52d1d5fc5
commit a3d53b46cc
5 changed files with 190 additions and 185 deletions

View file

@ -26,6 +26,10 @@
#include <initializer_list>
#include <type_traits>
namespace sfz
{
template <class Type>
class Range {
static_assert(std::is_arithmetic<Type>::value, "The Type should be arithmetic");
@ -91,21 +95,22 @@ private:
Type _start { static_cast<Type>(0.0) };
Type _end { static_cast<Type>(0.0) };
};
}
template <class Type>
bool operator==(const Range<Type>& lhs, const Range<Type>& rhs)
bool operator==(const sfz::Range<Type>& lhs, const sfz::Range<Type>& rhs)
{
return (lhs.getStart() == rhs.getStart()) && (lhs.getEnd() == rhs.getEnd());
}
template <class Type>
bool operator==(const Range<Type>& lhs, const std::pair<Type, Type>& rhs)
bool operator==(const sfz::Range<Type>& lhs, const std::pair<Type, Type>& rhs)
{
return (lhs.getStart() == rhs.first) && (lhs.getEnd() == rhs.second);
}
template <class Type>
bool operator==(const std::pair<Type, Type>& lhs, const Range<Type>& rhs)
bool operator==(const std::pair<Type, Type>& lhs, const sfz::Range<Type>& rhs)
{
return rhs == lhs;
}

View file

@ -676,7 +676,7 @@ bool sfz::Region::isStereo() const noexcept
}
template<class T, class U>
float crossfadeIn(const Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
float crossfadeIn(const sfz::Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
{
if (value < crossfadeRange.getStart())
return 0.0f;
@ -692,7 +692,7 @@ float crossfadeIn(const Range<T>& crossfadeRange, U value, SfzCrossfadeCurve cur
}
template<class T, class U>
float crossfadeOut(const Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
float crossfadeOut(const sfz::Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
{
if (value > crossfadeRange.getEnd())
return 0.0f;

View file

@ -50,7 +50,7 @@ TEST_CASE("[Files] Basic opcodes (regions_opcodes.sfz)")
sfz::Synth synth;
synth.loadSfzFile(fs::current_path() / "tests/TestFiles/Regions/regions_opcodes.sfz");
REQUIRE(synth.getNumRegions() == 1);
REQUIRE(synth.getRegionView(0)->channelRange == Range<uint8_t>(2, 14));
REQUIRE(synth.getRegionView(0)->channelRange == sfz::Range<uint8_t>(2, 14));
}
TEST_CASE("[Files] Underscore opcodes (underscore_opcodes.sfz)")
@ -128,9 +128,9 @@ TEST_CASE("[Files] Define test")
sfz::Synth synth;
synth.loadSfzFile(fs::current_path() / "tests/TestFiles/defines.sfz");
REQUIRE(synth.getNumRegions() == 3);
REQUIRE(synth.getRegionView(0)->keyRange == Range<uint8_t>(36, 36));
REQUIRE(synth.getRegionView(1)->keyRange == Range<uint8_t>(38, 38));
REQUIRE(synth.getRegionView(2)->keyRange == Range<uint8_t>(42, 42));
REQUIRE(synth.getRegionView(0)->keyRange == sfz::Range<uint8_t>(36, 36));
REQUIRE(synth.getRegionView(1)->keyRange == sfz::Range<uint8_t>(38, 38));
REQUIRE(synth.getRegionView(2)->keyRange == sfz::Range<uint8_t>(42, 42));
}
TEST_CASE("[Files] Group from AVL")
@ -140,13 +140,13 @@ TEST_CASE("[Files] Group from AVL")
REQUIRE(synth.getNumRegions() == 5);
for (int i = 0; i < synth.getNumRegions(); ++i) {
REQUIRE(synth.getRegionView(i)->volume == 6.0f);
REQUIRE(synth.getRegionView(i)->keyRange == Range<uint8_t>(36, 36));
REQUIRE(synth.getRegionView(i)->keyRange == sfz::Range<uint8_t>(36, 36));
}
REQUIRE(synth.getRegionView(0)->velocityRange == Range<uint8_t>(1, 26));
REQUIRE(synth.getRegionView(1)->velocityRange == Range<uint8_t>(27, 52));
REQUIRE(synth.getRegionView(2)->velocityRange == Range<uint8_t>(53, 77));
REQUIRE(synth.getRegionView(3)->velocityRange == Range<uint8_t>(78, 102));
REQUIRE(synth.getRegionView(4)->velocityRange == Range<uint8_t>(103, 127));
REQUIRE(synth.getRegionView(0)->velocityRange == sfz::Range<uint8_t>(1, 26));
REQUIRE(synth.getRegionView(1)->velocityRange == sfz::Range<uint8_t>(27, 52));
REQUIRE(synth.getRegionView(2)->velocityRange == sfz::Range<uint8_t>(53, 77));
REQUIRE(synth.getRegionView(3)->velocityRange == sfz::Range<uint8_t>(78, 102));
REQUIRE(synth.getRegionView(4)->velocityRange == sfz::Range<uint8_t>(103, 127));
}
TEST_CASE("[Files] Full hierarchy")
@ -159,35 +159,35 @@ TEST_CASE("[Files] Full hierarchy")
}
REQUIRE(synth.getRegionView(0)->pan == 30.0f);
REQUIRE(synth.getRegionView(0)->delay == 67);
REQUIRE(synth.getRegionView(0)->keyRange == Range<uint8_t>(60, 60));
REQUIRE(synth.getRegionView(0)->keyRange == sfz::Range<uint8_t>(60, 60));
REQUIRE(synth.getRegionView(1)->pan == 30.0f);
REQUIRE(synth.getRegionView(1)->delay == 67);
REQUIRE(synth.getRegionView(1)->keyRange == Range<uint8_t>(61, 61));
REQUIRE(synth.getRegionView(1)->keyRange == sfz::Range<uint8_t>(61, 61));
REQUIRE(synth.getRegionView(2)->pan == 30.0f);
REQUIRE(synth.getRegionView(2)->delay == 56);
REQUIRE(synth.getRegionView(2)->keyRange == Range<uint8_t>(50, 50));
REQUIRE(synth.getRegionView(2)->keyRange == sfz::Range<uint8_t>(50, 50));
REQUIRE(synth.getRegionView(3)->pan == 30.0f);
REQUIRE(synth.getRegionView(3)->delay == 56);
REQUIRE(synth.getRegionView(3)->keyRange == Range<uint8_t>(51, 51));
REQUIRE(synth.getRegionView(3)->keyRange == sfz::Range<uint8_t>(51, 51));
REQUIRE(synth.getRegionView(4)->pan == -10.0f);
REQUIRE(synth.getRegionView(4)->delay == 47);
REQUIRE(synth.getRegionView(4)->keyRange == Range<uint8_t>(40, 40));
REQUIRE(synth.getRegionView(4)->keyRange == sfz::Range<uint8_t>(40, 40));
REQUIRE(synth.getRegionView(5)->pan == -10.0f);
REQUIRE(synth.getRegionView(5)->delay == 47);
REQUIRE(synth.getRegionView(5)->keyRange == Range<uint8_t>(41, 41));
REQUIRE(synth.getRegionView(5)->keyRange == sfz::Range<uint8_t>(41, 41));
REQUIRE(synth.getRegionView(6)->pan == -10.0f);
REQUIRE(synth.getRegionView(6)->delay == 36);
REQUIRE(synth.getRegionView(6)->keyRange == Range<uint8_t>(30, 30));
REQUIRE(synth.getRegionView(6)->keyRange == sfz::Range<uint8_t>(30, 30));
REQUIRE(synth.getRegionView(7)->pan == -10.0f);
REQUIRE(synth.getRegionView(7)->delay == 36);
REQUIRE(synth.getRegionView(7)->keyRange == Range<uint8_t>(31, 31));
REQUIRE(synth.getRegionView(7)->keyRange == sfz::Range<uint8_t>(31, 31));
}
TEST_CASE("[Files] Reloading files")
@ -236,15 +236,15 @@ TEST_CASE("[Files] Pizz basic")
synth.loadSfzFile(fs::current_path() / "tests/TestFiles/SpecificBugs/MeatBassPizz/Programs/pizz.sfz");
REQUIRE(synth.getNumRegions() == 4);
for (int i = 0; i < synth.getNumRegions(); ++i) {
REQUIRE(synth.getRegionView(i)->keyRange == Range<uint8_t>(12, 22));
REQUIRE(synth.getRegionView(i)->velocityRange == Range<uint8_t>(97, 127));
REQUIRE(synth.getRegionView(i)->keyRange == sfz::Range<uint8_t>(12, 22));
REQUIRE(synth.getRegionView(i)->velocityRange == sfz::Range<uint8_t>(97, 127));
REQUIRE(synth.getRegionView(i)->pitchKeycenter == 21);
REQUIRE(synth.getRegionView(i)->ccConditions.getWithDefault(107) == Range<uint8_t>(0, 13));
REQUIRE(synth.getRegionView(i)->ccConditions.getWithDefault(107) == sfz::Range<uint8_t>(0, 13));
}
REQUIRE(synth.getRegionView(0)->randRange == Range<float>(0, 0.25));
REQUIRE(synth.getRegionView(1)->randRange == Range<float>(0.25, 0.5));
REQUIRE(synth.getRegionView(2)->randRange == Range<float>(0.5, 0.75));
REQUIRE(synth.getRegionView(3)->randRange == Range<float>(0.75, 1.0));
REQUIRE(synth.getRegionView(0)->randRange == sfz::Range<float>(0, 0.25));
REQUIRE(synth.getRegionView(1)->randRange == sfz::Range<float>(0.25, 0.5));
REQUIRE(synth.getRegionView(2)->randRange == sfz::Range<float>(0.5, 0.75));
REQUIRE(synth.getRegionView(3)->randRange == sfz::Range<float>(0.75, 1.0));
REQUIRE(synth.getRegionView(0)->sample == R"(../Samples/pizz/a0_vl4_rr1.wav)");
REQUIRE(synth.getRegionView(1)->sample == R"(../Samples/pizz/a0_vl4_rr2.wav)");
REQUIRE(synth.getRegionView(2)->sample == R"(../Samples/pizz/a0_vl4_rr3.wav)");

View file

@ -27,38 +27,38 @@ using namespace Catch::literals;
TEST_CASE("[Range] Equality operators")
{
Range<int> intRange { 1, 1 };
REQUIRE(intRange == Range<int>(1, 1));
sfz::Range<int> intRange { 1, 1 };
REQUIRE(intRange == sfz::Range<int>(1, 1));
REQUIRE(intRange == std::pair<int, int>(1, 1));
REQUIRE(std::pair<int, int>(1, 1) == intRange);
Range<float> floatRange { 1.0f, 1.0f };
REQUIRE(floatRange == Range<float>(1.0f, 1.0f));
sfz::Range<float> floatRange { 1.0f, 1.0f };
REQUIRE(floatRange == sfz::Range<float>(1.0f, 1.0f));
REQUIRE(floatRange == std::pair<float, float>(1.0f, 1.0f));
REQUIRE(std::pair<float, float>(1.0f, 1.0f) == floatRange);
}
TEST_CASE("[Range] Default ranges for classical types")
{
Range<int> intRange;
REQUIRE(intRange == Range<int>(0, 0));
Range<int32_t> int32_tRange;
REQUIRE(int32_tRange == Range<int32_t>(0, 0));
Range<uint32_t> uint32_tRange;
REQUIRE(uint32_tRange == Range<uint32_t>(0, 0));
Range<int64_t> int64_tRange;
REQUIRE(int64_tRange == Range<int64_t>(0, 0));
Range<uint64_t> uint64_tRange;
REQUIRE(uint64_tRange == Range<uint64_t>(0, 0));
Range<float> floatRange;
REQUIRE(floatRange == Range<float>(0, 0));
Range<double> doubleRange;
REQUIRE(doubleRange == Range<double>(0, 0));
sfz::Range<int> intRange;
REQUIRE(intRange == sfz::Range<int>(0, 0));
sfz::Range<int32_t> int32_tRange;
REQUIRE(int32_tRange == sfz::Range<int32_t>(0, 0));
sfz::Range<uint32_t> uint32_tRange;
REQUIRE(uint32_tRange == sfz::Range<uint32_t>(0, 0));
sfz::Range<int64_t> int64_tRange;
REQUIRE(int64_tRange == sfz::Range<int64_t>(0, 0));
sfz::Range<uint64_t> uint64_tRange;
REQUIRE(uint64_tRange == sfz::Range<uint64_t>(0, 0));
sfz::Range<float> floatRange;
REQUIRE(floatRange == sfz::Range<float>(0, 0));
sfz::Range<double> doubleRange;
REQUIRE(doubleRange == sfz::Range<double>(0, 0));
}
TEST_CASE("[Range] Contains")
{
Range<int> intRange { 1, 10 };
sfz::Range<int> intRange { 1, 10 };
REQUIRE(!intRange.contains(0));
REQUIRE(intRange.contains(1));
REQUIRE(intRange.contains(5));
@ -68,7 +68,7 @@ TEST_CASE("[Range] Contains")
REQUIRE(intRange.containsWithEnd(5));
REQUIRE(intRange.containsWithEnd(10));
Range<float> floatRange { 1.0, 10.0 };
sfz::Range<float> floatRange { 1.0, 10.0 };
REQUIRE(!floatRange.contains(0.0));
REQUIRE(floatRange.contains(1.0));
REQUIRE(floatRange.contains(5.0));
@ -81,14 +81,14 @@ TEST_CASE("[Range] Contains")
TEST_CASE("[Range] Clamp")
{
Range<int> intRange { 1, 10 };
sfz::Range<int> intRange { 1, 10 };
REQUIRE(intRange.clamp(0) == 1);
REQUIRE(intRange.clamp(1) == 1);
REQUIRE(intRange.clamp(5) == 5);
REQUIRE(intRange.clamp(10) == 10);
REQUIRE(intRange.clamp(11) == 10);
Range<float> floatRange { 1.0, 10.0 };
sfz::Range<float> floatRange { 1.0, 10.0 };
REQUIRE(floatRange.clamp(0.0) == 1.0_a);
REQUIRE(floatRange.clamp(1.0) == 1.0_a);
REQUIRE(floatRange.clamp(5.0) == 5.0_a);
@ -98,17 +98,17 @@ TEST_CASE("[Range] Clamp")
TEST_CASE("[Range] shrinkIfSmaller")
{
Range<int> intRange { 2, 10 };
sfz::Range<int> intRange { 2, 10 };
intRange.shrinkIfSmaller(0, 10);
REQUIRE(intRange == Range<int>(2, 10));
REQUIRE(intRange == sfz::Range<int>(2, 10));
intRange.shrinkIfSmaller(2, 11);
REQUIRE(intRange == Range<int>(2, 10));
REQUIRE(intRange == sfz::Range<int>(2, 10));
intRange.shrinkIfSmaller(2, 9);
REQUIRE(intRange == Range<int>(2, 9));
REQUIRE(intRange == sfz::Range<int>(2, 9));
intRange.shrinkIfSmaller(3, 9);
REQUIRE(intRange == Range<int>(3, 9));
REQUIRE(intRange == sfz::Range<int>(3, 9));
intRange.shrinkIfSmaller(4, 7);
REQUIRE(intRange == Range<int>(4, 7));
REQUIRE(intRange == sfz::Range<int>(4, 7));
intRange.shrinkIfSmaller(6, 5);
REQUIRE(intRange == Range<int>(5, 6));
REQUIRE(intRange == sfz::Range<int>(5, 6));
}

View file

@ -125,36 +125,36 @@ TEST_CASE("[Region] Parsing opcodes")
SECTION("loop_end")
{
REQUIRE(region.loopRange == Range<uint32_t>(0, 4294967295));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 4294967295));
region.parseOpcode({ "loop_end", "184" });
REQUIRE(region.loopRange == Range<uint32_t>(0, 184));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 184));
region.parseOpcode({ "loop_end", "-1" });
REQUIRE(region.loopRange == Range<uint32_t>(0, 0));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 0));
}
SECTION("loop_start")
{
region.parseOpcode({ "loop_start", "184" });
REQUIRE(region.loopRange == Range<uint32_t>(184, 4294967295));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(184, 4294967295));
region.parseOpcode({ "loop_start", "-1" });
REQUIRE(region.loopRange == Range<uint32_t>(0, 4294967295));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 4294967295));
}
SECTION("loopend")
{
REQUIRE(region.loopRange == Range<uint32_t>(0, 4294967295));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 4294967295));
region.parseOpcode({ "loopend", "184" });
REQUIRE(region.loopRange == Range<uint32_t>(0, 184));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 184));
region.parseOpcode({ "loopend", "-1" });
REQUIRE(region.loopRange == Range<uint32_t>(0, 0));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 0));
}
SECTION("loopstart")
{
region.parseOpcode({ "loopstart", "184" });
REQUIRE(region.loopRange == Range<uint32_t>(184, 4294967295));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(184, 4294967295));
region.parseOpcode({ "loopstart", "-1" });
REQUIRE(region.loopRange == Range<uint32_t>(0, 4294967295));
REQUIRE(region.loopRange == sfz::Range<uint32_t>(0, 4294967295));
}
SECTION("group")
@ -188,117 +188,117 @@ TEST_CASE("[Region] Parsing opcodes")
SECTION("lokey, hikey, and key")
{
REQUIRE(region.keyRange == Range<uint8_t>(0, 127));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "lokey", "37" });
REQUIRE(region.keyRange == Range<uint8_t>(37, 127));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(37, 127));
region.parseOpcode({ "lokey", "c4" });
REQUIRE(region.keyRange == Range<uint8_t>(60, 127));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(60, 127));
region.parseOpcode({ "lokey", "128" });
REQUIRE(region.keyRange == Range<uint8_t>(127, 127));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "lokey", "-3" });
REQUIRE(region.keyRange == Range<uint8_t>(0, 127));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "hikey", "65" });
REQUIRE(region.keyRange == Range<uint8_t>(0, 65));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(0, 65));
region.parseOpcode({ "hikey", "c4" });
REQUIRE(region.keyRange == Range<uint8_t>(0, 60));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(0, 60));
region.parseOpcode({ "hikey", "-1" });
REQUIRE(region.keyRange == Range<uint8_t>(0, 0));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "hikey", "128" });
REQUIRE(region.keyRange == Range<uint8_t>(0, 127));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "key", "26" });
REQUIRE(region.keyRange == Range<uint8_t>(26, 26));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(26, 26));
REQUIRE(region.pitchKeycenter == 26);
region.parseOpcode({ "key", "-26" });
REQUIRE(region.keyRange == Range<uint8_t>(0, 0));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(0, 0));
REQUIRE(region.pitchKeycenter == 0);
region.parseOpcode({ "key", "234" });
REQUIRE(region.keyRange == Range<uint8_t>(127, 127));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(127, 127));
REQUIRE(region.pitchKeycenter == 127);
region.parseOpcode({ "key", "c4" });
REQUIRE(region.keyRange == Range<uint8_t>(60, 60));
REQUIRE(region.keyRange == sfz::Range<uint8_t>(60, 60));
REQUIRE(region.pitchKeycenter == 60);
}
SECTION("lovel, hivel")
{
REQUIRE(region.velocityRange == Range<uint8_t>(0, 127));
REQUIRE(region.velocityRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "lovel", "37" });
REQUIRE(region.velocityRange == Range<uint8_t>(37, 127));
REQUIRE(region.velocityRange == sfz::Range<uint8_t>(37, 127));
region.parseOpcode({ "lovel", "128" });
REQUIRE(region.velocityRange == Range<uint8_t>(127, 127));
REQUIRE(region.velocityRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "lovel", "-3" });
REQUIRE(region.velocityRange == Range<uint8_t>(0, 127));
REQUIRE(region.velocityRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "hivel", "65" });
REQUIRE(region.velocityRange == Range<uint8_t>(0, 65));
REQUIRE(region.velocityRange == sfz::Range<uint8_t>(0, 65));
region.parseOpcode({ "hivel", "-1" });
REQUIRE(region.velocityRange == Range<uint8_t>(0, 0));
REQUIRE(region.velocityRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "hivel", "128" });
REQUIRE(region.velocityRange == Range<uint8_t>(0, 127));
REQUIRE(region.velocityRange == sfz::Range<uint8_t>(0, 127));
}
SECTION("lochan, hichan")
{
REQUIRE(region.channelRange == Range<uint8_t>(1, 16));
REQUIRE(region.channelRange == sfz::Range<uint8_t>(1, 16));
region.parseOpcode({ "lochan", "4" });
REQUIRE(region.channelRange == Range<uint8_t>(4, 16));
REQUIRE(region.channelRange == sfz::Range<uint8_t>(4, 16));
region.parseOpcode({ "lochan", "128" });
REQUIRE(region.channelRange == Range<uint8_t>(16, 16));
REQUIRE(region.channelRange == sfz::Range<uint8_t>(16, 16));
region.parseOpcode({ "lochan", "-3" });
REQUIRE(region.channelRange == Range<uint8_t>(1, 16));
REQUIRE(region.channelRange == sfz::Range<uint8_t>(1, 16));
region.parseOpcode({ "hichan", "13" });
REQUIRE(region.channelRange == Range<uint8_t>(1, 13));
REQUIRE(region.channelRange == sfz::Range<uint8_t>(1, 13));
region.parseOpcode({ "hichan", "-1" });
REQUIRE(region.channelRange == Range<uint8_t>(1, 1));
REQUIRE(region.channelRange == sfz::Range<uint8_t>(1, 1));
region.parseOpcode({ "hichan", "128" });
REQUIRE(region.channelRange == Range<uint8_t>(1, 16));
REQUIRE(region.channelRange == sfz::Range<uint8_t>(1, 16));
}
SECTION("lobend, hibend")
{
REQUIRE(region.bendRange == Range<int>(-8192, 8192));
REQUIRE(region.bendRange == sfz::Range<int>(-8192, 8192));
region.parseOpcode({ "lobend", "4" });
REQUIRE(region.bendRange == Range<int>(4, 8192));
REQUIRE(region.bendRange == sfz::Range<int>(4, 8192));
region.parseOpcode({ "lobend", "-128" });
REQUIRE(region.bendRange == Range<int>(-128, 8192));
REQUIRE(region.bendRange == sfz::Range<int>(-128, 8192));
region.parseOpcode({ "lobend", "-10000" });
REQUIRE(region.bendRange == Range<int>(-8192, 8192));
REQUIRE(region.bendRange == sfz::Range<int>(-8192, 8192));
region.parseOpcode({ "hibend", "13" });
REQUIRE(region.bendRange == Range<int>(-8192, 13));
REQUIRE(region.bendRange == sfz::Range<int>(-8192, 13));
region.parseOpcode({ "hibend", "-1" });
REQUIRE(region.bendRange == Range<int>(-8192, -1));
REQUIRE(region.bendRange == sfz::Range<int>(-8192, -1));
region.parseOpcode({ "hibend", "10000" });
REQUIRE(region.bendRange == Range<int>(-8192, 8192));
REQUIRE(region.bendRange == sfz::Range<int>(-8192, 8192));
}
SECTION("locc, hicc")
{
REQUIRE(region.ccConditions.getWithDefault(0) == Range<uint8_t>(0, 127));
REQUIRE(region.ccConditions[127] == Range<uint8_t>(0, 127));
REQUIRE(region.ccConditions.getWithDefault(0) == sfz::Range<uint8_t>(0, 127));
REQUIRE(region.ccConditions[127] == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "locc6", "4" });
REQUIRE(region.ccConditions[6] == Range<uint8_t>(4, 127));
REQUIRE(region.ccConditions[6] == sfz::Range<uint8_t>(4, 127));
region.parseOpcode({ "locc12", "-128" });
REQUIRE(region.ccConditions[12] == Range<uint8_t>(0, 127));
REQUIRE(region.ccConditions[12] == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "hicc65", "39" });
REQUIRE(region.ccConditions[65] == Range<uint8_t>(0, 39));
REQUIRE(region.ccConditions[65] == sfz::Range<uint8_t>(0, 39));
region.parseOpcode({ "hicc127", "135" });
REQUIRE(region.ccConditions[127] == Range<uint8_t>(0, 127));
REQUIRE(region.ccConditions[127] == sfz::Range<uint8_t>(0, 127));
}
SECTION("sw_lokey, sw_hikey")
{
REQUIRE(region.keyswitchRange == Range<uint8_t>(0, 127));
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "sw_lokey", "4" });
REQUIRE(region.keyswitchRange == Range<uint8_t>(4, 127));
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(4, 127));
region.parseOpcode({ "sw_lokey", "128" });
REQUIRE(region.keyswitchRange == Range<uint8_t>(127, 127));
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "sw_lokey", "0" });
REQUIRE(region.keyswitchRange == Range<uint8_t>(0, 127));
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "sw_hikey", "39" });
REQUIRE(region.keyswitchRange == Range<uint8_t>(0, 39));
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(0, 39));
region.parseOpcode({ "sw_hikey", "135" });
REQUIRE(region.keyswitchRange == Range<uint8_t>(0, 127));
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "sw_hikey", "-1" });
REQUIRE(region.keyswitchRange == Range<uint8_t>(0, 0));
REQUIRE(region.keyswitchRange == sfz::Range<uint8_t>(0, 0));
}
SECTION("sw_last")
@ -368,53 +368,53 @@ TEST_CASE("[Region] Parsing opcodes")
SECTION("lochanaft, hichanaft")
{
REQUIRE(region.aftertouchRange == Range<uint8_t>(0, 127));
REQUIRE(region.aftertouchRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "lochanaft", "4" });
REQUIRE(region.aftertouchRange == Range<uint8_t>(4, 127));
REQUIRE(region.aftertouchRange == sfz::Range<uint8_t>(4, 127));
region.parseOpcode({ "lochanaft", "128" });
REQUIRE(region.aftertouchRange == Range<uint8_t>(127, 127));
REQUIRE(region.aftertouchRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "lochanaft", "0" });
REQUIRE(region.aftertouchRange == Range<uint8_t>(0, 127));
REQUIRE(region.aftertouchRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "hichanaft", "39" });
REQUIRE(region.aftertouchRange == Range<uint8_t>(0, 39));
REQUIRE(region.aftertouchRange == sfz::Range<uint8_t>(0, 39));
region.parseOpcode({ "hichanaft", "135" });
REQUIRE(region.aftertouchRange == Range<uint8_t>(0, 127));
REQUIRE(region.aftertouchRange == sfz::Range<uint8_t>(0, 127));
region.parseOpcode({ "hichanaft", "-1" });
REQUIRE(region.aftertouchRange == Range<uint8_t>(0, 0));
REQUIRE(region.aftertouchRange == sfz::Range<uint8_t>(0, 0));
}
SECTION("lobpm, hibpm")
{
REQUIRE(region.bpmRange == Range<float>(0, 500));
REQUIRE(region.bpmRange == sfz::Range<float>(0, 500));
region.parseOpcode({ "lobpm", "47.5" });
REQUIRE(region.bpmRange == Range<float>(47.5, 500));
REQUIRE(region.bpmRange == sfz::Range<float>(47.5, 500));
region.parseOpcode({ "lobpm", "594" });
REQUIRE(region.bpmRange == Range<float>(500, 500));
REQUIRE(region.bpmRange == sfz::Range<float>(500, 500));
region.parseOpcode({ "lobpm", "0" });
REQUIRE(region.bpmRange == Range<float>(0, 500));
REQUIRE(region.bpmRange == sfz::Range<float>(0, 500));
region.parseOpcode({ "hibpm", "78" });
REQUIRE(region.bpmRange == Range<float>(0, 78));
REQUIRE(region.bpmRange == sfz::Range<float>(0, 78));
region.parseOpcode({ "hibpm", "895.4" });
REQUIRE(region.bpmRange == Range<float>(0, 500));
REQUIRE(region.bpmRange == sfz::Range<float>(0, 500));
region.parseOpcode({ "hibpm", "-1" });
REQUIRE(region.bpmRange == Range<float>(0, 0));
REQUIRE(region.bpmRange == sfz::Range<float>(0, 0));
}
SECTION("lorand, hirand")
{
REQUIRE(region.randRange == Range<float>(0, 1));
REQUIRE(region.randRange == sfz::Range<float>(0, 1));
region.parseOpcode({ "lorand", "0.5" });
REQUIRE(region.randRange == Range<float>(0.5, 1));
REQUIRE(region.randRange == sfz::Range<float>(0.5, 1));
region.parseOpcode({ "lorand", "4" });
REQUIRE(region.randRange == Range<float>(1, 1));
REQUIRE(region.randRange == sfz::Range<float>(1, 1));
region.parseOpcode({ "lorand", "0" });
REQUIRE(region.randRange == Range<float>(0, 1));
REQUIRE(region.randRange == sfz::Range<float>(0, 1));
region.parseOpcode({ "hirand", "39" });
REQUIRE(region.randRange == Range<float>(0, 1));
REQUIRE(region.randRange == sfz::Range<float>(0, 1));
region.parseOpcode({ "hirand", "0.7" });
REQUIRE(region.randRange == Range<float>(0, 0.7f));
REQUIRE(region.randRange == sfz::Range<float>(0, 0.7f));
region.parseOpcode({ "hirand", "-1" });
REQUIRE(region.randRange == Range<float>(0, 0));
REQUIRE(region.randRange == sfz::Range<float>(0, 0));
}
SECTION("seq_length")
@ -459,10 +459,10 @@ TEST_CASE("[Region] Parsing opcodes")
}
region.parseOpcode({ "on_locc45", "15" });
REQUIRE(region.ccTriggers.contains(45));
REQUIRE(region.ccTriggers[45] == Range<uint8_t>(15, 127));
REQUIRE(region.ccTriggers[45] == sfz::Range<uint8_t>(15, 127));
region.parseOpcode({ "on_hicc4", "47" });
REQUIRE(region.ccTriggers.contains(45));
REQUIRE(region.ccTriggers[4] == Range<uint8_t>(0, 47));
REQUIRE(region.ccTriggers[4] == sfz::Range<uint8_t>(0, 47));
}
SECTION("volume")
@ -604,116 +604,116 @@ TEST_CASE("[Region] Parsing opcodes")
SECTION("xfin_lokey, xfin_hikey")
{
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfin_lokey", "4" });
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(4, 4));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(4, 4));
region.parseOpcode({ "xfin_lokey", "128" });
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfin_lokey", "59" });
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfin_hikey", "59" });
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(59, 59));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(59, 59));
region.parseOpcode({ "xfin_hikey", "128" });
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfin_hikey", "0" });
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfin_hikey", "-1" });
REQUIRE(region.crossfadeKeyInRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeKeyInRange == sfz::Range<uint8_t>(0, 0));
}
SECTION("xfin_lovel, xfin_hivel")
{
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfin_lovel", "4" });
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(4, 4));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(4, 4));
region.parseOpcode({ "xfin_lovel", "128" });
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfin_lovel", "59" });
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfin_hivel", "59" });
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(59, 59));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(59, 59));
region.parseOpcode({ "xfin_hivel", "128" });
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfin_hivel", "0" });
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfin_hivel", "-1" });
REQUIRE(region.crossfadeVelInRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeVelInRange == sfz::Range<uint8_t>(0, 0));
}
SECTION("xfout_lokey, xfout_hikey")
{
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfout_lokey", "4" });
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(4, 127));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(4, 127));
region.parseOpcode({ "xfout_lokey", "128" });
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfout_lokey", "59" });
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfout_hikey", "59" });
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(59, 59));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(59, 59));
region.parseOpcode({ "xfout_hikey", "128" });
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfout_hikey", "0" });
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfout_hikey", "-1" });
REQUIRE(region.crossfadeKeyOutRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeKeyOutRange == sfz::Range<uint8_t>(0, 0));
}
SECTION("xfout_lovel, xfout_hivel")
{
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfout_lovel", "4" });
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(4, 127));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(4, 127));
region.parseOpcode({ "xfout_lovel", "128" });
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfout_lovel", "59" });
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfout_hivel", "59" });
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(59, 59));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(59, 59));
region.parseOpcode({ "xfout_hivel", "128" });
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfout_hivel", "0" });
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfout_hivel", "-1" });
REQUIRE(region.crossfadeVelOutRange == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeVelOutRange == sfz::Range<uint8_t>(0, 0));
}
SECTION("xfin_locc, xfin_hicc")
{
REQUIRE(!region.crossfadeCCInRange.contains(4));
region.parseOpcode({ "xfin_locc4", "4" });
REQUIRE(region.crossfadeCCInRange[4] == Range<uint8_t>(4, 4));
REQUIRE(region.crossfadeCCInRange[4] == sfz::Range<uint8_t>(4, 4));
region.parseOpcode({ "xfin_locc4", "128" });
REQUIRE(region.crossfadeCCInRange[4] == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeCCInRange[4] == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfin_locc4", "59" });
REQUIRE(region.crossfadeCCInRange[4] == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeCCInRange[4] == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfin_hicc4", "59" });
REQUIRE(region.crossfadeCCInRange[4] == Range<uint8_t>(59, 59));
REQUIRE(region.crossfadeCCInRange[4] == sfz::Range<uint8_t>(59, 59));
region.parseOpcode({ "xfin_hicc4", "128" });
REQUIRE(region.crossfadeCCInRange[4] == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeCCInRange[4] == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfin_hicc4", "0" });
REQUIRE(region.crossfadeCCInRange[4] == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeCCInRange[4] == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfin_hicc4", "-1" });
REQUIRE(region.crossfadeCCInRange[4] == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeCCInRange[4] == sfz::Range<uint8_t>(0, 0));
}
SECTION("xfout_locc, xfout_hicc")
{
REQUIRE(!region.crossfadeCCOutRange.contains(4));
region.parseOpcode({ "xfout_locc4", "4" });
REQUIRE(region.crossfadeCCOutRange[4] == Range<uint8_t>(4, 127));
REQUIRE(region.crossfadeCCOutRange[4] == sfz::Range<uint8_t>(4, 127));
region.parseOpcode({ "xfout_locc4", "128" });
REQUIRE(region.crossfadeCCOutRange[4] == Range<uint8_t>(127, 127));
REQUIRE(region.crossfadeCCOutRange[4] == sfz::Range<uint8_t>(127, 127));
region.parseOpcode({ "xfout_locc4", "59" });
REQUIRE(region.crossfadeCCOutRange[4] == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeCCOutRange[4] == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfout_hicc4", "59" });
REQUIRE(region.crossfadeCCOutRange[4] == Range<uint8_t>(59, 59));
REQUIRE(region.crossfadeCCOutRange[4] == sfz::Range<uint8_t>(59, 59));
region.parseOpcode({ "xfout_hicc4", "128" });
REQUIRE(region.crossfadeCCOutRange[4] == Range<uint8_t>(59, 127));
REQUIRE(region.crossfadeCCOutRange[4] == sfz::Range<uint8_t>(59, 127));
region.parseOpcode({ "xfout_hicc4", "0" });
REQUIRE(region.crossfadeCCOutRange[4] == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeCCOutRange[4] == sfz::Range<uint8_t>(0, 0));
region.parseOpcode({ "xfout_hicc4", "-1" });
REQUIRE(region.crossfadeCCOutRange[4] == Range<uint8_t>(0, 0));
REQUIRE(region.crossfadeCCOutRange[4] == sfz::Range<uint8_t>(0, 0));
}
SECTION("xf_keycurve")