Move crossfades to SfzHelpers
This commit is contained in:
parent
16472b4ef9
commit
394512183a
2 changed files with 51 additions and 42 deletions
|
|
@ -1016,48 +1016,6 @@ uint32_t sfz::Region::loopEnd(Oversampling factor) const noexcept
|
||||||
return loopRange.getEnd() * static_cast<uint32_t>(factor);
|
return loopRange.getEnd() * static_cast<uint32_t>(factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T, class U>
|
|
||||||
float crossfadeIn(const sfz::Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
|
|
||||||
{
|
|
||||||
if (value < crossfadeRange.getStart())
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
const auto length = static_cast<float>(crossfadeRange.length());
|
|
||||||
if (length == 0.0f)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
else if (value < crossfadeRange.getEnd()) {
|
|
||||||
const auto crossfadePosition = static_cast<float>(value - crossfadeRange.getStart()) / length;
|
|
||||||
if (curve == SfzCrossfadeCurve::power)
|
|
||||||
return sqrt(crossfadePosition);
|
|
||||||
if (curve == SfzCrossfadeCurve::gain)
|
|
||||||
return crossfadePosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T, class U>
|
|
||||||
float crossfadeOut(const sfz::Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
|
|
||||||
{
|
|
||||||
if (value > crossfadeRange.getEnd())
|
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
const auto length = static_cast<float>(crossfadeRange.length());
|
|
||||||
if (length == 0.0f)
|
|
||||||
return 1.0f;
|
|
||||||
|
|
||||||
else if (value > crossfadeRange.getStart()) {
|
|
||||||
const auto crossfadePosition = static_cast<float>(value - crossfadeRange.getStart()) / length;
|
|
||||||
if (curve == SfzCrossfadeCurve::power)
|
|
||||||
return std::sqrt(1 - crossfadePosition);
|
|
||||||
if (curve == SfzCrossfadeCurve::gain)
|
|
||||||
return 1 - crossfadePosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
float sfz::Region::getNoteGain(int noteNumber, float velocity) const noexcept
|
float sfz::Region::getNoteGain(int noteNumber, float velocity) const noexcept
|
||||||
{
|
{
|
||||||
ASSERT(velocity >= 0.0f && velocity <= 1.0f);
|
ASSERT(velocity >= 0.0f && velocity <= 1.0f);
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "MathHelpers.h"
|
#include "MathHelpers.h"
|
||||||
#include "absl/meta/type_traits.h"
|
#include "absl/meta/type_traits.h"
|
||||||
|
#include "Defaults.h"
|
||||||
|
|
||||||
namespace sfz
|
namespace sfz
|
||||||
{
|
{
|
||||||
|
|
@ -305,5 +306,55 @@ inline CXX14_CONSTEXPR void multiplyByCents(float& base, int modifier)
|
||||||
base *= centsFactor(modifier);
|
base *= centsFactor(modifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute a crossfade in value with respect to a crossfade range (note, velocity, cc, ...)
|
||||||
|
*/
|
||||||
|
template<class T, class U>
|
||||||
|
float crossfadeIn(const sfz::Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
|
||||||
|
{
|
||||||
|
if (value < crossfadeRange.getStart())
|
||||||
|
return 0.0f;
|
||||||
|
|
||||||
|
const auto length = static_cast<float>(crossfadeRange.length());
|
||||||
|
if (length == 0.0f)
|
||||||
|
return 1.0f;
|
||||||
|
|
||||||
|
else if (value < crossfadeRange.getEnd()) {
|
||||||
|
const auto crossfadePosition = static_cast<float>(value - crossfadeRange.getStart()) / length;
|
||||||
|
if (curve == SfzCrossfadeCurve::power)
|
||||||
|
return sqrt(crossfadePosition);
|
||||||
|
if (curve == SfzCrossfadeCurve::gain)
|
||||||
|
return crossfadePosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute a crossfade out value with respect to a crossfade range (note, velocity, cc, ...)
|
||||||
|
*/
|
||||||
|
template<class T, class U>
|
||||||
|
float crossfadeOut(const sfz::Range<T>& crossfadeRange, U value, SfzCrossfadeCurve curve)
|
||||||
|
{
|
||||||
|
if (value > crossfadeRange.getEnd())
|
||||||
|
return 0.0f;
|
||||||
|
|
||||||
|
const auto length = static_cast<float>(crossfadeRange.length());
|
||||||
|
if (length == 0.0f)
|
||||||
|
return 1.0f;
|
||||||
|
|
||||||
|
else if (value > crossfadeRange.getStart()) {
|
||||||
|
const auto crossfadePosition = static_cast<float>(value - crossfadeRange.getStart()) / length;
|
||||||
|
if (curve == SfzCrossfadeCurve::power)
|
||||||
|
return std::sqrt(1 - crossfadePosition);
|
||||||
|
if (curve == SfzCrossfadeCurve::gain)
|
||||||
|
return 1 - crossfadePosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace sfz
|
} // namespace sfz
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue