#include "LinearEnvelope.h" #include "Helpers.h" #include "SIMDHelpers.h" #include namespace sfz { template LinearEnvelope::LinearEnvelope() { setMaxCapacity(maxCapacity); } template LinearEnvelope::LinearEnvelope(int maxCapacity, std::function function) { setMaxCapacity(maxCapacity); setFunction(function); } template void LinearEnvelope::setMaxCapacity(int maxCapacity) { events.reserve(maxCapacity); this->maxCapacity = maxCapacity; } template void LinearEnvelope::setFunction(std::function function) { this->function = function; } template void LinearEnvelope::registerEvent(int timestamp, Type inputValue) { if (static_cast(events.size()) < maxCapacity) events.emplace_back(timestamp, function(inputValue)); } template void LinearEnvelope::clear() { events.clear(); } template void LinearEnvelope::reset(Type value) { clear(); currentValue = function(value); } template void LinearEnvelope::getBlock(absl::Span output) { absl::c_sort(events, [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); int index { 0 }; for (auto& event : events) { const auto length = min(event.first, static_cast(output.size())) - index; if (length == 0) { currentValue = event.second; continue; } const auto step = (event.second - currentValue) / length; currentValue = ::linearRamp(output.subspan(index, length), currentValue, step); index += length; } if (index < static_cast(output.size())) ::fill(output.subspan(index), currentValue); clear(); } }