Fix amp_veltrack

This commit is contained in:
Jean Pierre Cimalando 2020-08-17 15:31:58 +02:00
parent ebe5339ca3
commit f5d61fe183
3 changed files with 9 additions and 16 deletions

View file

@ -432,7 +432,8 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
setValueFromOpcode(opcode, ampKeytrack, Default::ampKeytrackRange);
break;
case hash("amp_veltrack"):
setValueFromOpcode(opcode, ampVeltrack, Default::ampVeltrackRange);
if (auto value = readOpcode(opcode.value, Default::ampVeltrackRange))
ampVeltrack = normalizePercents(*value);
break;
case hash("amp_random"):
setValueFromOpcode(opcode, ampRandom, Default::ampRandomRange);
@ -1517,19 +1518,8 @@ float sfz::Region::velocityCurve(float velocity) const noexcept
{
ASSERT(velocity >= 0.0f && velocity <= 1.0f);
float gain { 1.0f };
if (velCurve) { // Custom velocity curve
return velCurve->evalNormalized(velocity);
} else { // Standard velocity curve
// FIXME: Maybe there's a prettier way to check the boundaries?
const float gaindB = [&]() {
if (ampVeltrack >= 0)
return velocity == 0.0f ? -90.0f : 40 * std::log(velocity) / std::log(10.0f);
else
return velocity == 1.0f ? -90.0f : 40 * std::log(1 - velocity) / std::log(10.0f);
}();
gain *= db2mag( gaindB * std::abs(ampVeltrack) / sfz::Default::ampVeltrackRange.getEnd());
}
float gain = std::fabs(ampVeltrack) * (1.0f - velCurve->evalNormalized(velocity));
gain = (ampVeltrack < 0) ? gain : (1.0f - gain);
return gain;
}

View file

@ -331,7 +331,7 @@ struct Region {
float position { normalizePercents(Default::position) }; // position
uint8_t ampKeycenter { Default::ampKeycenter }; // amp_keycenter
float ampKeytrack { Default::ampKeytrack }; // amp_keytrack
float ampVeltrack { Default::ampVeltrack }; // amp_keytrack
float ampVeltrack { normalizePercents(Default::ampVeltrack) }; // amp_keytrack
std::vector<std::pair<uint8_t, float>> velocityPoints; // amp_velcurve_N
absl::optional<Curve> velCurve {};
float ampRandom { Default::ampRandom }; // amp_random

View file

@ -568,7 +568,10 @@ void sfz::Synth::finalizeSfzLoad()
if (!region->velocityPoints.empty())
region->velCurve = Curve::buildFromVelcurvePoints(
region->velocityPoints, Curve::Interpolator::Linear, region->ampVeltrack < 0.0f);
region->velocityPoints, Curve::Interpolator::Linear);
else
region->velCurve = resources.curves.getCurve(4);
region->registerPitchWheel(0);
region->registerAftertouch(0);
region->registerTempo(2.0f);