aboutsummaryrefslogtreecommitdiff
path: root/test/conversion/conversion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/conversion/conversion.cpp')
-rw-r--r--test/conversion/conversion.cpp82
1 files changed, 82 insertions, 0 deletions
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);
+ }
+}