diff options
Diffstat (limited to 'src/inputprocessor.cc')
-rw-r--r-- | src/inputprocessor.cc | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc index a16115c..6d50c68 100644 --- a/src/inputprocessor.cc +++ b/src/inputprocessor.cc @@ -3,7 +3,7 @@ * inputprocessor.cc * * Sat Apr 23 20:39:30 CEST 2016 - * Copyright 2016 André Nusser + * Copyright 2016 André Nusser * andre.nusser@googlemail.com ****************************************************************************/ @@ -210,6 +210,16 @@ bool InputProcessor::processOnset(event_t& event, std::size_t pos, return false; } + // In case log-power and dynamic expander is used, apply a special velocity curve + if(settings.drumkit_is_log_power) + { + auto a = 0.981; // compatible to Roland sound modules + event.velocity = (126.0f / (pow(a, 126.0f) - 1.0f) * (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; @@ -291,20 +301,12 @@ bool InputProcessor::processOnset(event_t& event, std::size_t pos, event_sample.scale *= event.velocity; } -// 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 target_min_power_db = 10 * log10(instr->getMinPower()); -auto sel_power_db = 10 * log10(sample->getPower()); -auto target_dynamic_db = 35.0; // dB - -auto target_power_db = sqrt(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); - -//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); - + // Dynamic expander (only enabled if log-power is configured) + if(settings.drumkit_is_log_power) + { + auto target_dynamic_db = 50.0; // dB, defined maximum dynamic after expander + event_sample.scale = pow(10.0, (event.velocity * target_dynamic_db + instr->getMaxPower() - target_dynamic_db - sample->getPower()) / 20); + } } } @@ -359,7 +361,7 @@ bool InputProcessor::processChoke(event_t& event, if(event.offset >= 1000000) // quick hack: added 1000000 to offset to transport hi-hat controller value { int hihat_controller = event.offset - 1000000; - int rampdown_time = static_cast<int>(std::max(100.0, pow(10.0, (127.0 - hihat_controller) / 38.0))); // TODO optimize + int rampdown_time = static_cast<int>(std::max(180.0, pow(10.0, (127.0 - hihat_controller) / 38.0))); // TODO optimize applyChoke(settings, event_sample, rampdown_time, 0); } else |