#include "catch2/catch.hpp" #include "../sources/Region.h" using namespace Catch::literals; TEST_CASE("Basic triggers", "Region triggers") { sfz::Region region; region.parseOpcode({ "sample", "*sine" }); SECTION("key") { region.parseOpcode({ "key", "40" }); REQUIRE( region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( !region.registerNoteOff(1, 40, 64, 0.5f) ); REQUIRE( !region.registerNoteOn(1, 41, 64, 0.5f) ); REQUIRE( !region.registerCC(1, 63, 64) ); } SECTION("lokey and hikey") { region.parseOpcode({ "lokey", "40" }); region.parseOpcode({ "hikey", "42" }); REQUIRE( !region.registerNoteOn(1, 39, 64, 0.5f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( !region.registerNoteOff(1, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOn(1, 41, 64, 0.5f) ); REQUIRE( region.registerNoteOn(1, 42, 64, 0.5f) ); REQUIRE( !region.registerNoteOn(1, 43, 64, 0.5f) ); REQUIRE( !region.registerNoteOff(1, 42, 64, 0.5f) ); REQUIRE( !region.registerNoteOff(1, 42, 64, 0.5f) ); REQUIRE( !region.registerCC(1, 63, 64) ); } SECTION("key and release trigger") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "trigger", "release" }); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOff(1, 40, 64, 0.5f) ); REQUIRE( !region.registerNoteOn(1, 41, 64, 0.5f) ); REQUIRE( !region.registerNoteOff(1, 41, 64, 0.5f) ); REQUIRE( !region.registerCC(1, 63, 64) ); } SECTION("key and release_key trigger") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "trigger", "release_key" }); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOff(1, 40, 64, 0.5f) ); REQUIRE( !region.registerNoteOn(1, 41, 64, 0.5f) ); REQUIRE( !region.registerNoteOff(1, 41, 64, 0.5f) ); REQUIRE( !region.registerCC(1, 63, 64) ); } // TODO: first and legato triggers SECTION("lovel and hivel") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "lovel", "60" }); region.parseOpcode({ "hivel", "70" }); REQUIRE( region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOn(1, 40, 60, 0.5f) ); REQUIRE( region.registerNoteOn(1, 40, 70, 0.5f) ); REQUIRE( !region.registerNoteOn(1, 41, 71, 0.5f) ); REQUIRE( !region.registerNoteOn(1, 41, 59, 0.5f) ); } SECTION("lochan and hichan") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "lochan", "2" }); region.parseOpcode({ "hichan", "4" }); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOn(2, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOn(3, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOn(4, 40, 64, 0.5f) ); REQUIRE( !region.registerNoteOn(5, 40, 64, 0.5f) ); } SECTION("lorand and hirand") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "lorand", "0.35" }); region.parseOpcode({ "hirand", "0.40" }); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.34f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 0.35f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 0.36f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 0.37f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 0.38f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 0.39f) ); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.40f) ); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.41f) ); } SECTION("lorand and hirand on 1.0f") { region.parseOpcode({ "key", "40" }); region.parseOpcode({ "lorand", "0.35" }); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.34f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 0.35f) ); REQUIRE( region.registerNoteOn(1, 40, 64, 1.0f) ); } SECTION("on_loccN, on_hiccN") { region.parseOpcode({ "on_locc47", "64" }); region.parseOpcode({ "on_hicc47", "68" }); REQUIRE( !region.registerCC(1, 47, 63) ); REQUIRE( region.registerCC(1, 47, 64) ); REQUIRE( region.registerCC(1, 47, 65) ); REQUIRE( region.registerCC(1, 47, 66) ); REQUIRE( region.registerCC(1, 47, 67) ); REQUIRE( region.registerCC(1, 47, 68) ); REQUIRE( !region.registerCC(1, 47, 69) ); REQUIRE( !region.registerCC(1, 40, 64) ); } } TEST_CASE("Legato triggers", "Region triggers") { sfz::Region region; region.parseOpcode({ "sample", "*sine" }); SECTION("First note playing") { region.parseOpcode({ "lokey", "40" }); region.parseOpcode({ "hikey", "50" }); region.parseOpcode({ "trigger", "first" }); REQUIRE( region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( !region.registerNoteOn(1, 41, 64, 0.5f) ); region.registerNoteOff(1, 40, 0, 0.5f); region.registerNoteOff(1, 41, 0, 0.5f); REQUIRE( region.registerNoteOn(1, 42, 64, 0.5f) ); } SECTION("Second note playing") { region.parseOpcode({ "lokey", "40" }); region.parseOpcode({ "hikey", "50" }); region.parseOpcode({ "trigger", "legato" }); REQUIRE( !region.registerNoteOn(1, 40, 64, 0.5f) ); REQUIRE( region.registerNoteOn(1, 41, 64, 0.5f) ); region.registerNoteOff(1, 40, 0, 0.5f); region.registerNoteOff(1, 41, 0, 0.5f); REQUIRE( !region.registerNoteOn(1, 42, 64, 0.5f) ); } }