Use round rather than trunc; more stable..
This commit is contained in:
parent
6bce14673e
commit
872e7c68e0
2 changed files with 2 additions and 5 deletions
|
|
@ -5,7 +5,6 @@
|
||||||
#include "SfzHelpers.h"
|
#include "SfzHelpers.h"
|
||||||
#include "Resources.h"
|
#include "Resources.h"
|
||||||
#include "absl/types/span.h"
|
#include "absl/types/span.h"
|
||||||
|
|
||||||
namespace sfz {
|
namespace sfz {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -150,7 +149,6 @@ void multiplicativeEnvelope(const EventVector& events, absl::Span<float> envelop
|
||||||
if (envelope.size() == 0)
|
if (envelope.size() == 0)
|
||||||
return;
|
return;
|
||||||
const auto maxDelay = static_cast<int>(envelope.size() - 1);
|
const auto maxDelay = static_cast<int>(envelope.size() - 1);
|
||||||
|
|
||||||
const auto logStep = std::log(step);
|
const auto logStep = std::log(step);
|
||||||
// If we assume that a = b.q^r for b in (1, q) then
|
// If we assume that a = b.q^r for b in (1, q) then
|
||||||
// log a log b
|
// log a log b
|
||||||
|
|
@ -178,7 +176,7 @@ void multiplicativeEnvelope(const EventVector& events, absl::Span<float> envelop
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto numSteps = static_cast<int>(std::log(difference) / logStep);
|
const auto numSteps = std::round(std::log(difference) / logStep);
|
||||||
const auto stepLength = static_cast<int>(length / numSteps);
|
const auto stepLength = static_cast<int>(length / numSteps);
|
||||||
for (int i = 0; i < numSteps; ++i) {
|
for (int i = 0; i < numSteps; ++i) {
|
||||||
fill<float>(envelope.subspan(lastDelay, stepLength), lastValue);
|
fill<float>(envelope.subspan(lastDelay, stepLength), lastValue);
|
||||||
|
|
@ -216,7 +214,6 @@ void multiplicativeModifier(const sfz::Resources& resources, absl::Span<float> s
|
||||||
return lambda(curve.evalNormalized(x) * ccData.data.value);
|
return lambda(curve.evalNormalized(x) * ccData.data.value);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// FIXME: not sure about this step size for multiplicative envelopes
|
|
||||||
const float stepSize { lambda(ccData.data.value / (ccData.data.steps - 1)) };
|
const float stepSize { lambda(ccData.data.value / (ccData.data.steps - 1)) };
|
||||||
multiplicativeEnvelope(events, span, [&ccData, &curve, &lambda](float x) {
|
multiplicativeEnvelope(events, span, [&ccData, &curve, &lambda](float x) {
|
||||||
return lambda(curve.evalNormalized(x) * ccData.data.value);
|
return lambda(curve.evalNormalized(x) * ccData.data.value);
|
||||||
|
|
|
||||||
|
|
@ -330,7 +330,7 @@ TEST_CASE("[multiplicativeModifiers] Compare with envelopes")
|
||||||
ccData.data.value = 100.0f;
|
ccData.data.value = 100.0f;
|
||||||
|
|
||||||
resources.midiState.ccEvent(5, 20, 0.1);
|
resources.midiState.ccEvent(5, 20, 0.1);
|
||||||
resources.midiState.ccEvent(10, 20, 0.2);
|
resources.midiState.ccEvent(10, 20, 0.8);
|
||||||
|
|
||||||
std::array<float, 16> output;
|
std::array<float, 16> output;
|
||||||
std::array<float, 16> envelope;
|
std::array<float, 16> envelope;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue