From 9e3f496f9e43e1441348f9f3d1cd030674ad4823 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Mon, 30 Mar 2020 21:32:50 +0200 Subject: [PATCH] Add multiplicative envelope --- src/sfizz/SfzHelpers.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/sfizz/SfzHelpers.h b/src/sfizz/SfzHelpers.h index 15177dac..5aea9bdb 100644 --- a/src/sfizz/SfzHelpers.h +++ b/src/sfizz/SfzHelpers.h @@ -361,5 +361,25 @@ void linearEnvelope(const EventVector& events, absl::Span envelope, F&& l fill(envelope.subspan(lastDelay), lastValue); } +template +void multiplicativeEnvelope(const EventVector& events, absl::Span envelope, F&& lambda) +{ + ASSERT(events.size() > 0); + ASSERT(events[0].delay == 0); + + auto lastValue = lambda(events[0].value); + auto lastDelay = events[0].delay; + for (unsigned i = 1; i < events.size(); ++ i) { + const auto event = events[i]; + const auto length = event.delay - lastDelay; + const auto nextValue = lambda(event.value); + const auto step = std::exp((std::log(nextValue) - std::log(currentValue)) / length); + multiplicativeRamp(envelope.subspan(lastDelay, length), lastValue, step); + lastValue = nextValue; + lastDelay += length; + } + fill(envelope.subspan(lastDelay), lastValue); +} + } // namespace sfz