Added a check that a region is a generator for free-running the envelope
This commit is contained in:
parent
9a1582892f
commit
09bad92cff
2 changed files with 12 additions and 13 deletions
|
|
@ -40,11 +40,9 @@ void ADSREnvelope<Type>::reset(const EGDescription& desc, const Region& region,
|
|||
|
||||
releaseDelay = 0;
|
||||
shouldRelease = false;
|
||||
freeRunning = (
|
||||
(region.trigger == SfzTrigger::release)
|
||||
freeRunning = ((region.trigger == SfzTrigger::release)
|
||||
|| (region.trigger == SfzTrigger::release_key)
|
||||
|| region.loopMode == SfzLoopMode::one_shot
|
||||
);
|
||||
|| (region.loopMode == SfzLoopMode::one_shot && (region.isGenerator() || region.oscillator)));
|
||||
currentValue = this->start;
|
||||
currentState = State::Delay;
|
||||
}
|
||||
|
|
@ -117,8 +115,7 @@ void ADSREnvelope<Type>::getBlock(absl::Span<Type> output) noexcept
|
|||
// release takes effect this frame
|
||||
currentState = State::Release;
|
||||
releaseDelay = -1;
|
||||
}
|
||||
else if (shouldRelease && releaseDelay > 0) {
|
||||
} else if (shouldRelease && releaseDelay > 0) {
|
||||
// prevent computing the segment further than release point
|
||||
size = std::min<size_t>(size, releaseDelay);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -294,33 +294,35 @@ inline F fp_from_parts(bool sgn, int ex, uint64_t mant)
|
|||
return u.real;
|
||||
}
|
||||
|
||||
|
||||
template<class F>
|
||||
template <class F>
|
||||
inline bool fp_naninf(F x)
|
||||
{
|
||||
typedef FP_traits<F> T;
|
||||
typedef typename T::same_size_int I;
|
||||
union { F real; I integer; } u;
|
||||
union {
|
||||
F real;
|
||||
I integer;
|
||||
} u;
|
||||
u.real = x;
|
||||
const auto all_ones = ((1u << T::e_bits) - 1);
|
||||
const auto ex = (u.integer >> T::m_bits) & all_ones;
|
||||
return ex == all_ones;
|
||||
}
|
||||
|
||||
template<class Type>
|
||||
template <class Type>
|
||||
bool hasNanInf(absl::Span<Type> span)
|
||||
{
|
||||
for (const auto& x: span)
|
||||
for (const auto& x : span)
|
||||
if (fp_naninf(x))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
template<class Type>
|
||||
template <class Type>
|
||||
bool isValidAudio(absl::Span<Type> span)
|
||||
{
|
||||
for (const auto& x: span)
|
||||
for (const auto& x : span)
|
||||
if (x < -1.0f || x > 1.0f)
|
||||
return false;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue