summaryrefslogtreecommitdiff
path: root/src/inputprocessor.cc
diff options
context:
space:
mode:
authorVolker Fischer <corrados@users.noreply.github.com>2023-09-25 19:25:09 +0200
committerVolker Fischer <corrados@users.noreply.github.com>2023-09-25 19:25:09 +0200
commit60fc225f5b5129f6c4530acaf5858a9ecf2f7e56 (patch)
treecae9b79c10faf5bfac2cb9ff286f306b0bcade27 /src/inputprocessor.cc
parentd08840a61f405bc89e730c0cef51537e89e6dbb5 (diff)
added new drumkit XML parameter islogpower and support logarithmic powers for the dynamic expander
Diffstat (limited to 'src/inputprocessor.cc')
-rw-r--r--src/inputprocessor.cc46
1 files changed, 36 insertions, 10 deletions
diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc
index f0b2935..7d58b52 100644
--- a/src/inputprocessor.cc
+++ b/src/inputprocessor.cc
@@ -210,6 +210,19 @@ bool InputProcessor::processOnset(event_t& event, std::size_t pos,
return false;
}
+
+// TEST dynamic expander
+if(settings.drumkit_is_log_power)
+{
+ static auto a = 0.981;
+ static auto factor = 126.0f / (pow(a, 126.0f) - 1.0f);
+ event.velocity = (factor * (pow(a, event.velocity * 127.0f - 1.0f) - 1.0f) + 1.0f) / 127.0f;
+}
+
+// TODO velocity 1 does not select thehighest amplitude samples... -> maybe bug in sample selection
+//event.velocity=1.0;
+
+
std::size_t instrument_id = event.instrument;
Instrument* instr = nullptr;
@@ -294,16 +307,29 @@ bool InputProcessor::processOnset(event_t& event, std::size_t pos,
// TEST dynamic expander
//printf("event_sample.scale: %f, event.velocity: %f, sample->getPower(): %f, instr->getMinPower(): %f, instr->getMaxPower(): %f\n", event_sample.scale, event.velocity, sample->getPower(), instr->getMinPower(), instr->getMaxPower());
-auto target_max_power_db = 10 * log10(instr->getMaxPower());
-auto sel_power_db = 10 * log10(sample->getPower());
-auto target_dynamic_db = 40.0; // dB
-
-static auto a = 0.981;
-static auto factor = 126.0f / (pow(a, 126.0f) - 1.0f);
-auto y = (factor * (pow(a, event.velocity * 127.0f - 1.0f) - 1.0f) + 1.0f) / 127.0f;
-auto target_power_db = y * target_dynamic_db + target_max_power_db - target_dynamic_db;
-auto diff_power_db = target_power_db - sel_power_db;
-event_sample.scale = pow(10.0, diff_power_db / 20);
+if(settings.drumkit_is_log_power)
+{
+ // powers in instrument XML are in dB and curve is already applied to event.velocity:
+ auto target_max_power_db = instr->getMaxPower();
+ auto sel_power_db = sample->getPower();
+ auto target_dynamic_db = 50.0; // dB
+ auto target_power_db = event.velocity * target_dynamic_db + target_max_power_db - target_dynamic_db;
+ auto diff_power_db = target_power_db - sel_power_db;
+ event_sample.scale = pow(10.0, diff_power_db / 20);
+}
+else
+{
+ auto target_max_power_db = 10 * log10(instr->getMaxPower());
+ auto sel_power_db = 10 * log10(sample->getPower());
+ auto target_dynamic_db = 40.0; // dB
+
+ static auto a = 0.981;
+ static auto factor = 126.0f / (pow(a, 126.0f) - 1.0f);
+ auto y = (factor * (pow(a, event.velocity * 127.0f - 1.0f) - 1.0f) + 1.0f) / 127.0f;
+ auto target_power_db = y * target_dynamic_db + target_max_power_db - target_dynamic_db;
+ auto diff_power_db = target_power_db - sel_power_db;
+ event_sample.scale = pow(10.0, diff_power_db / 20);
+}
//printf("event_sample.scale: %f, diff_power_db: %f, target_power_db: %f, sel_power_db: %f\n", event_sample.scale, diff_power_db, target_power_db, sel_power_db);