Merge pull request #873 from jpcima/puredata-misc

Puredata misc
This commit is contained in:
JP Cimalando 2021-04-30 15:25:34 +02:00 committed by GitHub
commit 0969d6cd2a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 816 additions and 51 deletions

View file

@ -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

View file

@ -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()

View file

@ -23,16 +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)
target_include_directories(sfizz_puredata PRIVATE "${PUREDATA_INCLUDE_DIR}")
add_pd_external(sfizz_puredata "sfizz_puredata.c")
target_compile_definitions(sfizz_puredata PRIVATE "SFIZZ_NUM_CCS=${SFIZZ_NUM_CCS}")
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}")

View file

@ -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

601
plugins/puredata/external/pd/bin/pd.def vendored Normal file
View file

@ -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

View file

@ -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;
@ -167,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;
}
@ -187,17 +233,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 >= SFIZZ_NUM_CCS)
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 +302,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);
}

View file

@ -1,46 +1,60 @@
#N canvas 932 395 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 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 26 323 midiin;
#X text 23 300 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 floatatom 471 347 5 0 0 0 - - -;
#X text 377 303 modulate a parameter;
#X msg 378 347 hdcc 300 \$1;
#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 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 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 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 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;
#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;
#X connect 29 0 30 0;
#X connect 29 1 30 1;
#X connect 30 0 31 0;
#X connect 32 0 29 0;

View file

@ -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 \