From 852a18558966e949954ddc9da38428936e903944 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 30 Apr 2021 11:43:27 +0200 Subject: [PATCH 1/6] pd: default patch improvements --- plugins/puredata/example.sfz | 2 +- plugins/puredata/sfizz~-help.pd | 44 ++++++++++++++++----------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/plugins/puredata/example.sfz b/plugins/puredata/example.sfz index 1ab72699..6e64db97 100644 --- a/plugins/puredata/example.sfz +++ b/plugins/puredata/example.sfz @@ -5,7 +5,7 @@ ampeg_sustain=50 ampeg_release=2 fil_type=lpf_4p resonance=3 -cutoff=2000 +cutoff=3000 oscillator_phase=-1 cutoff_oncc300=3600 cutoff_curvecc300=1 diff --git a/plugins/puredata/sfizz~-help.pd b/plugins/puredata/sfizz~-help.pd index 96600cba..98d0e0f0 100644 --- a/plugins/puredata/sfizz~-help.pd +++ b/plugins/puredata/sfizz~-help.pd @@ -1,23 +1,16 @@ -#N canvas 932 395 659 405 12; +#N canvas 614 464 659 405 12; #X declare -lib sfizz; #X obj 4 3 cnv 15 650 80 empty empty sfizz 20 30 0 40 -261682 -66577 0; #X text 45 54 A synthesizer for instruments in SFZ format; -#X obj 241 165 r sfizz-ctl; #X text 33 167 create a SFZ instrument; #X obj 29 324 midiin; -#X obj 29 349 s sfizz-ctl; #X text 26 301 connect MIDI-in; #X obj 162 223 dac~; #X msg 180 346 voices \$1; -#X obj 180 371 s sfizz-ctl; #X text 178 302 modify the polyphony; -#X obj 183 326 hsl 128 15 1 256 0 1 empty empty empty -2 -8 0 10 -262144 --1 -1 3138 1; -#X floatatom 273 346 5 0 0 0 - - -; -#X obj 378 372 s sfizz-ctl; -#X obj 381 327 hsl 128 15 0 1 0 1 empty empty empty -2 -8 0 10 -262144 --1 -1 6350 1; +#X obj 381 327 hsl 127 15 0 1 0 1 empty empty empty -2 -8 0 10 -262144 +-1 -1 6300 1; #X floatatom 471 347 5 0 0 0 - - -; #X text 377 303 modulate a parameter; #X msg 378 347 hdcc 300 \$1; @@ -28,19 +21,24 @@ #X text 218 94 click to turn on DSP; #X text 153 247 output stereo audio; #X msg 366 223 reload; -#X obj 366 248 s sfizz-ctl; -#X obj 466 248 s sfizz-ctl; #X msg 466 223 load example.sfz; #X text 364 200 reload the instrument or load another; -#X connect 2 0 19 0; -#X connect 4 0 5 0; +#X obj 241 165 r \$0-input; +#X obj 29 349 s \$0-input; +#X obj 180 371 s \$0-input; +#X obj 378 372 s \$0-input; +#X obj 366 248 s \$0-input; +#X obj 466 248 s \$0-input; +#X obj 180 327 nbx 5 14 1 256 0 1 empty empty empty 0 -8 0 10 -262144 +-1 -1 64 256; +#X connect 3 0 22 0; +#X connect 6 0 23 0; +#X connect 8 0 11 0; #X connect 8 0 9 0; -#X connect 11 0 8 0; -#X connect 11 0 12 0; -#X connect 14 0 17 0; -#X connect 14 0 15 0; -#X connect 17 0 13 0; -#X connect 19 0 7 0; -#X connect 19 1 7 1; -#X connect 24 0 25 0; -#X connect 27 0 26 0; +#X connect 11 0 24 0; +#X connect 13 0 5 0; +#X connect 13 1 5 1; +#X connect 18 0 25 0; +#X connect 19 0 26 0; +#X connect 21 0 13 0; +#X connect 27 0 6 0; From a9f119d63b77a92986cd9336c52c04ce747826c9 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 30 Apr 2021 12:03:13 +0200 Subject: [PATCH 2/6] Update pd external and help with new features --- plugins/puredata/sfizz_puredata.c | 113 ++++++++++++++++++++++++++++-- plugins/puredata/sfizz~-help.pd | 54 +++++++++----- 2 files changed, 142 insertions(+), 25 deletions(-) diff --git a/plugins/puredata/sfizz_puredata.c b/plugins/puredata/sfizz_puredata.c index 89422f7a..16b97c6d 100644 --- a/plugins/puredata/sfizz_puredata.c +++ b/plugins/puredata/sfizz_puredata.c @@ -16,6 +16,10 @@ static t_class* cls_sfizz_tilde; typedef struct _sfizz_tilde { t_object obj; t_outlet* outputs[2]; + t_inlet* input_cc; + t_inlet* input_bend; + t_inlet* input_touch; + t_inlet* input_polytouch; sfizz_synth_t* synth; int midi[3]; int midinum; @@ -23,6 +27,20 @@ typedef struct _sfizz_tilde { char* filepath; } t_sfizz_tilde; +static t_float clamp01(t_float x) +{ + x = (x > 0) ? x : 0; + x = (x < 1) ? x : 1; + return x; +} + +static t_float clampB1(t_float x) +{ + x = (x > -1) ? x : -1; + x = (x < 1) ? x : 1; + return x; +} + static void sfizz_tilde_set_file(t_sfizz_tilde* self, const char* file) { const char* dir = self->dir->s_name; @@ -69,6 +87,11 @@ static void* sfizz_tilde_new(t_symbol* sym, int argc, t_atom argv[]) self->outputs[0] = outlet_new(&self->obj, &s_signal); self->outputs[1] = outlet_new(&self->obj, &s_signal); + self->input_cc = inlet_new(&self->obj, &self->obj.ob_pd, &s_float, gensym("cc")); + self->input_bend = inlet_new(&self->obj, &self->obj.ob_pd, &s_float, gensym("bend")); + self->input_touch = inlet_new(&self->obj, &self->obj.ob_pd, &s_float, gensym("touch")); + self->input_polytouch = inlet_new(&self->obj, &self->obj.ob_pd, &s_float, gensym("polytouch")); + sfizz_synth_t* synth = sfizz_create_synth(); self->synth = synth; @@ -94,6 +117,14 @@ static void sfizz_tilde_free(t_sfizz_tilde* self) outlet_free(self->outputs[0]); if (self->outputs[1]) outlet_free(self->outputs[1]); + if (self->input_cc) + inlet_free(self->input_cc); + if (self->input_bend) + inlet_free(self->input_bend); + if (self->input_touch) + inlet_free(self->input_touch); + if (self->input_polytouch) + inlet_free(self->input_polytouch); } static t_int* sfizz_tilde_perform(t_int* w) @@ -120,6 +151,22 @@ static void sfizz_tilde_dsp(t_sfizz_tilde* self, t_signal** sp) (t_int)sp[0]->s_vec, (t_int)sp[1]->s_vec, (t_int)sp[0]->s_n); } +static void sfizz_tilde_list(t_sfizz_tilde* self, t_symbol* sym, int argc, t_atom* argv) +{ + (void)sym; + + if (argc == 2 && argv[0].a_type == A_FLOAT && argv[1].a_type == A_FLOAT) { + int key = (int)argv[0].a_w.w_float; + if (key < 0 || key > 127) + return; + t_float vel = clamp01(argv[1].a_w.w_float / 127); + if (vel > 0) + sfizz_send_hd_note_on(self->synth, 0, key, vel); + else + sfizz_send_hd_note_off(self->synth, 0, key, 0); + } +} + static void sfizz_tilde_midiin(t_sfizz_tilde* self, t_float f) { int byte = (int)f; @@ -187,17 +234,55 @@ static void sfizz_tilde_reload(t_sfizz_tilde* self, t_float value) sfizz_tilde_do_load(self); } -static void sfizz_tilde_hdcc(t_sfizz_tilde* self, t_float cc, t_float value) +static void sfizz_tilde_hdcc(t_sfizz_tilde* self, t_float f1, t_float f2) { - sfizz_automate_hdcc(self->synth, 0, (int)cc, value); + int cc = (int)f1; + if (cc < 0 || cc > 127) + return; + sfizz_automate_hdcc(self->synth, 0, (int)cc, clamp01(f2)); } -static void sfizz_tilde_voices(t_sfizz_tilde* self, t_float value) +static void sfizz_tilde_cc(t_sfizz_tilde* self, t_float f1, t_float f2) { - int numvoices = (int)value; - if (numvoices < 1) - numvoices = 1; + sfizz_tilde_hdcc(self, f1, f2 / 127); +} +static void sfizz_tilde_hdbend(t_sfizz_tilde* self, t_float f1) +{ + sfizz_send_hd_pitch_wheel(self->synth, 0, clampB1(f1)); +} + +static void sfizz_tilde_bend(t_sfizz_tilde* self, t_float f1) +{ + return sfizz_tilde_hdbend(self, f1 / 8191); +} + +static void sfizz_tilde_hdtouch(t_sfizz_tilde* self, t_float f1) +{ + sfizz_send_hd_channel_aftertouch(self->synth, 0, clamp01(f1)); +} + +static void sfizz_tilde_touch(t_sfizz_tilde* self, t_float f1) +{ + sfizz_tilde_hdtouch(self, f1 / 127); +} + +static void sfizz_tilde_hdpolytouch(t_sfizz_tilde* self, t_float key, t_float f2) +{ + if (key < 0 || key > 127) + return; + sfizz_send_hd_poly_aftertouch(self->synth, 0, (int)key, clamp01(f2)); +} + +static void sfizz_tilde_polytouch(t_sfizz_tilde* self, t_float f1, t_float f2) +{ + sfizz_tilde_hdpolytouch(self, f1, f2 / 127); +} + +static void sfizz_tilde_voices(t_sfizz_tilde* self, t_float f1) +{ + int numvoices = (int)f1; + numvoices = (numvoices < 1) ? 1 : numvoices; sfizz_set_num_voices(self->synth, numvoices); } @@ -218,14 +303,30 @@ void sfizz_setup() CLASS_DEFAULT, A_GIMME, A_NULL); class_addmethod( cls_sfizz_tilde, (t_method)&sfizz_tilde_dsp, gensym("dsp"), A_CANT, A_NULL); + class_addlist( + cls_sfizz_tilde, (t_method)&sfizz_tilde_list); class_addmethod( cls_sfizz_tilde, (t_method)&sfizz_tilde_midiin, &s_float, A_FLOAT, A_NULL); class_addmethod( cls_sfizz_tilde, (t_method)&sfizz_tilde_load, gensym("load"), A_DEFSYM, A_NULL); class_addmethod( cls_sfizz_tilde, (t_method)&sfizz_tilde_reload, gensym("reload"), A_DEFFLOAT, A_NULL); + class_addmethod( + cls_sfizz_tilde, (t_method)&sfizz_tilde_cc, gensym("cc"), A_FLOAT, A_FLOAT, A_NULL); class_addmethod( cls_sfizz_tilde, (t_method)&sfizz_tilde_hdcc, gensym("hdcc"), A_FLOAT, A_FLOAT, A_NULL); + class_addmethod( + cls_sfizz_tilde, (t_method)&sfizz_tilde_bend, gensym("bend"), A_FLOAT, A_NULL); + class_addmethod( + cls_sfizz_tilde, (t_method)&sfizz_tilde_hdbend, gensym("hdbend"), A_FLOAT, A_NULL); + class_addmethod( + cls_sfizz_tilde, (t_method)&sfizz_tilde_touch, gensym("touch"), A_FLOAT, A_NULL); + class_addmethod( + cls_sfizz_tilde, (t_method)&sfizz_tilde_hdtouch, gensym("hdtouch"), A_FLOAT, A_NULL); + class_addmethod( + cls_sfizz_tilde, (t_method)&sfizz_tilde_polytouch, gensym("polytouch"), A_FLOAT, A_FLOAT, A_NULL); + class_addmethod( + cls_sfizz_tilde, (t_method)&sfizz_tilde_hdpolytouch, gensym("hdpolytouch"), A_FLOAT, A_FLOAT, A_NULL); class_addmethod( cls_sfizz_tilde, (t_method)&sfizz_tilde_voices, gensym("voices"), A_FLOAT, A_NULL); } diff --git a/plugins/puredata/sfizz~-help.pd b/plugins/puredata/sfizz~-help.pd index 98d0e0f0..c3024d32 100644 --- a/plugins/puredata/sfizz~-help.pd +++ b/plugins/puredata/sfizz~-help.pd @@ -1,36 +1,48 @@ -#N canvas 614 464 659 405 12; +#N canvas 614 464 709 426 12; #X declare -lib sfizz; -#X obj 4 3 cnv 15 650 80 empty empty sfizz 20 30 0 40 -261682 -66577 +#X obj 4 3 cnv 15 700 80 empty empty sfizz 20 30 0 40 -261682 -66577 0; #X text 45 54 A synthesizer for instruments in SFZ format; #X text 33 167 create a SFZ instrument; -#X obj 29 324 midiin; -#X text 26 301 connect MIDI-in; +#X obj 26 323 midiin; +#X text 23 300 connect MIDI-in; #X obj 162 223 dac~; -#X msg 180 346 voices \$1; -#X text 178 302 modify the polyphony; -#X obj 381 327 hsl 127 15 0 1 0 1 empty empty empty -2 -8 0 10 -262144 +#X msg 177 345 voices \$1; +#X text 175 301 modify the polyphony; +#X obj 376 326 hsl 127 15 0 1 0 1 empty empty empty -2 -8 0 10 -262144 -1 -1 6300 1; -#X floatatom 471 347 5 0 0 0 - - -; -#X text 377 303 modulate a parameter; -#X msg 378 347 hdcc 300 \$1; +#X floatatom 466 346 5 0 0 0 - - -; +#X text 372 302 modulate a parameter; +#X msg 373 346 hdcc 300 \$1; #X obj 27 115 declare -lib sfizz; #X obj 163 192 sfizz~ example.sfz; #X text 18 93 load the sfizz library; #X msg 221 115 \; pd dsp 1; #X text 218 94 click to turn on DSP; #X text 153 247 output stereo audio; -#X msg 366 223 reload; -#X msg 466 223 load example.sfz; -#X text 364 200 reload the instrument or load another; +#X msg 398 223 reload; +#X msg 498 223 load example.sfz; +#X text 396 200 reload the instrument or load another; #X obj 241 165 r \$0-input; -#X obj 29 349 s \$0-input; -#X obj 180 371 s \$0-input; -#X obj 378 372 s \$0-input; -#X obj 366 248 s \$0-input; -#X obj 466 248 s \$0-input; -#X obj 180 327 nbx 5 14 1 256 0 1 empty empty empty 0 -8 0 10 -262144 +#X obj 26 348 s \$0-input; +#X obj 177 370 s \$0-input; +#X obj 373 371 s \$0-input; +#X obj 398 248 s \$0-input; +#X obj 498 248 s \$0-input; +#X obj 177 326 nbx 5 14 1 256 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 64 256; +#X text 567 302 send a note; +#X obj 568 348 makenote 100 500; +#X obj 568 373 list; +#X obj 568 398 s \$0-input; +#X msg 568 323 60; +#X obj 386 92 cnv 15 300 100 empty empty Inlets 20 12 0 14 -233017 +-66577 0; +#X text 395 140 3: pitch bend; +#X text 395 154 4: channel aftertouch; +#X text 395 168 5: polyphonic aftertouch and key; +#X text 395 126 2: controller and value; +#X text 395 112 1: note and velocity; #X connect 3 0 22 0; #X connect 6 0 23 0; #X connect 8 0 11 0; @@ -42,3 +54,7 @@ #X connect 19 0 26 0; #X connect 21 0 13 0; #X connect 27 0 6 0; +#X connect 29 0 30 0; +#X connect 29 1 30 1; +#X connect 30 0 31 0; +#X connect 32 0 29 0; From 650018254b7bd18d67e7c82e37ed999784af4ef1 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 30 Apr 2021 14:18:35 +0200 Subject: [PATCH 3/6] pd: accept CC numbers up to the limit --- plugins/puredata/CMakeLists.txt | 1 + plugins/puredata/sfizz_puredata.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/puredata/CMakeLists.txt b/plugins/puredata/CMakeLists.txt index e6495246..abb19606 100644 --- a/plugins/puredata/CMakeLists.txt +++ b/plugins/puredata/CMakeLists.txt @@ -24,6 +24,7 @@ function(copy_puredata_resources TARGET SOURCE_DIR DESTINATION_DIR) endfunction() add_library(sfizz_puredata MODULE sfizz_puredata.c) +target_compile_definitions(sfizz_puredata PRIVATE "SFIZZ_NUM_CCS=${SFIZZ_NUM_CCS}") target_include_directories(sfizz_puredata PRIVATE "${PUREDATA_INCLUDE_DIR}") target_link_libraries(sfizz_puredata PRIVATE sfizz::sfizz) diff --git a/plugins/puredata/sfizz_puredata.c b/plugins/puredata/sfizz_puredata.c index 16b97c6d..d998929b 100644 --- a/plugins/puredata/sfizz_puredata.c +++ b/plugins/puredata/sfizz_puredata.c @@ -237,7 +237,7 @@ static void sfizz_tilde_reload(t_sfizz_tilde* self, t_float value) static void sfizz_tilde_hdcc(t_sfizz_tilde* self, t_float f1, t_float f2) { int cc = (int)f1; - if (cc < 0 || cc > 127) + if (cc < 0 || cc >= SFIZZ_NUM_CCS) return; sfizz_automate_hdcc(self->synth, 0, (int)cc, clamp01(f2)); } From 3afb426d5572caf76b676b784edbf9724ea70881 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 30 Apr 2021 14:18:58 +0200 Subject: [PATCH 4/6] pd: cleanup [ci skip] --- plugins/puredata/sfizz_puredata.c | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/puredata/sfizz_puredata.c b/plugins/puredata/sfizz_puredata.c index d998929b..ac7f4624 100644 --- a/plugins/puredata/sfizz_puredata.c +++ b/plugins/puredata/sfizz_puredata.c @@ -214,7 +214,6 @@ static void sfizz_tilde_midiin(t_sfizz_tilde* self, t_float f) case 0xe0: // pitch bend sfizz_send_pitch_wheel(self->synth, 0, (midi[1] + (midi[2] << 7)) - 8192); break; - } break; } From 5e8443892b71e5d4bb0ee628de3e19563a08aabf Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 30 Apr 2021 14:23:16 +0200 Subject: [PATCH 5/6] Allow puredata to build in CI --- .github/workflows/build.yml | 7 +++++-- scripts/appveyor/before_build.sh | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9fbd501e..1feadfd7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,6 +70,7 @@ jobs: -DSFIZZ_JACK=ON \ -DSFIZZ_VST=ON \ -DSFIZZ_LV2_UI=ON \ + -DSFIZZ_PUREDATA=ON \ -DSFIZZ_TESTS=ON \ -DSFIZZ_SHARED=OFF \ -DSFIZZ_STATIC_DEPENDENCIES=OFF \ @@ -157,7 +158,7 @@ jobs: - name: Configure CMake working-directory: ${{runner.workspace}}/build run: | - cmake "${Env:GITHUB_WORKSPACE}" -G"Visual Studio 16 2019" -A"${Env:release_arch}" -DCMAKE_BUILD_TYPE="${Env:BUILD_TYPE}" -DCMAKE_CXX_STANDARD=17 -DSFIZZ_TESTS=ON -DSFIZZ_VST=ON -DSFIZZ_LV2=ON + cmake "${Env:GITHUB_WORKSPACE}" -G"Visual Studio 16 2019" -A"${Env:release_arch}" -DCMAKE_BUILD_TYPE="${Env:BUILD_TYPE}" -DCMAKE_CXX_STANDARD=17 -DSFIZZ_TESTS=ON -DSFIZZ_VST=ON -DSFIZZ_LV2=ON -DSFIZZ_PUREDATA=ON - name: Build tests working-directory: ${{runner.workspace}}/build run: cmake --build . --config "${Env:BUILD_TYPE}" -j 2 --target sfizz_tests @@ -192,7 +193,7 @@ jobs: - name: Configure CMake working-directory: ${{runner.workspace}}/build run: | - cmake "${Env:GITHUB_WORKSPACE}" -G"Visual Studio 16 2019" -A"${Env:release_arch}" -DCMAKE_BUILD_TYPE="${Env:BUILD_TYPE}" -DCMAKE_CXX_STANDARD=17 -DSFIZZ_TESTS=ON -DSFIZZ_VST=ON -DSFIZZ_LV2=ON + cmake "${Env:GITHUB_WORKSPACE}" -G"Visual Studio 16 2019" -A"${Env:release_arch}" -DCMAKE_BUILD_TYPE="${Env:BUILD_TYPE}" -DCMAKE_CXX_STANDARD=17 -DSFIZZ_TESTS=ON -DSFIZZ_VST=ON -DSFIZZ_LV2=ON -DSFIZZ_PUREDATA=ON - name: Build tests working-directory: ${{runner.workspace}}/build run: cmake --build . --config "${Env:BUILD_TYPE}" -j 2 --target sfizz_tests @@ -270,6 +271,7 @@ jobs: -DENABLE_LTO=OFF \ -DSFIZZ_JACK=OFF \ -DSFIZZ_VST=ON \ + -DSFIZZ_PUREDATA=ON \ -DSFIZZ_STATIC_DEPENDENCIES=ON \ -DCMAKE_CXX_STANDARD=17 - name: Build @@ -339,6 +341,7 @@ jobs: -DENABLE_LTO=OFF \ -DSFIZZ_JACK=OFF \ -DSFIZZ_VST=ON \ + -DSFIZZ_PUREDATA=ON \ -DSFIZZ_STATIC_DEPENDENCIES=ON \ -DCMAKE_CXX_STANDARD=17 - name: Build diff --git a/scripts/appveyor/before_build.sh b/scripts/appveyor/before_build.sh index 5989ba14..e813e055 100644 --- a/scripts/appveyor/before_build.sh +++ b/scripts/appveyor/before_build.sh @@ -7,6 +7,7 @@ cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \ -DSFIZZ_VST=ON \ -DSFIZZ_AU=ON \ + -DSFIZZ_PUREDATA=ON \ -DSFIZZ_RENDER=OFF \ -DSFIZZ_SHARED=OFF \ -DSFIZZ_TESTS=ON \ From c575b2fc6c88ff189d4579222b62ee3751c4992b Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 30 Apr 2021 15:00:46 +0200 Subject: [PATCH 6/6] Attempt to make it build --- cmake/PuredataConfig.cmake | 49 +- plugins/puredata/CMakeLists.txt | 10 +- plugins/puredata/external/pd/bin/pd.def | 601 ++++++++++++++++++++++++ 3 files changed, 653 insertions(+), 7 deletions(-) create mode 100644 plugins/puredata/external/pd/bin/pd.def diff --git a/cmake/PuredataConfig.cmake b/cmake/PuredataConfig.cmake index eb794d1d..1fc7f005 100644 --- a/cmake/PuredataConfig.cmake +++ b/cmake/PuredataConfig.cmake @@ -1,10 +1,11 @@ -find_path(PUREDATA_INCLUDE_DIR "m_pd.h" PATH_SUFFIXES "pd") +find_path(PD_INCLUDE_BASEDIR "m_pd.h" PATH_SUFFIXES "pd") +set(PD_IMP_DEF "${PROJECT_SOURCE_DIR}/plugins/puredata/external/pd/bin/pd.def") -if(PUREDATA_INCLUDE_DIR) +if(PD_INCLUDE_BASEDIR) message(STATUS "Puredata headers: ${PUREDATA_INCLUDE_DIR}") else() message(STATUS "Puredata headers not found, using our own") - set(PUREDATA_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/plugins/puredata/external/pd/include") + set(PD_INCLUDE_BASEDIR "${PROJECT_SOURCE_DIR}/plugins/puredata/external/pd/include") endif() if(WIN32) @@ -14,3 +15,45 @@ elseif(APPLE) else() set(PUREDATA_SUFFIX ".pd_linux") endif() + +if(WIN32) + add_library(pdex-implib STATIC IMPORTED) + if(MSVC) + add_custom_command( + OUTPUT "pd.lib" + COMMAND "lib" "/out:pd.lib" "/def:${PD_IMP_DEF}" "/machine:${MSVC_C_ARCHITECTURE_ID}" + DEPENDS "${PD_IMP_DEF}") + add_custom_target(pdex-implib-generated + DEPENDS "pd.lib") + set_target_properties(pdex-implib PROPERTIES + IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/pd.lib") + else() + find_program(PD_DLLTOOL_PROGRAM "dlltool") + if(NOT PD_DLLTOOL_PROGRAM) + message(FATAL_ERROR "Cannot find dlltool") + endif() + add_custom_command( + OUTPUT "libpd.dll.a" + COMMAND "${PD_DLLTOOL_PROGRAM}" "-l" "libpd.dll.a" "-d" "${PD_IMP_DEF}" + DEPENDS "${PD_IMP_DEF}") + add_custom_target(pdex-implib-generated + DEPENDS "libpd.dll.a") + set_target_properties(pdex-implib PROPERTIES + IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/libpd.dll.a") + endif() + add_dependencies(pdex-implib pdex-implib-generated) +endif() + +function(add_pd_external TARGET) + add_library("${TARGET}" MODULE ${ARGN}) + target_include_directories("${TARGET}" PRIVATE "${PD_INCLUDE_BASEDIR}") + set_target_properties("${TARGET}" PROPERTIES + PREFIX "" + SUFFIX "${PUREDATA_SUFFIX}") + if(APPLE) + set_property(TARGET "${TARGET}" APPEND_STRING + PROPERTY LINK_FLAGS " -Wl,-undefined,suppress,-flat_namespace") + elseif(WIN32) + target_link_libraries("${TARGET}" PRIVATE pdex-implib) + endif() +endfunction() diff --git a/plugins/puredata/CMakeLists.txt b/plugins/puredata/CMakeLists.txt index abb19606..0ad11a25 100644 --- a/plugins/puredata/CMakeLists.txt +++ b/plugins/puredata/CMakeLists.txt @@ -23,17 +23,19 @@ function(copy_puredata_resources TARGET SOURCE_DIR DESTINATION_DIR) add_dependencies("${TARGET}" "${TARGET}_puredata_resources") endfunction() -add_library(sfizz_puredata MODULE sfizz_puredata.c) +add_pd_external(sfizz_puredata "sfizz_puredata.c") target_compile_definitions(sfizz_puredata PRIVATE "SFIZZ_NUM_CCS=${SFIZZ_NUM_CCS}") -target_include_directories(sfizz_puredata PRIVATE "${PUREDATA_INCLUDE_DIR}") target_link_libraries(sfizz_puredata PRIVATE sfizz::sfizz) set_target_properties(sfizz_puredata PROPERTIES - PREFIX "" - SUFFIX "${PUREDATA_SUFFIX}" OUTPUT_NAME "sfizz" LIBRARY_OUTPUT_DIRECTORY "${PUREDATA_BINARY_DIR}/$<0:>") +if(MINGW) + set_property(TARGET sfizz_puredata APPEND_STRING + PROPERTY LINK_FLAGS " -static") +endif() + copy_puredata_resources(sfizz_puredata "${CMAKE_CURRENT_SOURCE_DIR}" "${PUREDATA_BINARY_DIR}") diff --git a/plugins/puredata/external/pd/bin/pd.def b/plugins/puredata/external/pd/bin/pd.def new file mode 100644 index 00000000..607bd990 --- /dev/null +++ b/plugins/puredata/external/pd/bin/pd.def @@ -0,0 +1,601 @@ +LIBRARY pd +EXPORTS + ABORT + array_free + array_getcoordinate + array_getfields + array_new + array_redraw + array_resize + array_resize_and_redraw + atom_gensym + atom_getfloat + atom_getfloatarg + atom_getint + atom_getintarg + atom_getsymbol + atom_getsymbolarg + atom_string + audio_isopen + audio_shouldkeepopen + binbuf_add + binbuf_addbinbuf + binbuf_addsemi + binbuf_addv + binbuf_clear + binbuf_duplicate + binbuf_eval + binbuf_evalfile + binbuf_free + binbuf_getnatom + binbuf_gettext + binbuf_getvec + binbuf_new + binbuf_print + binbuf_read + binbuf_read_via_canvas + binbuf_read_via_path + binbuf_realizedollsym + binbuf_resize + binbuf_restore + binbuf_text + binbuf_write + bug + canvas_addinlet + canvas_addoutlet + canvas_class DATA + canvas_closebang + canvas_connect + canvas_create_editor + canvas_dataproperties + canvas_deletelinesfor + canvas_deletelinesforio + canvas_destroy_editor + canvas_dirty + canvas_disconnect + canvas_dspstate DATA + canvas_editmode + canvas_fixlinesfor + canvas_free + canvas_getargs + canvas_getcurrent + canvas_getcurrentdir + canvas_getdir + canvas_getdollarzero + canvas_getenv + canvas_getindex + canvas_getrootfor + canvas_hitbox + canvas_initbang + canvas_isabstraction + canvas_isconnected + canvas_istable + canvas_loadbang + canvas_makebindsym + canvas_makefilename + canvas_new + canvas_noundo + canvas_open + canvas_path_iterate + canvas_readscalar + canvas_realizedollar + canvas_redraw + canvas_redrawallfortemplate + canvas_redrawallfortemplatecanvas + canvas_rename + canvas_resortinlets + canvas_resortoutlets + canvas_restoreconnections + canvas_resume_dsp + canvas_rminlet + canvas_rmoutlet + canvas_selectinrect + canvas_setargs + canvas_setcurrent + canvas_setcursor + canvas_setdeleting + canvas_setundo + canvas_showtext + canvas_stowconnections + canvas_suspend_dsp + canvas_unsetcurrent + canvas_update_dsp + canvas_updatewindowlist + canvas_vis + canvas_whichfind DATA + canvas_writescalar + class_addanything + class_addbang + class_addcreator + class_addlist + class_addmethod + class_addpointer + class_addsymbol + class_doaddfloat + class_domainsignalin + class_gethelpdir + class_gethelpname + class_getname + class_getpropertiesfn + class_getsavefn + class_isdrawcommand + class_new + class_new64 + class_set_extern_dir + class_setdrawcommand + class_sethelpsymbol + class_setparentwidget + class_setpropertiesfn + class_setsavefn + class_setwidget + clock_delay + clock_free + clock_getlogicaltime + clock_getsystime + clock_getsystimeafter + clock_gettimesince + clock_gettimesincewithunits + clock_new + clock_set + clock_setunit + clock_unset + clone_class DATA + copy_perform + copybytes + cos_table DATA + dbtopow + dbtorms + dsp_add + dsp_add_copy + dsp_add_plus + dsp_add_scalarcopy + dsp_add_zero + dsp_addv + endpost + error + ex_Avg + ex_Sum + ex_avg + ex_funcs DATA + ex_getsym + ex_mkvector + ex_size + ex_store + ex_sum + ex_symname + fielddesc_cvtfromcoord + fielddesc_cvttocoord + fielddesc_getcoord + fielddesc_setcoord + floatinlet_new + freebytes + ftom + g_editor_freepdinstance + g_editor_newpdinstance + g_template_freepdinstance + g_template_newpdinstance + garray_class DATA + garray_getarray + garray_getfloatarray + garray_getfloatwords + garray_getglist + garray_npoints + garray_redraw + garray_resize + garray_resize_long + garray_setsaveit + garray_template + garray_usedindsp + garray_vec + gensym + get_sys_dacsr + get_sys_main_advance + get_sys_schedadvance + get_sys_schedblocksize + get_sys_sleepgrain + get_sys_soundin + get_sys_soundout + get_sys_time + get_sys_time_per_dsp_tick + getbytes + getfn + getzbytes + gfxstub_deleteforkey + gfxstub_new + glist_add + glist_addglist + glist_arraydialog + glist_clear + glist_delete + glist_deselect + glist_dpixtodx + glist_dpixtody + glist_drawiofor + glist_eraseiofor + glist_findgraph + glist_findrtext + glist_fontheight + glist_fontwidth + glist_getcanvas + glist_getfont + glist_getnextxy + glist_getzoom + glist_glist + glist_grab + glist_init + glist_isgraph + glist_isselected + glist_istoplevel + glist_isvisible + glist_mergefile + glist_noselect + glist_pixelstox + glist_pixelstoy + glist_read + glist_redraw + glist_retext + glist_select + glist_selectall + glist_sort + glist_valid DATA + glist_writetobinbuf + glist_xtopixels + glist_ytopixels + glob_evalfile + glob_initfromgui + glob_pdobject DATA + glob_quit + glob_setfilename + gobj_activate + gobj_click + gobj_delete + gobj_displace + gobj_getrect + gobj_save + gobj_select + gobj_shouldvis + gobj_vis + gpointer_check + gpointer_copy + gpointer_init + gpointer_setarray + gpointer_setglist + gpointer_unset + graph_array + gstub_cutoff + gstub_new + gtemplate_get + guiconnect_new + guiconnect_notarget + iem_fstyletoint + iem_inttofstyle + iem_inttosymargs + iem_symargstoint + iemgui_all_dollar2raute + iemgui_all_dollararg2sym + iemgui_all_loadcolors + iemgui_all_raute2dollar + iemgui_all_sym2dollararg + iemgui_clip_font + iemgui_clip_size + iemgui_color + iemgui_color_hex DATA + iemgui_delete + iemgui_delta + iemgui_dialog + iemgui_displace + iemgui_dollar2raute + iemgui_label + iemgui_label_font + iemgui_label_pos + iemgui_new_dogetname + iemgui_new_getnames + iemgui_newzoom + iemgui_pos + iemgui_properties + iemgui_raute2dollar + iemgui_receive + iemgui_save + iemgui_select + iemgui_send + iemgui_size + iemgui_verify_snd_ne_rcv + iemgui_vis + iemgui_vu_col DATA + iemgui_vu_db2i DATA + iemgui_vu_scale_str DATA + iemgui_zoom + ilog2 + inlet_free + inlet_new + inmidi_aftertouch + inmidi_byte + inmidi_controlchange + inmidi_noteon + inmidi_pitchbend + inmidi_polyaftertouch + inmidi_programchange + inmidi_realtimein + inmidi_sysex + linetraverser_next + linetraverser_skipobject + linetraverser_start + logpost + max_ex_tab + max_ex_tab_store + max_ex_var + max_ex_var_store + mayer_fft + mayer_fht + mayer_ifft + mayer_realfft + mayer_realifft + midi_getdevs + mmio_close_audio + mmio_getdevs + mmio_open_audio + mmio_reportidle + mmio_send_dacs + mtof + namelist_append + namelist_append_files + namelist_free + namelist_get + nullfn + obj_connect + obj_disconnect + obj_issignalinlet + obj_issignaloutlet + obj_list + obj_nexttraverseoutlet + obj_ninlets + obj_noutlets + obj_nsiginlets + obj_nsigoutlets + obj_saveformat + obj_siginletindex + obj_sigoutletindex + obj_starttraverseoutlet + open_via_helppath + open_via_path + outlet_anything + outlet_bang + outlet_float + outlet_free + outlet_getsymbol + outlet_list + outlet_new + outlet_pointer + outlet_setstacklim + outlet_symbol + pa_close_audio + pa_getdevs + pa_open_audio + pa_send_dacs + pd_bang + pd_bind + pd_canvasmaker DATA + pd_checkglist + pd_checkobject + pd_compatibilitylevel DATA + pd_emptylist + pd_error + pd_fft + pd_findbyclass + pd_float + pd_forwardmess + pd_free + pd_getcanvaslist + pd_getdspstate + pd_getparentwidget + pd_globallock + pd_globalunlock + pd_list + pd_maininstance DATA + pd_new + pd_newest + pd_objectmaker DATA + pd_pointer + pd_popsym + pd_pushsym + pd_symbol + pd_typedmess + pd_unbind + pd_vmess + plus_perform + pointerinlet_new + post + postatom + postfloat + poststring + powtodb + q8_rsqrt + q8_sqrt + qrsqrt + qsqrt + resample_dsp + resample_free + resample_init + resamplefrom_dsp + resampleto_dsp + resizebytes + rmstodb + rtext_activate + rtext_displace + rtext_draw + rtext_erase + rtext_free + rtext_getseltext + rtext_gettag + rtext_gettext + rtext_height + rtext_key + rtext_mouse + rtext_new + rtext_retext + rtext_select + rtext_width + s_ DATA + s__N DATA + s__X DATA + s_anything DATA + s_bang DATA + s_float DATA + s_list DATA + s_pointer DATA + s_signal DATA + s_symbol DATA + s_x DATA + s_y DATA + scalar_class DATA + scalar_getbasexy + scalar_new + scalar_redraw + sched_geteventno + sched_set_using_audio + sched_tick + signalinlet_new + socketreceiver_new + socketreceiver_read + startpost + symbolinlet_new + sys_addhist + sys_addpollfn + sys_advance_samples DATA + sys_audioapi DATA + sys_audiodevnametonumber + sys_audiodevnumbertoname + sys_bail + sys_bashfilename + sys_clearhist + sys_close + sys_close_audio + sys_close_midi + sys_closesocket + sys_debuglevel DATA + sys_decodedialog + sys_defaultfont DATA + sys_defeatrt DATA + sys_do_open_midi + sys_externalschedlib DATA + sys_fclose + sys_flags DATA + sys_font DATA + sys_fontheight + sys_fontweight DATA + sys_fontwidth + sys_fopen + sys_get_audio_apis + sys_get_audio_devs + sys_get_audio_params + sys_get_inchannels + sys_get_midi_apis + sys_get_midi_devs + sys_get_midi_params + sys_get_outchannels + sys_getblksize + sys_getmeters + sys_getrealtime + sys_getsr + sys_getversion + sys_gui + sys_guicmd DATA + sys_havegui + sys_hipriority DATA + sys_hostfontsize + sys_idlehook DATA + sys_init_fdpoll + sys_initmidiqueue + sys_isabsolutepath + sys_libdir DATA + sys_listdevs + sys_listmididevs + sys_load_lib + sys_loadpreferences + sys_lock + sys_log_error + sys_logerror + sys_microsleep + sys_midiapi DATA + sys_midibytein + sys_mididevnametonumber + sys_mididevnumbertoname + sys_midiindevlist DATA + sys_midioutdevlist DATA + sys_nearestfontsize + sys_nmidiin DATA + sys_nmidiout DATA + sys_noloadbang DATA + sys_open + sys_open_absolute + sys_open_midi + sys_ouch + sys_poll_midi + sys_pollgui + sys_pollmidiqueue + sys_pretendguibytes + sys_printhook DATA + sys_printtostderr DATA + sys_putmidibyte + sys_putmidimess + sys_queuegui + sys_register_loader + sys_reopen_audio + sys_reopen_midi + sys_reportidle + sys_rmpollfn + sys_save_audio_params + sys_savepreferences + sys_schedadvance DATA + sys_send_dacs + sys_set_audio_api + sys_set_audio_settings + sys_set_audio_settings_reopen + sys_set_audio_state + sys_set_midi_api + sys_setchsr + sys_setextrapath + sys_setmiditimediff + sys_sleepgrain DATA + sys_sockerror + sys_trylock + sys_trytoopenone + sys_unbashfilename + sys_unixerror + sys_unlock + sys_unqueuegui + sys_usestdpath DATA + sys_verbose DATA + sys_vgui + sys_zoom_open DATA + sys_zoomfontheight + sys_zoomfontwidth + template_find_field + template_findbyname + template_findcanvas + template_free + template_getfloat + template_getsymbol + template_match + template_new + template_notify + template_setfloat + template_setsymbol + text_drawborder + text_eraseborder + text_setto + text_widgetbehavior DATA + text_xpix + text_ypix + value_get + value_getfloat + value_release + value_setfloat + verbose + vinlet_class DATA + voutlet_class DATA + word_free + word_init + word_restore + zero_perform + zgetfn