diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index c3649054..fb6ba39e 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -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; } diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 4bc1a91f..4935a85e 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -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> velocityPoints; // amp_velcurve_N absl::optional velCurve {}; float ampRandom { Default::ampRandom }; // amp_random diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 3c15addf..3307a8e9 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -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);