Adapt start_lohdccN to match ARIA: float 0-127 range

This commit is contained in:
Jean Pierre Cimalando 2020-05-16 20:15:51 +02:00
parent 513055980b
commit ac8d2d24a3
4 changed files with 32 additions and 8 deletions

View file

@ -102,6 +102,20 @@ public:
_start = value;
}
/**
* @brief Convert the range to a different value type
*
* @return Range<Other>
*/
template <class Other>
Range<Other> to() const noexcept
{
return Range<Other> {
static_cast<Other>(_start),
static_cast<Other>(_end),
};
}
private:
Type _start { static_cast<Type>(0.0) };
Type _end { static_cast<Type>(0.0) };

View file

@ -324,14 +324,14 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
case hash("start_lohdcc&"): // also on_lohdcc&
if (opcode.parameters.back() >= config::numCCs)
return false;
if (auto value = readOpcode(opcode.value, Default::normalizedRange))
ccTriggers[opcode.parameters.back()].setStart(*value);
if (auto value = readOpcode(opcode.value, Default::midi7Range.to<float>()))
ccTriggers[opcode.parameters.back()].setStart(normalizeCC(*value));
break;
case hash("start_hihdcc&"): // also on_hihdcc&
if (opcode.parameters.back() >= config::numCCs)
return false;
if (auto value = readOpcode(opcode.value, Default::normalizedRange))
ccTriggers[opcode.parameters.back()].setEnd(*value);
if (auto value = readOpcode(opcode.value, Default::midi7Range.to<float>()))
ccTriggers[opcode.parameters.back()].setEnd(normalizeCC(*value));
break;
// Performance parameters: amplifier

View file

@ -194,6 +194,16 @@ namespace literals {
return normalize7Bits(value);
}
inline float operator""_norm(long double value)
{
if (value < 0)
value = 0;
if (value > 127)
value = 127;
return normalize7Bits(value);
}
}
/**

View file

@ -501,14 +501,14 @@ TEST_CASE("[Region] Parsing opcodes")
for (int ccIdx = 1; ccIdx < 128; ++ccIdx) {
REQUIRE(!region.ccTriggers.contains(ccIdx));
}
region.parseOpcode({ "on_lohdcc46", "0.15" });
region.parseOpcode({ "on_lohdcc46", "15.9" });
REQUIRE(region.ccTriggers.contains(46));
REQUIRE(region.ccTriggers[46].getStart() == Approx(0.15f));
REQUIRE(region.ccTriggers[46].getStart() == Approx(15.9_norm));
REQUIRE(region.ccTriggers[46].getEnd() == 1.0f);
region.parseOpcode({ "on_hihdcc5", "0.47" });
region.parseOpcode({ "on_hihdcc5", "47.3" });
REQUIRE(region.ccTriggers.contains(5));
REQUIRE(region.ccTriggers[5].getStart() == 0.0f);
REQUIRE(region.ccTriggers[5].getEnd() == Approx(0.47f));
REQUIRE(region.ccTriggers[5].getEnd() == Approx(47.3_norm));
}
SECTION("volume")