Formatting step
This commit is contained in:
parent
7e8cdff407
commit
5088bed9b0
16 changed files with 323 additions and 294 deletions
|
|
@ -53,7 +53,8 @@ BENCHMARK_DEFINE_F(EnvelopeFixture, LinearQuantized)(benchmark::State& state) {
|
||||||
{ 0, 0.0f },
|
{ 0, 0.0f },
|
||||||
{ static_cast<int>(state.range(0) - 1), dist(gen) }
|
{ static_cast<int>(state.range(0) - 1), dist(gen) }
|
||||||
};
|
};
|
||||||
linearEnvelope(events, absl::MakeSpan(output), [](float x) { return x; }, 0.5);
|
linearEnvelope(
|
||||||
|
events, absl::MakeSpan(output), [](float x) { return x; }, 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,7 +76,8 @@ BENCHMARK_DEFINE_F(EnvelopeFixture, MultiplicativeQuantized)(benchmark::State& s
|
||||||
{ 0, 1.0f },
|
{ 0, 1.0f },
|
||||||
{ static_cast<int>(state.range(0) - 1), dist(gen) }
|
{ static_cast<int>(state.range(0) - 1), dist(gen) }
|
||||||
};
|
};
|
||||||
multiplicativeEnvelope(events, absl::MakeSpan(output), [](float x) { return x; }, 2.0f);
|
multiplicativeEnvelope(
|
||||||
|
events, absl::MakeSpan(output), [](float x) { return x; }, 2.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,10 @@
|
||||||
#include "MathHelpers.h"
|
#include "MathHelpers.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace sfz
|
namespace sfz {
|
||||||
{
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
class SpanHolder
|
class SpanHolder {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
SpanHolder() {}
|
SpanHolder() {}
|
||||||
SpanHolder(const SpanHolder<T>&) = delete;
|
SpanHolder(const SpanHolder<T>&) = delete;
|
||||||
|
|
@ -40,7 +38,10 @@ public:
|
||||||
other.available = nullptr;
|
other.available = nullptr;
|
||||||
}
|
}
|
||||||
SpanHolder(T&& value, int* available)
|
SpanHolder(T&& value, int* available)
|
||||||
: value(std::forward<T>(value)), available(available) {}
|
: value(std::forward<T>(value))
|
||||||
|
, available(available)
|
||||||
|
{
|
||||||
|
}
|
||||||
T& operator*() { return value; }
|
T& operator*() { return value; }
|
||||||
T* operator->() { return &value; }
|
T* operator->() { return &value; }
|
||||||
explicit operator bool() const { return available != nullptr; }
|
explicit operator bool() const { return available != nullptr; }
|
||||||
|
|
@ -49,13 +50,13 @@ public:
|
||||||
if (available)
|
if (available)
|
||||||
*available += 1;
|
*available += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T value {};
|
T value {};
|
||||||
int* available { nullptr };
|
int* available { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
class BufferPool
|
class BufferPool {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
BufferPool()
|
BufferPool()
|
||||||
{
|
{
|
||||||
|
|
@ -148,7 +149,6 @@ public:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _setBufferSize(unsigned bufferSize)
|
void _setBufferSize(unsigned bufferSize)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,6 @@ float sfz::MidiState::getNoteVelocity(int noteNumber) const noexcept
|
||||||
return lastNoteVelocities[noteNumber];
|
return lastNoteVelocities[noteNumber];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sfz::MidiState::pitchBendEvent(int delay, float pitchBendValue) noexcept
|
void sfz::MidiState::pitchBendEvent(int delay, float pitchBendValue) noexcept
|
||||||
{
|
{
|
||||||
ASSERT(pitchBendValue >= -1.0f && pitchBendValue <= 1.0f);
|
ASSERT(pitchBendValue >= -1.0f && pitchBendValue <= 1.0f);
|
||||||
|
|
|
||||||
|
|
@ -125,8 +125,6 @@ public:
|
||||||
const EventVector& getPitchEvents() const noexcept;
|
const EventVector& getPitchEvents() const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
||||||
int activeNotes { 0 };
|
int activeNotes { 0 };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -134,26 +132,35 @@ private:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
MidiNoteArray<unsigned> noteOnTimes { {} };
|
MidiNoteArray<unsigned> noteOnTimes { {} };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stores the note off times.
|
* @brief Stores the note off times.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MidiNoteArray<unsigned> noteOffTimes { {} };
|
MidiNoteArray<unsigned> noteOffTimes { {} };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stores the velocity of the note ons for currently
|
* @brief Stores the velocity of the note ons for currently
|
||||||
* depressed notes.
|
* depressed notes.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
MidiNoteArray<float> lastNoteVelocities;
|
MidiNoteArray<float> lastNoteVelocities;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Current known values for the CCs.
|
* @brief Current known values for the CCs.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
std::array<EventVector, config::numCCs> cc;
|
std::array<EventVector, config::numCCs> cc;
|
||||||
|
|
||||||
const EventVector nullEvent {{0, 0.0f}};
|
|
||||||
/**
|
/**
|
||||||
* Pitch bend status
|
* @brief Null event
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
const EventVector nullEvent { { 0, 0.0f } };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pitch bend status
|
||||||
*/
|
*/
|
||||||
EventVector pitchEvents;
|
EventVector pitchEvents;
|
||||||
float sampleRate { config::defaultSampleRate };
|
float sampleRate { config::defaultSampleRate };
|
||||||
|
|
|
||||||
|
|
@ -193,8 +193,7 @@ constexpr float normalizeBend(float bendValue)
|
||||||
return clamp(bendValue, -8191.0f, 8191.0f) / 8191.0f;
|
return clamp(bendValue, -8191.0f, 8191.0f) / 8191.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace literals
|
namespace literals {
|
||||||
{
|
|
||||||
inline float operator""_norm(unsigned long long int value)
|
inline float operator""_norm(unsigned long long int value)
|
||||||
{
|
{
|
||||||
if (value > 127)
|
if (value > 127)
|
||||||
|
|
@ -204,7 +203,6 @@ inline float operator ""_norm(unsigned long long int value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Convert a note in string to its equivalent midi note number
|
* @brief Convert a note in string to its equivalent midi note number
|
||||||
*
|
*
|
||||||
|
|
@ -275,7 +273,6 @@ bool findDefine(absl::string_view line, absl::string_view& variable, absl::strin
|
||||||
*/
|
*/
|
||||||
bool findInclude(absl::string_view line, std::string& path);
|
bool findInclude(absl::string_view line, std::string& path);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief multiply a value by a factor, in cents. To be used for pitch variations.
|
* @brief multiply a value by a factor, in cents. To be used for pitch variations.
|
||||||
*
|
*
|
||||||
|
|
@ -293,7 +290,6 @@ inline CXX14_CONSTEXPR float gainModifier(T modifier, float value)
|
||||||
return value * modifier;
|
return value * modifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Compute a crossfade in value with respect to a crossfade range (note, velocity, cc, ...)
|
* @brief Compute a crossfade in value with respect to a crossfade range (note, velocity, cc, ...)
|
||||||
*/
|
*/
|
||||||
|
|
@ -318,7 +314,6 @@ float crossfadeIn(const sfz::Range<T>& crossfadeRange, U value, SfzCrossfadeCurv
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Compute a crossfade out value with respect to a crossfade range (note, velocity, cc, ...)
|
* @brief Compute a crossfade out value with respect to a crossfade range (note, velocity, cc, ...)
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -545,7 +545,6 @@ void sfz::Voice::fillWithGenerator(AudioSpan<float> buffer) noexcept
|
||||||
const auto leftSpan = buffer.getSpan(0);
|
const auto leftSpan = buffer.getSpan(0);
|
||||||
const auto rightSpan = buffer.getSpan(1);
|
const auto rightSpan = buffer.getSpan(1);
|
||||||
|
|
||||||
|
|
||||||
if (region->sample == "*noise") {
|
if (region->sample == "*noise") {
|
||||||
absl::c_generate(leftSpan, [&](){ return noiseDist(Random::randomGenerator); });
|
absl::c_generate(leftSpan, [&](){ return noiseDist(Random::randomGenerator); });
|
||||||
absl::c_generate(rightSpan, [&](){ return noiseDist(Random::randomGenerator); });
|
absl::c_generate(rightSpan, [&](){ return noiseDist(Random::randomGenerator); });
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,6 @@ TEST_CASE("[LinearEnvelope] 2 events, close")
|
||||||
REQUIRE(output == expected);
|
REQUIRE(output == expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("[LinearEnvelope] 2 events, far")
|
TEST_CASE("[LinearEnvelope] 2 events, far")
|
||||||
{
|
{
|
||||||
sfz::EventVector events {
|
sfz::EventVector events {
|
||||||
|
|
|
||||||
|
|
@ -167,13 +167,20 @@ TEST_CASE("[Region] Crossfade in on CC")
|
||||||
region.parseOpcode({ "xfin_locc24", "20" });
|
region.parseOpcode({ "xfin_locc24", "20" });
|
||||||
region.parseOpcode({ "xfin_hicc24", "24" });
|
region.parseOpcode({ "xfin_hicc24", "24" });
|
||||||
region.parseOpcode({ "amp_veltrack", "0" });
|
region.parseOpcode({ "amp_veltrack", "0" });
|
||||||
midiState.ccEvent(0, 24, 19_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
midiState.ccEvent(0, 24, 19_norm);
|
||||||
midiState.ccEvent(0, 24, 20_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
midiState.ccEvent(0, 24, 21_norm); REQUIRE( region.getCrossfadeGain() == 0.5_a );
|
midiState.ccEvent(0, 24, 20_norm);
|
||||||
midiState.ccEvent(0, 24, 22_norm); REQUIRE( region.getCrossfadeGain() == 0.70711_a );
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
midiState.ccEvent(0, 24, 23_norm); REQUIRE( region.getCrossfadeGain() == 0.86603_a );
|
midiState.ccEvent(0, 24, 21_norm);
|
||||||
midiState.ccEvent(0, 24, 24_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
REQUIRE(region.getCrossfadeGain() == 0.5_a);
|
||||||
midiState.ccEvent(0, 24, 25_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
midiState.ccEvent(0, 24, 22_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.70711_a);
|
||||||
|
midiState.ccEvent(0, 24, 23_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.86603_a);
|
||||||
|
midiState.ccEvent(0, 24, 24_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
|
midiState.ccEvent(0, 24, 25_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("[Region] Crossfade in on CC - gain")
|
TEST_CASE("[Region] Crossfade in on CC - gain")
|
||||||
|
|
@ -185,13 +192,20 @@ TEST_CASE("[Region] Crossfade in on CC - gain")
|
||||||
region.parseOpcode({ "xfin_hicc24", "24" });
|
region.parseOpcode({ "xfin_hicc24", "24" });
|
||||||
region.parseOpcode({ "amp_veltrack", "0" });
|
region.parseOpcode({ "amp_veltrack", "0" });
|
||||||
region.parseOpcode({ "xf_cccurve", "gain" });
|
region.parseOpcode({ "xf_cccurve", "gain" });
|
||||||
midiState.ccEvent(0, 24, 19_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
midiState.ccEvent(0, 24, 19_norm);
|
||||||
midiState.ccEvent(0, 24, 20_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
midiState.ccEvent(0, 24, 21_norm); REQUIRE( region.getCrossfadeGain() == 0.25_a );
|
midiState.ccEvent(0, 24, 20_norm);
|
||||||
midiState.ccEvent(0, 24, 22_norm); REQUIRE( region.getCrossfadeGain() == 0.5_a );
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
midiState.ccEvent(0, 24, 23_norm); REQUIRE( region.getCrossfadeGain() == 0.75_a );
|
midiState.ccEvent(0, 24, 21_norm);
|
||||||
midiState.ccEvent(0, 24, 24_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
REQUIRE(region.getCrossfadeGain() == 0.25_a);
|
||||||
midiState.ccEvent(0, 24, 25_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
midiState.ccEvent(0, 24, 22_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.5_a);
|
||||||
|
midiState.ccEvent(0, 24, 23_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.75_a);
|
||||||
|
midiState.ccEvent(0, 24, 24_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
|
midiState.ccEvent(0, 24, 25_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
}
|
}
|
||||||
TEST_CASE("[Region] Crossfade out on CC")
|
TEST_CASE("[Region] Crossfade out on CC")
|
||||||
{
|
{
|
||||||
|
|
@ -201,13 +215,20 @@ TEST_CASE("[Region] Crossfade out on CC")
|
||||||
region.parseOpcode({ "xfout_locc24", "20" });
|
region.parseOpcode({ "xfout_locc24", "20" });
|
||||||
region.parseOpcode({ "xfout_hicc24", "24" });
|
region.parseOpcode({ "xfout_hicc24", "24" });
|
||||||
region.parseOpcode({ "amp_veltrack", "0" });
|
region.parseOpcode({ "amp_veltrack", "0" });
|
||||||
midiState.ccEvent(0, 24, 19_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
midiState.ccEvent(0, 24, 19_norm);
|
||||||
midiState.ccEvent(0, 24, 20_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
midiState.ccEvent(0, 24, 21_norm); REQUIRE( region.getCrossfadeGain() == 0.86603_a );
|
midiState.ccEvent(0, 24, 20_norm);
|
||||||
midiState.ccEvent(0, 24, 22_norm); REQUIRE( region.getCrossfadeGain() == 0.70711_a );
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
midiState.ccEvent(0, 24, 23_norm); REQUIRE( region.getCrossfadeGain() == 0.5_a );
|
midiState.ccEvent(0, 24, 21_norm);
|
||||||
midiState.ccEvent(0, 24, 24_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
REQUIRE(region.getCrossfadeGain() == 0.86603_a);
|
||||||
midiState.ccEvent(0, 24, 25_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
midiState.ccEvent(0, 24, 22_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.70711_a);
|
||||||
|
midiState.ccEvent(0, 24, 23_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.5_a);
|
||||||
|
midiState.ccEvent(0, 24, 24_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
|
midiState.ccEvent(0, 24, 25_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("[Region] Crossfade out on CC - gain")
|
TEST_CASE("[Region] Crossfade out on CC - gain")
|
||||||
|
|
@ -219,13 +240,20 @@ TEST_CASE("[Region] Crossfade out on CC - gain")
|
||||||
region.parseOpcode({ "xfout_hicc24", "24" });
|
region.parseOpcode({ "xfout_hicc24", "24" });
|
||||||
region.parseOpcode({ "amp_veltrack", "0" });
|
region.parseOpcode({ "amp_veltrack", "0" });
|
||||||
region.parseOpcode({ "xf_cccurve", "gain" });
|
region.parseOpcode({ "xf_cccurve", "gain" });
|
||||||
midiState.ccEvent(0, 24, 19_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
midiState.ccEvent(0, 24, 19_norm);
|
||||||
midiState.ccEvent(0, 24, 20_norm); REQUIRE( region.getCrossfadeGain() == 1.0_a );
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
midiState.ccEvent(0, 24, 21_norm); REQUIRE( region.getCrossfadeGain() == 0.75_a );
|
midiState.ccEvent(0, 24, 20_norm);
|
||||||
midiState.ccEvent(0, 24, 22_norm); REQUIRE( region.getCrossfadeGain() == 0.5_a );
|
REQUIRE(region.getCrossfadeGain() == 1.0_a);
|
||||||
midiState.ccEvent(0, 24, 23_norm); REQUIRE( region.getCrossfadeGain() == 0.25_a );
|
midiState.ccEvent(0, 24, 21_norm);
|
||||||
midiState.ccEvent(0, 24, 24_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
REQUIRE(region.getCrossfadeGain() == 0.75_a);
|
||||||
midiState.ccEvent(0, 24, 25_norm); REQUIRE( region.getCrossfadeGain() == 0.0_a );
|
midiState.ccEvent(0, 24, 22_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.5_a);
|
||||||
|
midiState.ccEvent(0, 24, 23_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.25_a);
|
||||||
|
midiState.ccEvent(0, 24, 24_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
|
midiState.ccEvent(0, 24, 25_norm);
|
||||||
|
REQUIRE(region.getCrossfadeGain() == 0.0_a);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("[Region] Velocity bug for extreme values - veltrack at 0")
|
TEST_CASE("[Region] Velocity bug for extreme values - veltrack at 0")
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue