diff options
author | JP Cimalando <jpcima@users.noreply.github.com> | 2018-07-24 04:55:55 +0200 |
---|---|---|
committer | JP Cimalando <jpcima@users.noreply.github.com> | 2018-07-24 04:55:55 +0200 |
commit | 86b97d103fdeab8d285189d96ec6b316ec8c3530 (patch) | |
tree | bf14b0d9d4c7cbf9483443516d1cbf193916d8cf /test | |
parent | 9544965f28ce42b69f97e6aaeb881c9a20bfbad4 (diff) | |
download | libADLMIDI-86b97d103fdeab8d285189d96ec6b316ec8c3530.tar.gz libADLMIDI-86b97d103fdeab8d285189d96ec6b316ec8c3530.tar.bz2 libADLMIDI-86b97d103fdeab8d285189d96ec6b316ec8c3530.zip |
add unit test to check internal instrument conversions
Diffstat (limited to 'test')
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/conversion/CMakeLists.txt | 12 | ||||
-rw-r--r-- | test/conversion/conversion.cpp | 82 |
3 files changed, 95 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bb5615e..ee02087 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,6 +2,7 @@ set(CMAKE_CXX_STANDARD 11) add_subdirectory(bankmap) +add_subdirectory(conversion) add_library(Catch-objects OBJECT "common/catch_main.cpp") target_include_directories(Catch-objects PRIVATE "common") diff --git a/test/conversion/CMakeLists.txt b/test/conversion/CMakeLists.txt new file mode 100644 index 0000000..361c7e8 --- /dev/null +++ b/test/conversion/CMakeLists.txt @@ -0,0 +1,12 @@ + +set(CMAKE_CXX_STANDARD 11) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/../common + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/src) + +add_executable(ConversionTest conversion.cpp $<TARGET_OBJECTS:Catch-objects>) + +set_target_properties(ConversionTest PROPERTIES COMPILE_DEFINITIONS "GSL_THROW_ON_CONTRACT_VIOLATION") +add_test(NAME ConversionTest COMMAND ConversionTest) diff --git a/test/conversion/conversion.cpp b/test/conversion/conversion.cpp new file mode 100644 index 0000000..f78c363 --- /dev/null +++ b/test/conversion/conversion.cpp @@ -0,0 +1,82 @@ +#include <catch.hpp> +#include <random> +#include "adlmidi.h" +#include "adlmidi_cvt.hpp" + +static std::mt19937 rng; + +static ADL_Instrument random_instrument() +{ + ADL_Instrument ins; + ins.version = ADLMIDI_InstrumentVersion; + ins.note_offset1 = std::uniform_int_distribution<int>(-128, 127)(rng); + ins.note_offset2 = std::uniform_int_distribution<int>(-128, 127)(rng); + ins.midi_velocity_offset = std::uniform_int_distribution<int>(-128, 127)(rng); + ins.second_voice_detune = std::uniform_int_distribution<int>(-128, 127)(rng); + ins.percussion_key_number = std::uniform_int_distribution<unsigned>(0, 127)(rng); + ins.inst_flags = + std::uniform_int_distribution<unsigned>(0, 255)(rng) & + (ADLMIDI_Ins_IsBlank|ADLMIDI_Ins_RhythmModeMask); + switch (std::uniform_int_distribution<unsigned>(0, 3)(rng)) { + case 0: // 2op + ins.inst_flags |= ADLMIDI_Ins_2op; + break; + case 1: // pseudo 4op + ins.inst_flags |= ADLMIDI_Ins_Pseudo4op; + // fall through + case 2: // real 4op + ins.inst_flags |= ADLMIDI_Ins_4op; + break; + } + ins.fb_conn1_C0 = std::uniform_int_distribution<unsigned>(0, 255)(rng); + ins.fb_conn2_C0 = std::uniform_int_distribution<unsigned>(0, 255)(rng); + ins.delay_on_ms = std::uniform_int_distribution<unsigned>(0, 40000)(rng); + ins.delay_off_ms = std::uniform_int_distribution<unsigned>(0, 40000)(rng); + for (unsigned op = 0; op < 4; ++op) { + ins.operators[op].avekf_20 = std::uniform_int_distribution<unsigned>(0, 255)(rng); + ins.operators[op].ksl_l_40 = std::uniform_int_distribution<unsigned>(0, 255)(rng); + ins.operators[op].atdec_60 = std::uniform_int_distribution<unsigned>(0, 255)(rng); + ins.operators[op].susrel_80 = std::uniform_int_distribution<unsigned>(0, 255)(rng); + ins.operators[op].waveform_E0 = std::uniform_int_distribution<unsigned>(0, 255)(rng); + } + return ins; +} + +static void check_instrument_equality(const ADL_Instrument &a, const ADL_Instrument &b) +{ + REQUIRE((int)a.note_offset1 == (int)b.note_offset1); + REQUIRE((int)a.note_offset2 == (int)b.note_offset2); + #pragma message("velocity offset: uncomment this test when it's implemented") + // REQUIRE((int)a.midi_velocity_offset == (int)b.midi_velocity_offset); + REQUIRE((int)a.second_voice_detune == (int)b.second_voice_detune); + REQUIRE((int)a.percussion_key_number == (int)b.percussion_key_number); + REQUIRE((int)a.inst_flags == (int)b.inst_flags); + REQUIRE((int)a.fb_conn1_C0 == (int)b.fb_conn1_C0); + REQUIRE((int)a.fb_conn2_C0 == (int)b.fb_conn2_C0); + REQUIRE((int)a.delay_on_ms == (int)b.delay_on_ms); + REQUIRE((int)a.delay_off_ms == (int)b.delay_off_ms); + for (unsigned op = 0; op < 4; ++op) { + REQUIRE((int)a.operators[op].avekf_20 == (int)b.operators[op].avekf_20); + REQUIRE((int)a.operators[op].ksl_l_40 == (int)b.operators[op].ksl_l_40); + REQUIRE((int)a.operators[op].atdec_60 == (int)b.operators[op].atdec_60); + REQUIRE((int)a.operators[op].susrel_80 == (int)b.operators[op].susrel_80); + REQUIRE((int)a.operators[op].waveform_E0 == (int)b.operators[op].waveform_E0); + } +} + +TEST_CASE("[Conversion] Main") +{ + rng.seed(777); + + for (unsigned i = 0; i < 1000000; ++i) { + ADL_Instrument adl_ins = random_instrument(); + + adlinsdata2 internal_ins; + cvt_generic_to_FMIns(internal_ins, adl_ins); + + ADL_Instrument adl_ins2; + cvt_FMIns_to_generic(adl_ins2, internal_ins); + + check_instrument_equality(adl_ins, adl_ins2); + } +} |