From 30234fa8cf0576012f87f2284baa2b0c22851101 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Tue, 6 Apr 2021 13:12:19 +0200 Subject: [PATCH] lv2: Add option to enable plugin-side CC automation --- cmake/LV2Config.cmake | 5 ++++- plugins/lv2/CMakeLists.txt | 5 +++++ plugins/lv2/sfizz.cpp | 22 ++++++++++++++++------ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/cmake/LV2Config.cmake b/cmake/LV2Config.cmake index 11330812..735552cf 100644 --- a/cmake/LV2Config.cmake +++ b/cmake/LV2Config.cmake @@ -1,3 +1,6 @@ +# This option is for MIDI CC support in absence of host midi:binding support +option(SFIZZ_LV2_PSA "Enable plugin-side MIDI automations" OFF) + # Configuration for this plugin # TODO: generate version from git set(LV2PLUGIN_VERSION_MINOR 6) @@ -61,7 +64,7 @@ sfizz:cc${_i} rdfs:label \"Controller ${_i}\" ; rdfs:range atom:Float") - if(_i LESS 128) + if(_i LESS 128 AND NOT SFIZZ_LV2_PSA) math(EXPR _digit1 "${_i}>>4") math(EXPR _digit2 "${_i}&15") string(SUBSTRING "0123456789ABCDEF" "${_digit1}" 1 _digit1) diff --git a/plugins/lv2/CMakeLists.txt b/plugins/lv2/CMakeLists.txt index 2417e263..d18caf84 100644 --- a/plugins/lv2/CMakeLists.txt +++ b/plugins/lv2/CMakeLists.txt @@ -33,6 +33,11 @@ if(SFIZZ_LV2_UI) target_link_libraries(${LV2PLUGIN_PRJ_NAME}_ui PRIVATE sfizz::editor sfizz::vstgui sfizz::plugins-common) endif() +if(SFIZZ_LV2_PSA) + target_compile_definitions(${LV2PLUGIN_PRJ_NAME} PRIVATE "SFIZZ_LV2_PSA=1") + target_compile_definitions(${LV2PLUGIN_PRJ_NAME}_ui PRIVATE "SFIZZ_LV2_PSA=1") +endif() + # Explicitely strip all symbols on Linux but lv2_descriptor() # MacOS linker does not support this apparently https://bugs.webkit.org/show_bug.cgi?id=144555 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") diff --git a/plugins/lv2/sfizz.cpp b/plugins/lv2/sfizz.cpp index aaeab58a..059c2dd6 100644 --- a/plugins/lv2/sfizz.cpp +++ b/plugins/lv2/sfizz.cpp @@ -613,6 +613,7 @@ sfizz_lv2_handle_atom_object(sfizz_plugin_t *self, int delay, const LV2_Atom_Obj float value = *(const float *)LV2_ATOM_BODY_CONST(atom); sfizz_send_hdcc(self->synth, delay, cc, value); self->cc_current[cc] = value; + self->ccauto[cc] = absl::nullopt; } } else if (key == self->sfizz_sfz_file_uri) @@ -671,12 +672,21 @@ sfizz_lv2_process_midi_event(sfizz_plugin_t *self, const LV2_Atom_Event *ev) break; // Note(jpc) CC must be mapped by host, not handled here. // See LV2 midi:binding. - /*case LV2_MIDI_MSG_CONTROLLER: - sfizz_send_cc(self->synth, - (int)ev->time.frames, - (int)msg[1], - msg[2]); - break;*/ +#if defined(SFIZZ_LV2_PSA) + case LV2_MIDI_MSG_CONTROLLER: + { + unsigned cc = msg[1]; + float value = float(msg[2]) * (1.0f / 127.0f); + sfizz_send_hdcc(self->synth, + (int)ev->time.frames, + (int)cc, + value); + self->cc_current[cc] = value; + self->ccauto[cc] = value; + self->have_ccauto = true; + } + break; +#endif case LV2_MIDI_MSG_CHANNEL_PRESSURE: sfizz_send_aftertouch(self->synth, (int)ev->time.frames,