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;
|
releaseDelay = 0;
|
||||||
shouldRelease = false;
|
shouldRelease = false;
|
||||||
freeRunning = (
|
freeRunning = ((region.trigger == SfzTrigger::release)
|
||||||
(region.trigger == SfzTrigger::release)
|
|
||||||
|| (region.trigger == SfzTrigger::release_key)
|
|| (region.trigger == SfzTrigger::release_key)
|
||||||
|| region.loopMode == SfzLoopMode::one_shot
|
|| (region.loopMode == SfzLoopMode::one_shot && (region.isGenerator() || region.oscillator)));
|
||||||
);
|
|
||||||
currentValue = this->start;
|
currentValue = this->start;
|
||||||
currentState = State::Delay;
|
currentState = State::Delay;
|
||||||
}
|
}
|
||||||
|
|
@ -117,8 +115,7 @@ void ADSREnvelope<Type>::getBlock(absl::Span<Type> output) noexcept
|
||||||
// release takes effect this frame
|
// release takes effect this frame
|
||||||
currentState = State::Release;
|
currentState = State::Release;
|
||||||
releaseDelay = -1;
|
releaseDelay = -1;
|
||||||
}
|
} else if (shouldRelease && releaseDelay > 0) {
|
||||||
else if (shouldRelease && releaseDelay > 0) {
|
|
||||||
// prevent computing the segment further than release point
|
// prevent computing the segment further than release point
|
||||||
size = std::min<size_t>(size, releaseDelay);
|
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;
|
return u.real;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class F>
|
||||||
template<class F>
|
|
||||||
inline bool fp_naninf(F x)
|
inline bool fp_naninf(F x)
|
||||||
{
|
{
|
||||||
typedef FP_traits<F> T;
|
typedef FP_traits<F> T;
|
||||||
typedef typename T::same_size_int I;
|
typedef typename T::same_size_int I;
|
||||||
union { F real; I integer; } u;
|
union {
|
||||||
|
F real;
|
||||||
|
I integer;
|
||||||
|
} u;
|
||||||
u.real = x;
|
u.real = x;
|
||||||
const auto all_ones = ((1u << T::e_bits) - 1);
|
const auto all_ones = ((1u << T::e_bits) - 1);
|
||||||
const auto ex = (u.integer >> T::m_bits) & all_ones;
|
const auto ex = (u.integer >> T::m_bits) & all_ones;
|
||||||
return ex == all_ones;
|
return ex == all_ones;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Type>
|
template <class Type>
|
||||||
bool hasNanInf(absl::Span<Type> span)
|
bool hasNanInf(absl::Span<Type> span)
|
||||||
{
|
{
|
||||||
for (const auto& x: span)
|
for (const auto& x : span)
|
||||||
if (fp_naninf(x))
|
if (fp_naninf(x))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Type>
|
template <class Type>
|
||||||
bool isValidAudio(absl::Span<Type> span)
|
bool isValidAudio(absl::Span<Type> span)
|
||||||
{
|
{
|
||||||
for (const auto& x: span)
|
for (const auto& x : span)
|
||||||
if (x < -1.0f || x > 1.0f)
|
if (x < -1.0f || x > 1.0f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue