From 8672a5b5f7b2be275ac707f13d1bc33684f66299 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 19 Mar 2021 14:16:49 +0100 Subject: [PATCH] Add opcode flag: permissive bounds --- src/sfizz/Defaults.h | 11 ++++++----- src/sfizz/Opcode.cpp | 26 +++++++++++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index 6b65e4b7..a4692622 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -51,11 +51,12 @@ enum OpcodeFlags : int { kEnforceLowerBound = 1 << 1, kEnforceUpperBound = 1 << 2, kEnforceBounds = kEnforceLowerBound|kEnforceUpperBound, - kNormalizePercent = 1 << 3, - kNormalizeMidi = 1 << 4, - kNormalizeBend = 1 << 5, - kWrapPhase = 1 << 6, - kDb2Mag = 1 << 7, + kPermissiveBounds = 1 << 3, + kNormalizePercent = 1 << 4, + kNormalizeMidi = 1 << 5, + kNormalizeBend = 1 << 6, + kWrapPhase = 1 << 7, + kDb2Mag = 1 << 8, }; template diff --git a/src/sfizz/Opcode.cpp b/src/sfizz/Opcode.cpp index 79ac2eac..935498e8 100644 --- a/src/sfizz/Opcode.cpp +++ b/src/sfizz/Opcode.cpp @@ -11,6 +11,7 @@ #include "absl/strings/ascii.h" #include "absl/strings/match.h" #include "absl/strings/str_cat.h" +#include #include #include #include @@ -144,6 +145,8 @@ OpcodeCategory Opcode::identifyCategory(absl::string_view name) template absl::optional readInt_(OpcodeSpec spec, absl::string_view v) { + using Limits = std::numeric_limits; + size_t numberEnd = 0; if (numberEnd < v.size() && (v[numberEnd] == '+' || v[numberEnd] == '-')) @@ -164,15 +167,18 @@ absl::optional readInt_(OpcodeSpec spec, absl::string_view v) if (returnedValue > static_cast(spec.bounds.getEnd())) { if (spec.flags & kEnforceUpperBound) return spec.bounds.getEnd(); - - return absl::nullopt; + else if (!(spec.flags & kPermissiveBounds)) + return absl::nullopt; } else if (returnedValue < static_cast(spec.bounds.getStart())) { if (spec.flags & kEnforceLowerBound) return spec.bounds.getStart(); - - return absl::nullopt; + else if (!(spec.flags & kPermissiveBounds)) + return absl::nullopt; } + returnedValue = std::max(returnedValue, Limits::min()); + returnedValue = std::min(returnedValue, Limits::max()); + return static_cast(returnedValue); } @@ -219,16 +225,18 @@ absl::optional readFloat_(OpcodeSpec spec, absl::string_view v) else if (returnedValue > static_cast(spec.bounds.getEnd())) { if (spec.flags & kEnforceUpperBound) return spec.bounds.getEnd(); - - return absl::nullopt; + else if (!(spec.flags & kPermissiveBounds)) + return absl::nullopt; } else if (returnedValue < static_cast(spec.bounds.getStart())) { if (spec.flags & kEnforceLowerBound) return spec.bounds.getStart(); - - return absl::nullopt; + else if (!(spec.flags & kPermissiveBounds)) + return absl::nullopt; } - return spec.normalizeInput(returnedValue); + returnedValue = spec.normalizeInput(returnedValue); + + return returnedValue; } #define INSTANTIATE_FOR_FLOATING_POINT(T) \