2020-01-25 10:04:31 +01:00
|
|
|
// SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
|
2020-01-25 13:13:07 +01:00
|
|
|
// This code is part of the sfizz library and is licensed under a BSD 2-clause
|
|
|
|
|
// license. You should have receive a LICENSE.md file along with the code.
|
|
|
|
|
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
2019-12-28 23:01:45 +01:00
|
|
|
|
|
|
|
|
|
2020-01-18 17:35:27 +01:00
|
|
|
#include "sfizz/EGDescription.h"
|
2020-03-26 00:25:26 +01:00
|
|
|
#include "sfizz/SfzHelpers.h"
|
2019-12-28 23:01:45 +01:00
|
|
|
#include "catch2/catch.hpp"
|
|
|
|
|
using namespace Catch::literals;
|
2020-03-26 00:25:26 +01:00
|
|
|
using namespace sfz::literals;
|
2019-12-28 23:01:45 +01:00
|
|
|
|
|
|
|
|
TEST_CASE("[EGDescription] Attack range")
|
|
|
|
|
{
|
|
|
|
|
sfz::EGDescription eg;
|
2020-03-17 00:17:18 +01:00
|
|
|
sfz::MidiState state;
|
2019-12-28 23:01:45 +01:00
|
|
|
eg.attack = 1;
|
2020-01-05 00:19:08 +01:00
|
|
|
eg.vel2attack = -1.27f;
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccAttack[63] = 1.27f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getAttack(state, 0_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getAttack(state, 127_norm) == 0.0f);
|
2020-03-26 00:37:25 +01:00
|
|
|
state.ccEvent(0, 63, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getAttack(state, 127_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getAttack(state, 0_norm) == 2.27f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccAttack[63] = 127.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getAttack(state, 0_norm) == 100.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccAttack[63] = 1.27f;
|
|
|
|
|
eg.ccAttack[65] = 1.0f;
|
|
|
|
|
REQUIRE(eg.getAttack(state, 0_norm) == 2.27f);
|
|
|
|
|
REQUIRE(eg.getAttack(state, 127_norm) == 1.0f);
|
|
|
|
|
state.ccEvent(0, 65, 127_norm);
|
|
|
|
|
REQUIRE(eg.getAttack(state, 0_norm) == 3.27f);
|
|
|
|
|
REQUIRE(eg.getAttack(state, 127_norm) == 2.0f);
|
2019-12-28 23:01:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("[EGDescription] Delay range")
|
|
|
|
|
{
|
|
|
|
|
sfz::EGDescription eg;
|
2020-03-17 00:17:18 +01:00
|
|
|
sfz::MidiState state;
|
2019-12-28 23:01:45 +01:00
|
|
|
eg.delay = 1;
|
2020-01-05 00:19:08 +01:00
|
|
|
eg.vel2delay = -1.27f;
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccDelay[63] = 1.27f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getDelay(state, 0_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getDelay(state, 127_norm) == 0.0f);
|
2020-03-26 00:37:25 +01:00
|
|
|
state.ccEvent(0, 63, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getDelay(state, 127_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getDelay(state, 0_norm) == 2.27f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccDelay[63] = 127.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getDelay(state, 0_norm) == 100.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccDelay[63] = 1.27f;
|
|
|
|
|
eg.ccDelay[65] = 1.0f;
|
|
|
|
|
REQUIRE(eg.getDelay(state, 0_norm) == 2.27f);
|
|
|
|
|
REQUIRE(eg.getDelay(state, 127_norm) == 1.0f);
|
|
|
|
|
state.ccEvent(0, 65, 127_norm);
|
|
|
|
|
REQUIRE(eg.getDelay(state, 0_norm) == 3.27f);
|
|
|
|
|
REQUIRE(eg.getDelay(state, 127_norm) == 2.0f);
|
2019-12-28 23:01:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("[EGDescription] Decay range")
|
|
|
|
|
{
|
|
|
|
|
sfz::EGDescription eg;
|
2020-03-17 00:17:18 +01:00
|
|
|
sfz::MidiState state;
|
2020-01-03 13:45:25 +01:00
|
|
|
eg.decay = 1.0f;
|
|
|
|
|
eg.vel2decay = -1.27f;
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccDecay[63] = 1.27f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getDecay(state, 0_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getDecay(state, 127_norm) == 0.0f);
|
2020-03-26 00:37:25 +01:00
|
|
|
state.ccEvent(0, 63, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getDecay(state, 127_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getDecay(state, 0_norm) == 2.27f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccDecay[63] = 127.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getDecay(state, 0_norm) == 100.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccDecay[63] = 1.27f;
|
|
|
|
|
eg.ccDecay[65] = 1.0f;
|
|
|
|
|
REQUIRE(eg.getDecay(state, 0_norm) == 2.27f);
|
|
|
|
|
REQUIRE(eg.getDecay(state, 127_norm) == 1.0f);
|
|
|
|
|
state.ccEvent(0, 65, 127_norm);
|
|
|
|
|
REQUIRE(eg.getDecay(state, 0_norm) == 3.27f);
|
|
|
|
|
REQUIRE(eg.getDecay(state, 127_norm) == 2.0f);
|
2019-12-28 23:01:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("[EGDescription] Release range")
|
|
|
|
|
{
|
|
|
|
|
sfz::EGDescription eg;
|
2020-03-17 00:17:18 +01:00
|
|
|
sfz::MidiState state;
|
2019-12-28 23:01:45 +01:00
|
|
|
eg.release = 1;
|
2020-01-05 00:19:08 +01:00
|
|
|
eg.vel2release = -1.27f;
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccRelease[63] = 1.27f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getRelease(state, 0_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getRelease(state, 127_norm) == 0.0f);
|
2020-03-26 00:37:25 +01:00
|
|
|
state.ccEvent(0, 63, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getRelease(state, 127_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getRelease(state, 0_norm) == 2.27f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccRelease[63] = 127.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getRelease(state, 0_norm) == 100.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccRelease[63] = 1.27f;
|
|
|
|
|
eg.ccRelease[65] = 1.0f;
|
|
|
|
|
REQUIRE(eg.getRelease(state, 0_norm) == 2.27f);
|
|
|
|
|
REQUIRE(eg.getRelease(state, 127_norm) == 1.0f);
|
|
|
|
|
state.ccEvent(0, 65, 127_norm);
|
|
|
|
|
REQUIRE(eg.getRelease(state, 0_norm) == 3.27f);
|
|
|
|
|
REQUIRE(eg.getRelease(state, 127_norm) == 2.0f);
|
2019-12-28 23:01:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("[EGDescription] Hold range")
|
|
|
|
|
{
|
|
|
|
|
sfz::EGDescription eg;
|
2020-03-17 00:17:18 +01:00
|
|
|
sfz::MidiState state;
|
2019-12-28 23:01:45 +01:00
|
|
|
eg.hold = 1;
|
2020-01-05 00:19:08 +01:00
|
|
|
eg.vel2hold = -1.27f;
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccHold[63] = 1.27f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getHold(state, 0_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getHold(state, 127_norm) == 0.0f);
|
2020-03-26 00:37:25 +01:00
|
|
|
state.ccEvent(0, 63, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getHold(state, 127_norm) == 1.0f);
|
|
|
|
|
REQUIRE(eg.getHold(state, 0_norm) == 2.27f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccHold[63] = 127.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getHold(state, 0_norm) == 100.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccHold[63] = 1.27f;
|
|
|
|
|
eg.ccHold[65] = 1.0f;
|
|
|
|
|
REQUIRE(eg.getHold(state, 0_norm) == 2.27f);
|
|
|
|
|
REQUIRE(eg.getHold(state, 127_norm) == 1.0f);
|
|
|
|
|
state.ccEvent(0, 65, 127_norm);
|
|
|
|
|
REQUIRE(eg.getHold(state, 0_norm) == 3.27f);
|
|
|
|
|
REQUIRE(eg.getHold(state, 127_norm) == 2.0f);
|
2019-12-28 23:01:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("[EGDescription] Sustain level")
|
|
|
|
|
{
|
|
|
|
|
sfz::EGDescription eg;
|
2020-03-17 00:17:18 +01:00
|
|
|
sfz::MidiState state;
|
2019-12-28 23:01:45 +01:00
|
|
|
eg.sustain = 50;
|
|
|
|
|
eg.vel2sustain = -100;
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccSustain[63] = 100.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getSustain(state, 0_norm) == 50.0f);
|
|
|
|
|
REQUIRE(eg.getSustain(state, 127_norm) == 0.0f);
|
2020-03-26 00:37:25 +01:00
|
|
|
state.ccEvent(0, 63, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getSustain(state, 127_norm) == 50.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccSustain[63] = 200.0f;
|
|
|
|
|
REQUIRE(eg.getSustain(state, 0_norm) == 100.0f);
|
|
|
|
|
eg.sustain = 0;
|
|
|
|
|
eg.ccSustain[63] = 50.0f;
|
|
|
|
|
eg.ccSustain[65] = 50.0f;
|
|
|
|
|
REQUIRE(eg.getSustain(state, 0_norm) == 50.0f);
|
|
|
|
|
REQUIRE(eg.getSustain(state, 127_norm) == 0.0f);
|
|
|
|
|
state.ccEvent(0, 65, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getSustain(state, 0_norm) == 100.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
REQUIRE(eg.getSustain(state, 127_norm) == 0.0f);
|
2019-12-28 23:01:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("[EGDescription] Start level")
|
|
|
|
|
{
|
|
|
|
|
sfz::EGDescription eg;
|
2020-03-17 00:17:18 +01:00
|
|
|
sfz::MidiState state;
|
2019-12-28 23:01:45 +01:00
|
|
|
eg.start = 0;
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccStart[63] = 127.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getStart(state, 0_norm) == 0.0f);
|
|
|
|
|
REQUIRE(eg.getStart(state, 127_norm) == 0.0f);
|
2020-03-26 00:37:25 +01:00
|
|
|
state.ccEvent(0, 63, 127_norm);
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getStart(state, 0_norm) == 100.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.ccStart[63] = -127.0f;
|
2020-03-31 10:46:12 +02:00
|
|
|
REQUIRE(eg.getStart(state, 0_norm) == 0.0f);
|
2020-07-01 17:37:44 +02:00
|
|
|
eg.start = 0;
|
|
|
|
|
eg.ccStart[63] = 50.0f;
|
|
|
|
|
eg.ccStart[65] = 50.0f;
|
|
|
|
|
REQUIRE(eg.getStart(state, 0_norm) == 50.0f);
|
|
|
|
|
REQUIRE(eg.getStart(state, 127_norm) == 50.0f);
|
|
|
|
|
state.ccEvent(0, 65, 127_norm);
|
|
|
|
|
REQUIRE(eg.getStart(state, 0_norm) == 100.0f);
|
|
|
|
|
REQUIRE(eg.getStart(state, 127_norm) == 100.0f);
|
2020-01-03 13:45:25 +01:00
|
|
|
}
|