diff --git a/src/sfizz/Defaults.h b/src/sfizz/Defaults.h index bbc0400a..3d85871a 100644 --- a/src/sfizz/Defaults.h +++ b/src/sfizz/Defaults.h @@ -128,6 +128,11 @@ namespace Default constexpr Range transposeRange { -127, 127 }; constexpr int tune { 0 }; constexpr Range tuneRange { -100, 100 }; + constexpr Range bendBoundRange { -9600, 9600 }; + constexpr Range bendStepRange { 1, 1200 }; + constexpr int bendUp { 200 }; // No range here because the bounds can be inverted + constexpr int bendDown { -200 }; + constexpr int bendStep { 1 }; // Envelope generators constexpr float attack { 0 }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 2531ba81..e7f9f273 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -407,6 +407,15 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) case hash("tune"): setValueFromOpcode(opcode, tune, Default::tuneRange); break; + case hash("bend_up"): + setValueFromOpcode(opcode, bendUp, Default::bendBoundRange); + break; + case hash("bend_down"): + setValueFromOpcode(opcode, bendDown, Default::bendBoundRange); + break; + case hash("bend_step"): + setValueFromOpcode(opcode, bendStep, Default::bendStepRange); + break; // Amplitude Envelope case hash("ampeg_attack"): diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index b36d42ff..4c1fbad1 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -300,6 +300,9 @@ struct Region { int pitchVeltrack { Default::pitchVeltrack }; // pitch_veltrack int transpose { Default::transpose }; // transpose int tune { Default::tune }; // tune + int bendUp { Default::bendUp }; + int bendDown { Default::bendDown }; + int bendStep { Default::bendStep }; // Envelopes EGDescription amplitudeEG; diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 9beec093..62581863 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -30,7 +30,7 @@ TEST_CASE("[Region] Parsing opcodes") { sfz::MidiState midiState; sfz::Region region { midiState }; - + SECTION("sample") { REQUIRE(region.sample == ""); @@ -832,6 +832,35 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.tune == -100); } + SECTION("bend_up, bend_down, bend_step") + { + REQUIRE(region.bendUp == 200); + REQUIRE(region.bendDown == -200); + REQUIRE(region.bendStep == 1); + region.parseOpcode({ "bend_up", "400" }); + REQUIRE(region.bendUp == 400); + region.parseOpcode({ "bend_up", "-200" }); + REQUIRE(region.bendUp == -200); + region.parseOpcode({ "bend_up", "9700" }); + REQUIRE(region.bendUp == 9600); + region.parseOpcode({ "bend_up", "-9700" }); + REQUIRE(region.bendUp == -9600); + region.parseOpcode({ "bend_down", "400" }); + REQUIRE(region.bendDown == 400); + region.parseOpcode({ "bend_down", "-200" }); + REQUIRE(region.bendDown == -200); + region.parseOpcode({ "bend_down", "9700" }); + REQUIRE(region.bendDown == 9600); + region.parseOpcode({ "bend_down", "-9700" }); + REQUIRE(region.bendDown == -9600); + region.parseOpcode({ "bend_step", "400" }); + REQUIRE(region.bendStep == 400); + region.parseOpcode({ "bend_step", "-200" }); + REQUIRE(region.bendStep == 1); + region.parseOpcode({ "bend_step", "9700" }); + REQUIRE(region.bendStep == 1200); + } + SECTION("ampeg") { // Defaults @@ -1045,4 +1074,4 @@ TEST_CASE("[Region] Non-conforming floating point values in integer opcodes") REQUIRE(region.offset == 2014); region.parseOpcode({ "pitch_keytrack", "-2.1" }); REQUIRE(region.pitchKeytrack == -2); -} \ No newline at end of file +}