commit
3274ae0d69
@ -0,0 +1,9 @@ |
||||
# folders |
||||
|
||||
build/Release32/.pd |
||||
build/Release64/.pd |
||||
vstsdk2.4 |
||||
|
||||
# binaries |
||||
|
||||
*.dll |
@ -0,0 +1,166 @@ |
||||
#N canvas 313 -10 860 681 12; |
||||
#X obj 26 400 r rvstplugname; |
||||
#X msg 25 423 \; gui-label label \$1; |
||||
#X obj 37 22 r rvstopengui; |
||||
#X obj 24 86 select 0 1; |
||||
#X obj 22 227 delay 10; |
||||
#X obj 32 486 loadbang; |
||||
#X msg 31 512 1; |
||||
#X msg 68 513 0; |
||||
#N canvas 0 50 746 518 audio_stuff 0; |
||||
#X obj 104 322 adc~; |
||||
#X obj 104 401 dac~; |
||||
#X msg 47 286 \$1 30; |
||||
#X obj 47 311 line~; |
||||
#X obj 143 371 *~; |
||||
#X obj 104 371 *~; |
||||
#X obj 48 47 r rvstparameter0; |
||||
#X obj 48 229 * 100; |
||||
#X obj 47 253 dbtorms; |
||||
#X msg 79 81 set \$1; |
||||
#X obj 80 189 s svstparameter0; |
||||
#X obj 79 107 s level-rcv; |
||||
#X obj 80 144 r level-snd; |
||||
#X text 192 107 update pd-slider when parameter is changed from host |
||||
; |
||||
#X text 230 168 update host when parameter is changed from pd-slider |
||||
; |
||||
#X text 19 12 audio stuff example; |
||||
#X obj 315 283 loadbang; |
||||
#X msg 315 312 \; pd dsp 1 \;; |
||||
#X obj 368 463 tabwrite~ scope; |
||||
#X obj 375 433 metro 120; |
||||
#X obj 366 403 loadbang; |
||||
#X obj 280 413 *~ 5; |
||||
#X obj 280 438 clip~ -1 1; |
||||
#X connect 0 0 5 0; |
||||
#X connect 0 1 4 0; |
||||
#X connect 2 0 3 0; |
||||
#X connect 3 0 4 1; |
||||
#X connect 3 0 5 1; |
||||
#X connect 4 0 1 1; |
||||
#X connect 4 0 21 0; |
||||
#X connect 5 0 1 0; |
||||
#X connect 5 0 21 0; |
||||
#X connect 6 0 7 0; |
||||
#X connect 6 0 9 0; |
||||
#X connect 7 0 8 0; |
||||
#X connect 8 0 2 0; |
||||
#X connect 9 0 11 0; |
||||
#X connect 12 0 10 0; |
||||
#X connect 12 0 7 0; |
||||
#X connect 16 0 17 0; |
||||
#X connect 19 0 18 0; |
||||
#X connect 20 0 19 0; |
||||
#X connect 21 0 22 0; |
||||
#X connect 22 0 18 0; |
||||
#X restore 518 403 pd audio_stuff; |
||||
#X text 67 50 <- the host signals when gui has to be visible; |
||||
#X msg 75 195 vis 1; |
||||
#X obj 62 147 t b b; |
||||
#X text 124 197 display gui window; |
||||
#X text 186 79 0 = hide \, 1 = show; |
||||
#N canvas 0 50 450 300 hidePdConsole 0; |
||||
#X obj 78 48 inlet; |
||||
#X obj 76 149 hcs/sys_gui; |
||||
#X msg 75 117 wm withdraw .pdwindow; |
||||
#X msg 248 114 wm iconify .pdwindow; |
||||
#X obj 79 79 select 1 0; |
||||
#X connect 0 0 4 0; |
||||
#X connect 2 0 1 0; |
||||
#X connect 3 0 1 0; |
||||
#X connect 4 0 2 0; |
||||
#X connect 4 1 3 0; |
||||
#X restore 29 544 pd hidePdConsole; |
||||
#X text 163 545 (needs hcs/sys_gui external); |
||||
#N canvas 0 0 320 154 \$0-gui 0; |
||||
#X obj 5 5 cnv 15 300 190 empty gui-label empty 10 12 0 14 -233017 |
||||
-66577 0; |
||||
#X obj 13 53 vsl 60 128 0 1 0 0 level-snd level-rcv LEVEL 0 -9 0 10 |
||||
-262144 -1 -1 0 1; |
||||
#N canvas 0 50 450 250 (subpatch) 0; |
||||
#X array scope 300 float 1; |
||||
#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; |
||||
#X coords 0 1 299 -1 120 70 1 0 0; |
||||
#X restore 138 57 graph; |
||||
#X obj 136 163 bng 15 250 50 0 \$0-show_parent empty show_parent_window |
||||
17 7 0 10 -262144 -1 -1; |
||||
#X text 101 145 click here to see main patch; |
||||
#X restore 517 361 pd \$0-gui; |
||||
#X obj 21 298 s pd-\$0-gui; |
||||
#X obj 29 653 s pd-Pd_Gain(gui).pd; |
||||
#X msg 29 624 vis 0; |
||||
#X obj 28 601 loadbang; |
||||
#X obj 104 602 r \$0-show_parent; |
||||
#X msg 104 627 vis 1; |
||||
#X obj 40 57 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 |
||||
; |
||||
#X obj 58 113 delay 10; |
||||
#X msg 21 254 vis 0; |
||||
#X msg 206 252 vis 0; |
||||
#X obj 208 229 loadbang; |
||||
#X text 67 255 hide gui window; |
||||
#X obj 597 127 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0 |
||||
1; |
||||
#X text 618 126 enable embedding (experimental); |
||||
#X text 110 300 (<- rename with the name of your gui window); |
||||
#X text 603 361 <- the actual gui window; |
||||
#N canvas 0 50 645 376 embedding_gui_into_host(experimental) 0; |
||||
#X obj 86 151 inlet; |
||||
#X obj 135 153 inlet; |
||||
#X obj 86 205 spigot; |
||||
#X obj 83 321 s guiName; |
||||
#X text 157 216 <- send to host the title of your gui window; |
||||
#X obj 84 268 f \$0; |
||||
#X msg 83 295 symbol \$1-gui; |
||||
#X obj 84 243 delay 10; |
||||
#X obj 154 180 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 |
||||
1; |
||||
#X text 90 40 In order to embed a puredata (tcl) gui window into host |
||||
\, the patch has to process values received from host (rvstopengui) |
||||
\, and send to it the title of the window to be embedded., f 61; |
||||
#X text 230 244 this may crash the tcl gui and thus puredata....; |
||||
#X msg 501 327 map 0 \, map 1; |
||||
#X connect 0 0 2 0; |
||||
#X connect 1 0 2 1; |
||||
#X connect 1 0 8 0; |
||||
#X connect 2 0 7 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 6 0 3 0; |
||||
#X connect 7 0 5 0; |
||||
#X restore 436 165 pd embedding_gui_into_host(experimental), f 23 |
||||
; |
||||
#X text 9 381 * Receiving plug & instance name from host; |
||||
#X text 14 349 *** OTHER TRICKS ***; |
||||
#X text 10 461 * Hiding pd-console window on startup; |
||||
#X text 13 573 * Hiding main patch (this one!) on startup; |
||||
#X text 545 13 PDVST; |
||||
#X connect 0 0 1 0; |
||||
#X connect 2 0 23 0; |
||||
#X connect 2 0 3 0; |
||||
#X connect 3 0 4 0; |
||||
#X connect 3 1 24 0; |
||||
#X connect 4 0 25 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 6 0 14 0; |
||||
#X connect 7 0 14 0; |
||||
#X connect 10 0 17 0; |
||||
#X connect 11 0 33 0; |
||||
#X connect 11 1 10 0; |
||||
#X connect 19 0 18 0; |
||||
#X connect 20 0 19 0; |
||||
#X connect 21 0 22 0; |
||||
#X connect 22 0 18 0; |
||||
#X connect 24 0 11 0; |
||||
#X connect 25 0 17 0; |
||||
#X connect 26 0 17 0; |
||||
#X connect 27 0 26 0; |
||||
#X connect 29 0 33 1; |
@ -0,0 +1,55 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, defaults to <host_exec_dir>/pdvst/pd/bin) |
||||
PDPATH =D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Gain(gui).pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdgg |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = FALSE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = TRUE |
||||
|
||||
# Dimensions of this custom GUI (in pixels) |
||||
GUIHEIGHT = 250 |
||||
|
||||
# Warning : with tcl/tk, don't try smaller values than 320 |
||||
GUIWIDTH = 320 |
||||
|
||||
|
||||
# Display Pd GUI or not |
||||
# (Hint : choose TRUE if you use some pd-window as custom gui) |
||||
DEBUG = TRUE |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
# Define another program |
||||
PROGRAM = Att -6db |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0.94 |
||||
|
||||
|
||||
# Define another program |
||||
PROGRAM = Mute |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0. |
@ -0,0 +1,35 @@ |
||||
#N canvas 0 265 595 358 12; |
||||
#X obj 78 87 adc~, f 6; |
||||
#X obj 73 241 loadbang; |
||||
#X msg 73 271 \; pd dsp 1 \;; |
||||
#X obj 77 162 dac~, f 6; |
||||
#X msg 142 52 \$1 30; |
||||
#X obj 142 87 line~; |
||||
#X obj 122 127 *~; |
||||
#X obj 78 127 *~; |
||||
#X obj 142 11 r gain; |
||||
#X obj 242 8 r rvstparameter0; |
||||
#X obj 242 235 * 100; |
||||
#X obj 242 263 dbtorms; |
||||
#X obj 242 290 s gain; |
||||
#X obj 300 225 s svstparameter0; |
||||
#X obj 277 75 vsl 50 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 |
||||
-1 -1 0 1; |
||||
#X msg 277 42 set \$1; |
||||
#X text 355 117 range is 0..1; |
||||
#X connect 0 0 7 0; |
||||
#X connect 0 1 6 0; |
||||
#X connect 1 0 2 0; |
||||
#X connect 4 0 5 0; |
||||
#X connect 5 0 6 1; |
||||
#X connect 5 0 7 1; |
||||
#X connect 6 0 3 1; |
||||
#X connect 7 0 3 0; |
||||
#X connect 8 0 4 0; |
||||
#X connect 9 0 10 0; |
||||
#X connect 9 0 15 0; |
||||
#X connect 10 0 11 0; |
||||
#X connect 11 0 12 0; |
||||
#X connect 14 0 13 0; |
||||
#X connect 14 0 10 0; |
||||
#X connect 15 0 14 0; |
@ -0,0 +1,49 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, will search in <host_exec_dir>\pdvst\pd\ |
||||
# then in <vst_dir>\.pd\ |
||||
PDPATH = D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Gain(nogui).pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdgn |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = FALSE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = FALSE |
||||
|
||||
# Display Pd GUI or not |
||||
DEBUG = FALSE |
||||
|
||||
# External libraries (comma delimited list, relative to pdvst/) |
||||
# ***OBSOLETE, use [declare] inside patch instead*** |
||||
#LIB = |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full Blast |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
#another program |
||||
PROGRAM = Muted |
||||
|
||||
PARAMETER0 = 0.0 |
||||
|
||||
#another program |
||||
PROGRAM = -6dB |
||||
|
||||
PARAMETER0 = 0.94 |
@ -0,0 +1,35 @@ |
||||
#N canvas 0 265 595 358 12; |
||||
#X obj 78 87 adc~, f 6; |
||||
#X obj 73 241 loadbang; |
||||
#X msg 73 271 \; pd dsp 1 \;; |
||||
#X obj 77 162 dac~, f 6; |
||||
#X msg 142 52 \$1 30; |
||||
#X obj 142 87 line~; |
||||
#X obj 122 127 *~; |
||||
#X obj 78 127 *~; |
||||
#X obj 142 11 r gain; |
||||
#X obj 242 8 r rvstparameter0; |
||||
#X obj 242 235 * 100; |
||||
#X obj 242 263 dbtorms; |
||||
#X obj 242 290 s gain; |
||||
#X obj 300 225 s svstparameter0; |
||||
#X obj 277 75 vsl 50 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 |
||||
-1 -1 0 1; |
||||
#X msg 277 42 set \$1; |
||||
#X text 355 117 range is 0..1; |
||||
#X connect 0 0 7 0; |
||||
#X connect 0 1 6 0; |
||||
#X connect 1 0 2 0; |
||||
#X connect 4 0 5 0; |
||||
#X connect 5 0 6 1; |
||||
#X connect 5 0 7 1; |
||||
#X connect 6 0 3 1; |
||||
#X connect 7 0 3 0; |
||||
#X connect 8 0 4 0; |
||||
#X connect 9 0 10 0; |
||||
#X connect 9 0 15 0; |
||||
#X connect 10 0 11 0; |
||||
#X connect 11 0 12 0; |
||||
#X connect 14 0 13 0; |
||||
#X connect 14 0 10 0; |
||||
#X connect 15 0 14 0; |
@ -0,0 +1,49 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, will search in <host_exec_dir>\pdvst\pd\ |
||||
# then in <vst_dir>\.pd\ |
||||
PDPATH = D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Gain.pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdga |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = FALSE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = FALSE |
||||
|
||||
# Display Pd GUI or not |
||||
DEBUG = TRUE |
||||
|
||||
# External libraries (comma delimited list, relative to pdvst/) |
||||
# ***OBSOLETE, use [declare] inside patch instead*** |
||||
#LIB = |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full Blast |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
#another program |
||||
PROGRAM = Muted |
||||
|
||||
PARAMETER0 = 0.0 |
||||
|
||||
#another program |
||||
PROGRAM = -6dB |
||||
|
||||
PARAMETER0 = 0.94 |
@ -0,0 +1,170 @@ |
||||
#N canvas 0 0 346 350 12; |
||||
#X obj 5 5 cnv 15 300 210 empty gui-label empty 20 12 0 14 -233017 |
||||
-66577 0; |
||||
#X floatatom 13 41 5 0 0 1 vstTimeInfo.ppqPos vstTimeInfo.ppqPos - |
||||
, f 5; |
||||
#X floatatom 13 61 5 0 0 1 vstTimeInfo.tempo vstTimeInfo.tempo -, |
||||
f 5; |
||||
#X floatatom 13 81 5 0 0 1 vstTimeInfo.timeSigNumerator vstTimeInfo.timeSigNumerator |
||||
-, f 5; |
||||
#X floatatom 13 101 5 0 0 1 vstTimeInfo.timeSigDenominator vstTimeInfo.timeSigDenominator |
||||
-, f 5; |
||||
#N canvas 325 81 624 438 beep(vstTimeInfo) 0; |
||||
#X obj 84 333 dac~; |
||||
#X obj 158 250 line~; |
||||
#X obj 86 305 *~; |
||||
#X obj 73 279 osc~ 4000; |
||||
#X obj 152 0 r vstTimeInfo.ppqPos; |
||||
#X obj 180 104 int; |
||||
#X obj 201 154 change; |
||||
#X obj 197 187 t b; |
||||
#X obj 176 70 * 4; |
||||
#X obj 56 49 int; |
||||
#X obj 55 127 change; |
||||
#X obj 51 160 t b; |
||||
#X obj 137 36 t f f; |
||||
#X msg 61 194 3600; |
||||
#X msg 111 194 4000; |
||||
#X msg 189 216 0.03 \, 0 100; |
||||
#X connect 1 0 2 1; |
||||
#X connect 2 0 0 0; |
||||
#X connect 2 0 0 1; |
||||
#X connect 3 0 2 0; |
||||
#X connect 4 0 12 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 6 0 7 0; |
||||
#X connect 7 0 15 0; |
||||
#X connect 7 0 14 0; |
||||
#X connect 8 0 5 0; |
||||
#X connect 9 0 10 0; |
||||
#X connect 10 0 11 0; |
||||
#X connect 11 0 13 0; |
||||
#X connect 12 0 9 0; |
||||
#X connect 12 1 8 0; |
||||
#X connect 13 0 3 0; |
||||
#X connect 14 0 3 0; |
||||
#X connect 15 0 1 0; |
||||
#X restore 12 143 pd beep(vstTimeInfo); |
||||
#X text 15 17 those are the vstTimeInfo receivers; |
||||
#X floatatom 13 121 5 0 0 1 vstTimeInfo.flags vstTimeInfo.flags -, |
||||
f 5; |
||||
#N canvas 0 50 450 300 midi_stuff 0; |
||||
#X obj 71 63 notein; |
||||
#X obj 71 114 noteout; |
||||
#X obj 32 90 + 7; |
||||
#X text 45 186 see midi_objects help file; |
||||
#X floatatom 212 113 3 0 0 0 - - -, f 3; |
||||
#X obj 167 61 notein; |
||||
#X obj 167 87 stripnote; |
||||
#X floatatom 167 112 3 0 0 0 - - -, f 3; |
||||
#X text 342 57 MIDI OUT; |
||||
#X text 167 37 MIDI IN; |
||||
#X floatatom 290 112 3 0 0 0 - - -, f 3; |
||||
#X floatatom 260 111 3 0 0 0 - - -, f 3; |
||||
#X obj 260 86 ctlin; |
||||
#N canvas 0 50 484 446 midi 0; |
||||
#X obj 96 65 inlet; |
||||
#X obj 96 262 noteout; |
||||
#X floatatom 96 92 0 0 0 0 - - -; |
||||
#X obj 338 113 loadbang; |
||||
#X obj 96 184 metro; |
||||
#X obj 96 236 makenote; |
||||
#X floatatom 189 166 0 0 0 0 - - -; |
||||
#X obj 96 210 f; |
||||
#X floatatom 145 166 0 0 0 0 - - -; |
||||
#X floatatom 233 166 0 0 0 0 - - -; |
||||
#X floatatom 276 166 0 0 0 0 - - -; |
||||
#X msg 338 148 500; |
||||
#X msg 370 148 60; |
||||
#X msg 399 148 64; |
||||
#X msg 427 148 250; |
||||
#X text 144 145 rate; |
||||
#X text 187 145 pitch; |
||||
#X text 232 145 vel; |
||||
#X text 268 146 length; |
||||
#X obj 230 257 ctlout 1; |
||||
#X floatatom 230 228 0 0 0 0 - - -; |
||||
#X connect 0 0 2 0; |
||||
#X connect 2 0 4 0; |
||||
#X connect 3 0 11 0; |
||||
#X connect 3 0 12 0; |
||||
#X connect 3 0 13 0; |
||||
#X connect 3 0 14 0; |
||||
#X connect 4 0 7 0; |
||||
#X connect 5 0 1 0; |
||||
#X connect 5 1 1 1; |
||||
#X connect 6 0 7 1; |
||||
#X connect 7 0 5 0; |
||||
#X connect 8 0 4 1; |
||||
#X connect 9 0 5 1; |
||||
#X connect 10 0 5 2; |
||||
#X connect 11 0 8 0; |
||||
#X connect 12 0 6 0; |
||||
#X connect 13 0 9 0; |
||||
#X connect 14 0 10 0; |
||||
#X connect 20 0 19 0; |
||||
#X restore 342 107 pd midi; |
||||
#X obj 342 81 tgl 20 0 empty empty empty 20 8 0 8 -262144 -1 -1 0 1 |
||||
; |
||||
#X obj 167 132 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144 |
||||
-1 -1; |
||||
#X obj 260 133 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144 |
||||
-1 -1; |
||||
#X connect 0 0 2 0; |
||||
#X connect 0 0 1 0; |
||||
#X connect 0 1 1 1; |
||||
#X connect 0 2 1 2; |
||||
#X connect 2 0 1 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 5 1 6 1; |
||||
#X connect 6 0 7 0; |
||||
#X connect 6 1 4 0; |
||||
#X connect 7 0 15 0; |
||||
#X connect 11 0 16 0; |
||||
#X connect 12 0 11 0; |
||||
#X connect 12 1 10 0; |
||||
#X connect 14 0 13 0; |
||||
#X restore 11 166 pd midi_stuff; |
||||
#N canvas 0 50 675 489 audio_stuff 0; |
||||
#X obj 104 322 adc~; |
||||
#X obj 104 401 dac~; |
||||
#X msg 47 286 \$1 30; |
||||
#X obj 47 311 line~; |
||||
#X obj 143 371 *~; |
||||
#X obj 104 371 *~; |
||||
#X obj 48 47 r rvstparameter0; |
||||
#X obj 48 229 * 100; |
||||
#X obj 47 253 dbtorms; |
||||
#X msg 79 81 set \$1; |
||||
#X obj 80 189 s svstparameter0; |
||||
#X obj 79 107 s level-rcv; |
||||
#X obj 80 144 r level-snd; |
||||
#X text 192 107 update pd-slider when parameter is changed from host |
||||
; |
||||
#X text 230 168 update host when parameter is changed from pd-slider |
||||
; |
||||
#X text 19 12 audio stuff example; |
||||
#X obj 315 283 loadbang; |
||||
#X msg 315 312 \; pd dsp 1 \;; |
||||
#X obj 222 217 vsl 60 128 0 1 0 0 level-snd level-rcv LEVEL 0 -9 0 |
||||
10 -262144 -1 -1 0 1; |
||||
#X connect 0 0 5 0; |
||||
#X connect 0 1 4 0; |
||||
#X connect 2 0 3 0; |
||||
#X connect 3 0 4 1; |
||||
#X connect 3 0 5 1; |
||||
#X connect 4 0 1 1; |
||||
#X connect 5 0 1 0; |
||||
#X connect 6 0 7 0; |
||||
#X connect 6 0 9 0; |
||||
#X connect 7 0 8 0; |
||||
#X connect 8 0 2 0; |
||||
#X connect 9 0 11 0; |
||||
#X connect 12 0 10 0; |
||||
#X connect 12 0 7 0; |
||||
#X connect 16 0 17 0; |
||||
#X restore 11 188 pd audio_stuff; |
||||
#X text 17 222 Whether you set pdvst as VST or VSTi \, it will always |
||||
receive midi-in and audio-in., f 39; |
||||
#X text 14 271 You can set an external midi device for midiin and midiout |
||||
(but not an external audio device), f 39; |
@ -0,0 +1,52 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, defaults to <host_exec_dir>/pdvst/pd/bin) |
||||
PDPATH = D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Midi.pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdmd |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = TRUE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = FALSE |
||||
|
||||
# Display Pd GUI or not |
||||
# (Hint : choose TRUE if you use some pd-window as custom gui) |
||||
DEBUG = TRUE |
||||
|
||||
# External libraries (comma delimited list, relative to pdvst/) |
||||
#(obsolete, use [declare] object inside pd-patch instead) |
||||
#LIB = |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
# Define another program |
||||
PROGRAM = Att -6db |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0.94 |
||||
|
||||
|
||||
# Define another program |
||||
PROGRAM = Mute |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0. |
@ -0,0 +1 @@ |
||||
for use with 32 bits host |
@ -0,0 +1,166 @@ |
||||
#N canvas 313 -10 860 681 12; |
||||
#X obj 26 400 r rvstplugname; |
||||
#X msg 25 423 \; gui-label label \$1; |
||||
#X obj 37 22 r rvstopengui; |
||||
#X obj 24 86 select 0 1; |
||||
#X obj 22 227 delay 10; |
||||
#X obj 32 486 loadbang; |
||||
#X msg 31 512 1; |
||||
#X msg 68 513 0; |
||||
#N canvas 0 50 746 518 audio_stuff 0; |
||||
#X obj 104 322 adc~; |
||||
#X obj 104 401 dac~; |
||||
#X msg 47 286 \$1 30; |
||||
#X obj 47 311 line~; |
||||
#X obj 143 371 *~; |
||||
#X obj 104 371 *~; |
||||
#X obj 48 47 r rvstparameter0; |
||||
#X obj 48 229 * 100; |
||||
#X obj 47 253 dbtorms; |
||||
#X msg 79 81 set \$1; |
||||
#X obj 80 189 s svstparameter0; |
||||
#X obj 79 107 s level-rcv; |
||||
#X obj 80 144 r level-snd; |
||||
#X text 192 107 update pd-slider when parameter is changed from host |
||||
; |
||||
#X text 230 168 update host when parameter is changed from pd-slider |
||||
; |
||||
#X text 19 12 audio stuff example; |
||||
#X obj 315 283 loadbang; |
||||
#X msg 315 312 \; pd dsp 1 \;; |
||||
#X obj 368 463 tabwrite~ scope; |
||||
#X obj 375 433 metro 120; |
||||
#X obj 366 403 loadbang; |
||||
#X obj 280 413 *~ 5; |
||||
#X obj 280 438 clip~ -1 1; |
||||
#X connect 0 0 5 0; |
||||
#X connect 0 1 4 0; |
||||
#X connect 2 0 3 0; |
||||
#X connect 3 0 4 1; |
||||
#X connect 3 0 5 1; |
||||
#X connect 4 0 1 1; |
||||
#X connect 4 0 21 0; |
||||
#X connect 5 0 1 0; |
||||
#X connect 5 0 21 0; |
||||
#X connect 6 0 7 0; |
||||
#X connect 6 0 9 0; |
||||
#X connect 7 0 8 0; |
||||
#X connect 8 0 2 0; |
||||
#X connect 9 0 11 0; |
||||
#X connect 12 0 10 0; |
||||
#X connect 12 0 7 0; |
||||
#X connect 16 0 17 0; |
||||
#X connect 19 0 18 0; |
||||
#X connect 20 0 19 0; |
||||
#X connect 21 0 22 0; |
||||
#X connect 22 0 18 0; |
||||
#X restore 518 403 pd audio_stuff; |
||||
#X text 67 50 <- the host signals when gui has to be visible; |
||||
#X msg 75 195 vis 1; |
||||
#X obj 62 147 t b b; |
||||
#X text 124 197 display gui window; |
||||
#X text 186 79 0 = hide \, 1 = show; |
||||
#N canvas 0 50 450 300 hidePdConsole 0; |
||||
#X obj 78 48 inlet; |
||||
#X obj 76 149 hcs/sys_gui; |
||||
#X msg 75 117 wm withdraw .pdwindow; |
||||
#X msg 248 114 wm iconify .pdwindow; |
||||
#X obj 79 79 select 1 0; |
||||
#X connect 0 0 4 0; |
||||
#X connect 2 0 1 0; |
||||
#X connect 3 0 1 0; |
||||
#X connect 4 0 2 0; |
||||
#X connect 4 1 3 0; |
||||
#X restore 29 544 pd hidePdConsole; |
||||
#X text 163 545 (needs hcs/sys_gui external); |
||||
#N canvas 0 0 320 154 \$0-gui 0; |
||||
#X obj 5 5 cnv 15 300 190 empty gui-label empty 10 12 0 14 -233017 |
||||
-66577 0; |
||||
#X obj 13 53 vsl 60 128 0 1 0 0 level-snd level-rcv LEVEL 0 -9 0 10 |
||||
-262144 -1 -1 0 1; |
||||
#N canvas 0 50 450 250 (subpatch) 0; |
||||
#X array scope 300 float 1; |
||||
#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; |
||||
#X coords 0 1 299 -1 120 70 1 0 0; |
||||
#X restore 138 57 graph; |
||||
#X obj 136 163 bng 15 250 50 0 \$0-show_parent empty show_parent_window |
||||
17 7 0 10 -262144 -1 -1; |
||||
#X text 101 145 click here to see main patch; |
||||
#X restore 517 361 pd \$0-gui; |
||||
#X obj 21 298 s pd-\$0-gui; |
||||
#X obj 29 653 s pd-Pd_Gain(gui).pd; |
||||
#X msg 29 624 vis 0; |
||||
#X obj 28 601 loadbang; |
||||
#X obj 104 602 r \$0-show_parent; |
||||
#X msg 104 627 vis 1; |
||||
#X obj 40 57 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 |
||||
; |
||||
#X obj 58 113 delay 10; |
||||
#X msg 21 254 vis 0; |
||||
#X msg 206 252 vis 0; |
||||
#X obj 208 229 loadbang; |
||||
#X text 67 255 hide gui window; |
||||
#X obj 597 127 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 0 |
||||
1; |
||||
#X text 618 126 enable embedding (experimental); |
||||
#X text 110 300 (<- rename with the name of your gui window); |
||||
#X text 603 361 <- the actual gui window; |
||||
#N canvas 0 50 645 376 embedding_gui_into_host(experimental) 0; |
||||
#X obj 86 151 inlet; |
||||
#X obj 135 153 inlet; |
||||
#X obj 86 205 spigot; |
||||
#X obj 83 321 s guiName; |
||||
#X text 157 216 <- send to host the title of your gui window; |
||||
#X obj 84 268 f \$0; |
||||
#X msg 83 295 symbol \$1-gui; |
||||
#X obj 84 243 delay 10; |
||||
#X obj 154 180 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 |
||||
1; |
||||
#X text 90 40 In order to embed a puredata (tcl) gui window into host |
||||
\, the patch has to process values received from host (rvstopengui) |
||||
\, and send to it the title of the window to be embedded., f 61; |
||||
#X text 230 244 this may crash the tcl gui and thus puredata....; |
||||
#X msg 501 327 map 0 \, map 1; |
||||
#X connect 0 0 2 0; |
||||
#X connect 1 0 2 1; |
||||
#X connect 1 0 8 0; |
||||
#X connect 2 0 7 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 6 0 3 0; |
||||
#X connect 7 0 5 0; |
||||
#X restore 436 165 pd embedding_gui_into_host(experimental), f 23 |
||||
; |
||||
#X text 9 381 * Receiving plug & instance name from host; |
||||
#X text 14 349 *** OTHER TRICKS ***; |
||||
#X text 10 461 * Hiding pd-console window on startup; |
||||
#X text 13 573 * Hiding main patch (this one!) on startup; |
||||
#X text 545 13 PDVST; |
||||
#X connect 0 0 1 0; |
||||
#X connect 2 0 23 0; |
||||
#X connect 2 0 3 0; |
||||
#X connect 3 0 4 0; |
||||
#X connect 3 1 24 0; |
||||
#X connect 4 0 25 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 6 0 14 0; |
||||
#X connect 7 0 14 0; |
||||
#X connect 10 0 17 0; |
||||
#X connect 11 0 33 0; |
||||
#X connect 11 1 10 0; |
||||
#X connect 19 0 18 0; |
||||
#X connect 20 0 19 0; |
||||
#X connect 21 0 22 0; |
||||
#X connect 22 0 18 0; |
||||
#X connect 24 0 11 0; |
||||
#X connect 25 0 17 0; |
||||
#X connect 26 0 17 0; |
||||
#X connect 27 0 26 0; |
||||
#X connect 29 0 33 1; |
@ -0,0 +1,56 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, defaults to <host_exec_dir>/pdvst/pd/bin) |
||||
# then in <vst_dir>\.pd\ |
||||
#PDPATH =D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Gain-gui.pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdgg |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = FALSE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = TRUE |
||||
|
||||
# Dimensions of this custom GUI (in pixels) |
||||
GUIHEIGHT = 250 |
||||
|
||||
# Warning : with tcl/tk, don't try smaller values than 320 |
||||
GUIWIDTH = 320 |
||||
|
||||
|
||||
# Display Pd GUI or not |
||||
# (Hint : choose TRUE if you use some pd-window as custom gui) |
||||
DEBUG = TRUE |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
# Define another program |
||||
PROGRAM = Att -6db |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0.94 |
||||
|
||||
|
||||
# Define another program |
||||
PROGRAM = Mute |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0. |
@ -0,0 +1,35 @@ |
||||
#N canvas 0 265 595 358 12; |
||||
#X obj 78 87 adc~, f 6; |
||||
#X obj 73 241 loadbang; |
||||
#X msg 73 271 \; pd dsp 1 \;; |
||||
#X obj 77 162 dac~, f 6; |
||||
#X msg 142 52 \$1 30; |
||||
#X obj 142 87 line~; |
||||
#X obj 122 127 *~; |
||||
#X obj 78 127 *~; |
||||
#X obj 142 11 r gain; |
||||
#X obj 242 8 r rvstparameter0; |
||||
#X obj 242 235 * 100; |
||||
#X obj 242 263 dbtorms; |
||||
#X obj 242 290 s gain; |
||||
#X obj 300 225 s svstparameter0; |
||||
#X obj 277 75 vsl 50 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 |
||||
-1 -1 0 1; |
||||
#X msg 277 42 set \$1; |
||||
#X text 355 117 range is 0..1; |
||||
#X connect 0 0 7 0; |
||||
#X connect 0 1 6 0; |
||||
#X connect 1 0 2 0; |
||||
#X connect 4 0 5 0; |
||||
#X connect 5 0 6 1; |
||||
#X connect 5 0 7 1; |
||||
#X connect 6 0 3 1; |
||||
#X connect 7 0 3 0; |
||||
#X connect 8 0 4 0; |
||||
#X connect 9 0 10 0; |
||||
#X connect 9 0 15 0; |
||||
#X connect 10 0 11 0; |
||||
#X connect 11 0 12 0; |
||||
#X connect 14 0 13 0; |
||||
#X connect 14 0 10 0; |
||||
#X connect 15 0 14 0; |
@ -0,0 +1,49 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, will search in <host_exec_dir>\pdvst\pd\ |
||||
# then in <vst_dir>\.pd\ |
||||
#PDPATH = D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Gain-nogui.pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdgn |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = FALSE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = FALSE |
||||
|
||||
# Display Pd GUI or not |
||||
DEBUG = FALSE |
||||
|
||||
# External libraries (comma delimited list, relative to pdvst/) |
||||
# ***OBSOLETE, use [declare] inside patch instead*** |
||||
#LIB = |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full Blast |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
#another program |
||||
PROGRAM = Muted |
||||
|
||||
PARAMETER0 = 0.0 |
||||
|
||||
#another program |
||||
PROGRAM = -6dB |
||||
|
||||
PARAMETER0 = 0.94 |
@ -0,0 +1,35 @@ |
||||
#N canvas 0 265 595 358 12; |
||||
#X obj 78 87 adc~, f 6; |
||||
#X obj 73 241 loadbang; |
||||
#X msg 73 271 \; pd dsp 1 \;; |
||||
#X obj 77 162 dac~, f 6; |
||||
#X msg 142 52 \$1 30; |
||||
#X obj 142 87 line~; |
||||
#X obj 122 127 *~; |
||||
#X obj 78 127 *~; |
||||
#X obj 142 11 r gain; |
||||
#X obj 242 8 r rvstparameter0; |
||||
#X obj 242 235 * 100; |
||||
#X obj 242 263 dbtorms; |
||||
#X obj 242 290 s gain; |
||||
#X obj 300 225 s svstparameter0; |
||||
#X obj 277 75 vsl 50 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 |
||||
-1 -1 0 1; |
||||
#X msg 277 42 set \$1; |
||||
#X text 355 117 range is 0..1; |
||||
#X connect 0 0 7 0; |
||||
#X connect 0 1 6 0; |
||||
#X connect 1 0 2 0; |
||||
#X connect 4 0 5 0; |
||||
#X connect 5 0 6 1; |
||||
#X connect 5 0 7 1; |
||||
#X connect 6 0 3 1; |
||||
#X connect 7 0 3 0; |
||||
#X connect 8 0 4 0; |
||||
#X connect 9 0 10 0; |
||||
#X connect 9 0 15 0; |
||||
#X connect 10 0 11 0; |
||||
#X connect 11 0 12 0; |
||||
#X connect 14 0 13 0; |
||||
#X connect 14 0 10 0; |
||||
#X connect 15 0 14 0; |
@ -0,0 +1,49 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, will search in <host_exec_dir>\pdvst\pd\ |
||||
# then in <vst_dir>\.pd\ |
||||
#PDPATH = D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Gain.pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdga |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = FALSE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = FALSE |
||||
|
||||
# Display Pd GUI or not |
||||
DEBUG = TRUE |
||||
|
||||
# External libraries (comma delimited list, relative to pdvst/) |
||||
# ***OBSOLETE, use [declare] inside patch instead*** |
||||
#LIB = |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full Blast |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
#another program |
||||
PROGRAM = Muted |
||||
|
||||
PARAMETER0 = 0.0 |
||||
|
||||
#another program |
||||
PROGRAM = -6dB |
||||
|
||||
PARAMETER0 = 0.94 |
@ -0,0 +1,170 @@ |
||||
#N canvas 0 0 346 350 12; |
||||
#X obj 5 5 cnv 15 300 210 empty gui-label empty 20 12 0 14 -233017 |
||||
-66577 0; |
||||
#X floatatom 13 41 5 0 0 1 vstTimeInfo.ppqPos vstTimeInfo.ppqPos - |
||||
, f 5; |
||||
#X floatatom 13 61 5 0 0 1 vstTimeInfo.tempo vstTimeInfo.tempo -, |
||||
f 5; |
||||
#X floatatom 13 81 5 0 0 1 vstTimeInfo.timeSigNumerator vstTimeInfo.timeSigNumerator |
||||
-, f 5; |
||||
#X floatatom 13 101 5 0 0 1 vstTimeInfo.timeSigDenominator vstTimeInfo.timeSigDenominator |
||||
-, f 5; |
||||
#N canvas 325 81 624 438 beep(vstTimeInfo) 0; |
||||
#X obj 84 333 dac~; |
||||
#X obj 158 250 line~; |
||||
#X obj 86 305 *~; |
||||
#X obj 73 279 osc~ 4000; |
||||
#X obj 152 0 r vstTimeInfo.ppqPos; |
||||
#X obj 180 104 int; |
||||
#X obj 201 154 change; |
||||
#X obj 197 187 t b; |
||||
#X obj 176 70 * 4; |
||||
#X obj 56 49 int; |
||||
#X obj 55 127 change; |
||||
#X obj 51 160 t b; |
||||
#X obj 137 36 t f f; |
||||
#X msg 61 194 3600; |
||||
#X msg 111 194 4000; |
||||
#X msg 189 216 0.03 \, 0 100; |
||||
#X connect 1 0 2 1; |
||||
#X connect 2 0 0 0; |
||||
#X connect 2 0 0 1; |
||||
#X connect 3 0 2 0; |
||||
#X connect 4 0 12 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 6 0 7 0; |
||||
#X connect 7 0 15 0; |
||||
#X connect 7 0 14 0; |
||||
#X connect 8 0 5 0; |
||||
#X connect 9 0 10 0; |
||||
#X connect 10 0 11 0; |
||||
#X connect 11 0 13 0; |
||||
#X connect 12 0 9 0; |
||||
#X connect 12 1 8 0; |
||||
#X connect 13 0 3 0; |
||||
#X connect 14 0 3 0; |
||||
#X connect 15 0 1 0; |
||||
#X restore 12 143 pd beep(vstTimeInfo); |
||||
#X text 15 17 those are the vstTimeInfo receivers; |
||||
#X floatatom 13 121 5 0 0 1 vstTimeInfo.flags vstTimeInfo.flags -, |
||||
f 5; |
||||
#N canvas 0 50 450 300 midi_stuff 0; |
||||
#X obj 71 63 notein; |
||||
#X obj 71 114 noteout; |
||||
#X obj 32 90 + 7; |
||||
#X text 45 186 see midi_objects help file; |
||||
#X floatatom 212 113 3 0 0 0 - - -, f 3; |
||||
#X obj 167 61 notein; |
||||
#X obj 167 87 stripnote; |
||||
#X floatatom 167 112 3 0 0 0 - - -, f 3; |
||||
#X text 342 57 MIDI OUT; |
||||
#X text 167 37 MIDI IN; |
||||
#X floatatom 290 112 3 0 0 0 - - -, f 3; |
||||
#X floatatom 260 111 3 0 0 0 - - -, f 3; |
||||
#X obj 260 86 ctlin; |
||||
#N canvas 0 50 484 446 midi 0; |
||||
#X obj 96 65 inlet; |
||||
#X obj 96 262 noteout; |
||||
#X floatatom 96 92 0 0 0 0 - - -; |
||||
#X obj 338 113 loadbang; |
||||
#X obj 96 184 metro; |
||||
#X obj 96 236 makenote; |
||||
#X floatatom 189 166 0 0 0 0 - - -; |
||||
#X obj 96 210 f; |
||||
#X floatatom 145 166 0 0 0 0 - - -; |
||||
#X floatatom 233 166 0 0 0 0 - - -; |
||||
#X floatatom 276 166 0 0 0 0 - - -; |
||||
#X msg 338 148 500; |
||||
#X msg 370 148 60; |
||||
#X msg 399 148 64; |
||||
#X msg 427 148 250; |
||||
#X text 144 145 rate; |
||||
#X text 187 145 pitch; |
||||
#X text 232 145 vel; |
||||
#X text 268 146 length; |
||||
#X obj 230 257 ctlout 1; |
||||
#X floatatom 230 228 0 0 0 0 - - -; |
||||
#X connect 0 0 2 0; |
||||
#X connect 2 0 4 0; |
||||
#X connect 3 0 11 0; |
||||
#X connect 3 0 12 0; |
||||
#X connect 3 0 13 0; |
||||
#X connect 3 0 14 0; |
||||
#X connect 4 0 7 0; |
||||
#X connect 5 0 1 0; |
||||
#X connect 5 1 1 1; |
||||
#X connect 6 0 7 1; |
||||
#X connect 7 0 5 0; |
||||
#X connect 8 0 4 1; |
||||
#X connect 9 0 5 1; |
||||
#X connect 10 0 5 2; |
||||
#X connect 11 0 8 0; |
||||
#X connect 12 0 6 0; |
||||
#X connect 13 0 9 0; |
||||
#X connect 14 0 10 0; |
||||
#X connect 20 0 19 0; |
||||
#X restore 342 107 pd midi; |
||||
#X obj 342 81 tgl 20 0 empty empty empty 20 8 0 8 -262144 -1 -1 0 1 |
||||
; |
||||
#X obj 167 132 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144 |
||||
-1 -1; |
||||
#X obj 260 133 bng 20 250 50 0 empty empty empty 17 7 0 10 -262144 |
||||
-1 -1; |
||||
#X connect 0 0 2 0; |
||||
#X connect 0 0 1 0; |
||||
#X connect 0 1 1 1; |
||||
#X connect 0 2 1 2; |
||||
#X connect 2 0 1 0; |
||||
#X connect 5 0 6 0; |
||||
#X connect 5 1 6 1; |
||||
#X connect 6 0 7 0; |
||||
#X connect 6 1 4 0; |
||||
#X connect 7 0 15 0; |
||||
#X connect 11 0 16 0; |
||||
#X connect 12 0 11 0; |
||||
#X connect 12 1 10 0; |
||||
#X connect 14 0 13 0; |
||||
#X restore 11 166 pd midi_stuff; |
||||
#N canvas 0 50 675 489 audio_stuff 0; |
||||
#X obj 104 322 adc~; |
||||
#X obj 104 401 dac~; |
||||
#X msg 47 286 \$1 30; |
||||
#X obj 47 311 line~; |
||||
#X obj 143 371 *~; |
||||
#X obj 104 371 *~; |
||||
#X obj 48 47 r rvstparameter0; |
||||
#X obj 48 229 * 100; |
||||
#X obj 47 253 dbtorms; |
||||
#X msg 79 81 set \$1; |
||||
#X obj 80 189 s svstparameter0; |
||||
#X obj 79 107 s level-rcv; |
||||
#X obj 80 144 r level-snd; |
||||
#X text 192 107 update pd-slider when parameter is changed from host |
||||
; |
||||
#X text 230 168 update host when parameter is changed from pd-slider |
||||
; |
||||
#X text 19 12 audio stuff example; |
||||
#X obj 315 283 loadbang; |
||||
#X msg 315 312 \; pd dsp 1 \;; |
||||
#X obj 222 217 vsl 60 128 0 1 0 0 level-snd level-rcv LEVEL 0 -9 0 |
||||
10 -262144 -1 -1 0 1; |
||||
#X connect 0 0 5 0; |
||||
#X connect 0 1 4 0; |
||||
#X connect 2 0 3 0; |
||||
#X connect 3 0 4 1; |
||||
#X connect 3 0 5 1; |
||||
#X connect 4 0 1 1; |
||||
#X connect 5 0 1 0; |
||||
#X connect 6 0 7 0; |
||||
#X connect 6 0 9 0; |
||||
#X connect 7 0 8 0; |
||||
#X connect 8 0 2 0; |
||||
#X connect 9 0 11 0; |
||||
#X connect 12 0 10 0; |
||||
#X connect 12 0 7 0; |
||||
#X connect 16 0 17 0; |
||||
#X restore 11 188 pd audio_stuff; |
||||
#X text 17 222 Whether you set pdvst as VST or VSTi \, it will always |
||||
receive midi-in and audio-in., f 39; |
||||
#X text 14 271 You can set an external midi device for midiin and midiout |
||||
(but not an external audio device), f 39; |
@ -0,0 +1,53 @@ |
||||
# Number of audio input and output channels |
||||
CHANNELS = 2 |
||||
|
||||
# installation directory of puredata (optional) |
||||
# If non specified, defaults to <host_exec_dir>/pdvst/pd/bin) |
||||
# then in <vst_dir>\.pd\ |
||||
#PDPATH = D:\Programs\pd-0.48-1-test\ |
||||
|
||||
# Main Pd patch of the plugin |
||||
MAIN = Pd_Midi.pd |
||||
|
||||
# Unique four character VST plugin ID |
||||
ID = pdmd |
||||
|
||||
# Whether this is a VSTi |
||||
SYNTH = TRUE |
||||
|
||||
# Whether there is a custom GUI (e.g. GrIPD) |
||||
CUSTOMGUI = FALSE |
||||
|
||||
# Display Pd GUI or not |
||||
# (Hint : choose TRUE if you use some pd-window as custom gui) |
||||
DEBUG = TRUE |
||||
|
||||
# External libraries (comma delimited list, relative to pdvst/) |
||||
#(obsolete, use [declare] object inside pd-patch instead) |
||||
#LIB = |
||||
|
||||
# Number of VST parameters (up to 128) |
||||
PARAMETERS = 1 |
||||
|
||||
# Name of first VST parameter |
||||
# used when CUSTOMGUI is false or VST host doesn't support custom editors |
||||
NAMEPARAMETER0 = Level |
||||
|
||||
# Define a program (up to 128) |
||||
PROGRAM = Full |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 1.0 |
||||
|
||||
# Define another program |
||||
PROGRAM = Att -6db |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0.94 |
||||
|
||||
|
||||
# Define another program |
||||
PROGRAM = Mute |
||||
|
||||
# Set first parameter value for this program |
||||
PARAMETER0 = 0. |
@ -0,0 +1 @@ |
||||
for use with 64 bits host |
@ -0,0 +1,20 @@ |
||||
# Compile with MinGW.
|
||||
# You can call this makefile with:
|
||||
# make PDDIR=<path/to/pd>
|
||||
# or you can specify it below:
|
||||
|
||||
PDDIR=
|
||||
|
||||
WINARCH := $(shell $(CC) -dumpmachine)
|
||||
|
||||
ifeq (i686% , $(WINARCH)) |
||||
arch = 32
|
||||
else |
||||
arch = 64
|
||||
endif |
||||
|
||||
ALL: vstschedlib.c |
||||
gcc -Wall -I$(PDDIR)src -I../vst-template vstschedlib.c -static-libgcc \
|
||||
-shared -L$(PDDIR)bin -l:pd.dll -o vstschedlib.dll
|
||||
strip vstschedlib.dll
|
||||
cp vstschedlib.dll ../build/pd-scheduler$(arch)/vstschedlib.dll
|
@ -0,0 +1,730 @@ |
||||
/* PdVst v0.0.2 - VST - Pd bridging plugin
|
||||
** Copyright (C) 2004 Joseph A. Sarlo |
||||
** |
||||
** This program is free software; you can redistribute it and/orsig |
||||
** modify it under the terms of the GNU General Public License |
||||
** as published by the Free Software Foundation; either version 2 |
||||
** of the License, or (at your option) any later version. |
||||
** |
||||
** This program is distributed in the hope that it will be useful, |
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
** GNU General Public License for more details. |
||||
** |
||||
** You should have received a copy of the GNU General Public License |
||||
** along with this program; if not, write to the Free Software |
||||
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
** |
||||
** jsarlo@ucsd.edu |
||||
*/ |
||||
|
||||
#define _WIN32_WINDOWS 0x410 |
||||
#include <windows.h> |
||||
#include <io.h> |
||||
#include <stdio.h> |
||||
#include "m_pd.h" |
||||
#include "s_stuff.h" |
||||
#include "pdvstTransfer.h" |
||||
#define MAXARGS 1024 |
||||
#define MAXSTRLEN 1024 |
||||
#define TIMEUNITPERSEC (32.*441000.) |
||||
|
||||
#define kVstTransportChanged 1 |
||||
#define kVstTransportPlaying 2 |
||||
|
||||
#define kVstTransportRecording 8 |
||||
#ifdef VSTMIDIOUTENABLE |
||||
EXTERN int midi_outhead; |
||||
int _midi_outtail=0; // _midi_outtail defined locally
|
||||
typedef struct _midiqelem |
||||
{ |
||||
double q_time; |
||||
int q_portno; |
||||
unsigned char q_onebyte; |
||||
unsigned char q_byte1; |
||||
unsigned char q_byte2; |
||||
unsigned char q_byte3; |
||||
} t_midiqelem; |
||||
|
||||
#ifndef MIDIQSIZE |
||||
#define MIDIQSIZE 1024 |
||||
#endif /*MIDIQSIZE */ |
||||
|
||||
EXTERN t_midiqelem midi_outqueue[MIDIQSIZE]; |
||||
//EXTERN int msw_nmidiout;
|
||||
int msw_nmidiout=0; |
||||
|
||||
#endif // VSTMIDIOUTENABLE
|
||||
|
||||
|
||||
typedef struct _vstParameterReceiver |
||||
{ |
||||
t_object x_obj; |
||||
t_symbol *x_sym; |
||||
}t_vstParameterReceiver; |
||||
|
||||
typedef struct _vstGuiNameReceiver |
||||
{ |
||||
t_object x_obj; |
||||
}t_vstGuiNameReceiver; |
||||
|
||||
t_vstGuiNameReceiver *vstGuiNameReceiver; |
||||
|
||||
t_vstParameterReceiver *vstParameterReceivers[MAXPARAMETERS]; |
||||
|
||||
t_class *vstParameterReceiver_class; |
||||
t_class *vstGuiNameReceiver_class; |
||||
|
||||
char *pdvstTransferMutexName, |
||||
*pdvstTransferFileMapName, |
||||
*vstProcEventName, |
||||
*pdProcEventName; |
||||
pdvstTransferData *pdvstData; |
||||
HANDLE vstHostProcess, |
||||
pdvstTransferMutex, |
||||
pdvstTransferFileMap, |
||||
vstProcEvent, |
||||
pdProcEvent; |
||||
pdvstTimeInfo timeInfo; |
||||
|
||||
int tokenizeCommandLineString(char *clString, char **tokens) |
||||
{ |
||||
int i, charCount = 0; |
||||
int tokCount= 0; |
||||
int quoteOpen = 0; |
||||
|
||||
for (i = 0; i < (signed int)strlen(clString); i++) |
||||
{ |
||||
if (clString[i] == '"') |
||||
{ |
||||
quoteOpen = !quoteOpen; |
||||
} |
||||
else if (clString[i] == ' ' && !quoteOpen) |
||||
{ |
||||
tokens[tokCount][charCount] = 0; |
||||
tokCount++; |
||||
charCount = 0; |
||||
} |
||||
else |
||||
{ |
||||
tokens[tokCount][charCount] = clString[i]; |
||||
charCount++; |
||||
} |
||||
} |
||||
tokens[tokCount][charCount] = 0; |
||||
tokCount++; |
||||
return tokCount; |
||||
} |
||||
|
||||
void parseArgs(int argc, char **argv) |
||||
{ |
||||
int vstHostProcessId; |
||||
|
||||
while ((argc > 0) && (**argv == '-')) |
||||
{ |
||||
if (strcmp(*argv, "-vsthostid") == 0) |
||||
{ |
||||
vstHostProcessId = atoi(argv[1]); |
||||
vstHostProcess = OpenProcess(PROCESS_ALL_ACCESS, |
||||
FALSE, |
||||
vstHostProcessId); |
||||
if (vstHostProcess == NULL) |
||||
{ |
||||
exit(1); |
||||
} |
||||
argc -= 2; |
||||
argv += 2; |
||||
} |
||||
if (strcmp(*argv, "-mutexname") == 0) |
||||
{ |
||||
pdvstTransferMutexName = argv[1]; |
||||
argc -= 2; |
||||
argv += 2; |
||||
} |
||||
if (strcmp(*argv, "-filemapname") == 0) |
||||
{ |
||||
pdvstTransferFileMapName = argv[1]; |
||||
argc -= 2; |
||||
argv += 2; |
||||
} |
||||
if (strcmp(*argv, "-vstproceventname") == 0) |
||||
{ |
||||
vstProcEventName = argv[1]; |
||||
argc -= 2; |
||||
argv += 2; |
||||
} |
||||
if (strcmp(*argv, "-pdproceventname") == 0) |
||||
{ |
||||
pdProcEventName = argv[1]; |
||||
argc -= 2; |
||||
argv += 2; |
||||
} |
||||
else |
||||
{ |
||||
argc--; |
||||
argv++; |
||||
} |
||||
} |
||||
} |
||||
|
||||
int setPdvstGuiState(int state) |
||||
{ |
||||
t_symbol *tempSym; |
||||
|
||||
tempSym = gensym("rvstopengui"); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_float(tempSym->s_thing, (float)state); |
||||
return 1; |
||||
} |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
int setPdvstPlugName(char* instanceName) |
||||
{ |
||||
t_symbol *tempSym; |
||||
tempSym = gensym("rvstplugname"); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_symbol(tempSym->s_thing, gensym(instanceName)); |
||||
return 1; |
||||
} |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
int setPdvstFloatParameter(int index, float value) |
||||
{ |
||||
t_symbol *tempSym; |
||||
char string[1024]; |
||||
|
||||
sprintf(string, "rvstparameter%d", index); |
||||
tempSym = gensym(string); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_float(tempSym->s_thing, value); |
||||
return 1; |
||||
} |
||||
else |
||||
{ |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
void sendPdVstFloatParameter(t_vstParameterReceiver *x, t_float floatValue) |
||||
{ |
||||
int index; |
||||
|
||||
index = atoi(x->x_sym->s_name + strlen("svstParameter")); |
||||
WaitForSingleObject(pdvstTransferMutex, INFINITE); |
||||
pdvstData->vstParameters[index].type = FLOAT_TYPE; |
||||
pdvstData->vstParameters[index].direction = PD_SEND; |
||||
pdvstData->vstParameters[index].updated = 1; |
||||
pdvstData->vstParameters[index].value.floatData = floatValue; |
||||
ReleaseMutex(pdvstTransferMutex); |
||||
} |
||||
|
||||
void sendPdVstGuiName(t_vstGuiNameReceiver *x, t_symbol *symbolValue) |
||||
{ |
||||
WaitForSingleObject(pdvstTransferMutex, INFINITE); |
||||
pdvstData->guiName.type = STRING_TYPE; |
||||
pdvstData->guiName.direction = PD_SEND; |
||||
pdvstData->guiName.updated = 1; |
||||
strcpy(pdvstData->guiName.value.stringData,symbolValue->s_name); |
||||
|
||||
ReleaseMutex(pdvstTransferMutex); |
||||
|
||||
} |
||||
|
||||
void makePdvstParameterReceivers() |
||||
{ |
||||
int i; |
||||
char string[1024]; |
||||
|
||||
for (i = 0; i < MAXPARAMETERS; i++) |
||||
{ |
||||
vstParameterReceivers[i] = (t_vstParameterReceiver *)pd_new(vstParameterReceiver_class); |
||||
sprintf(string, "svstparameter%d", i); |
||||
vstParameterReceivers[i]->x_sym = gensym(string); |
||||
pd_bind(&vstParameterReceivers[i]->x_obj.ob_pd, gensym(string)); |
||||
} |
||||
} |
||||
|
||||
void makePdvstGuiNameReceiver() |
||||
{ |
||||
vstGuiNameReceiver = (t_vstGuiNameReceiver *)pd_new(vstGuiNameReceiver_class); |
||||
pd_bind(&vstGuiNameReceiver->x_obj.ob_pd, gensym("guiName")); |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
void send_dacs(void) |
||||
{ |
||||
int i, j, sampleCount, nChannels, blockSize; |
||||
t_sample *soundin, *soundout; |
||||
|
||||
soundin = get_sys_soundin(); |
||||
soundout = get_sys_soundout(); |
||||
nChannels = pdvstData->nChannels; |
||||
blockSize = pdvstData->blockSize; |
||||
if (blockSize == *(get_sys_schedblocksize())) |
||||
{ |
||||
sampleCount = 0; |
||||
for (i = 0; i < nChannels; i++) |
||||
{ |
||||
for (j = 0; j < blockSize; j++) |
||||
{ |
||||
soundin[sampleCount] = pdvstData->samples[i][j]; |
||||
pdvstData->samples[i][j] = soundout[sampleCount]; |
||||
soundout[sampleCount] = 0; |
||||
sampleCount++; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
void scheduler_tick( void) |
||||
{ |
||||
//l sys_addhist(0);
|
||||
send_dacs(); |
||||
//l sys_setmiditimediff(0, 1e-6 * *(get_sys_schedadvance()));
|
||||
//l sys_addhist(1);
|
||||
/// { JYG
|
||||
//sched_tick(*(get_sys_time()) + *(get_sys_time_per_dsp_tick()));
|
||||
sched_tick(); |
||||
/// JYG }
|
||||
//l sys_addhist(2);
|
||||
sys_pollmidiqueue(); |
||||
sys_pollgui(); |
||||
//l sys_addhist(3);
|
||||
} |
||||
/*
|
||||
int HFClock() |
||||
{ |
||||
LARGE_INTEGER freq, now; |
||||
|
||||
QueryPerformanceFrequency(&freq); |
||||
QueryPerformanceCounter(&now); |
||||
return (int)((now.QuadPart * 1000) / freq.QuadPart); |
||||
} |
||||
*/ |
||||
|
||||
int scheduler() |
||||
{ |
||||
int i, |
||||
blockTime, |
||||
|
||||
active = 1; |
||||
DWORD vstHostProcessStatus = 0; |
||||
|
||||
|
||||
vstParameterReceiver_class = class_new(gensym("vstParameterReceiver"), |
||||
0, |
||||
0, |
||||
sizeof(t_vstParameterReceiver), |
||||
0, |
||||
0); |
||||
|
||||
class_addfloat(vstParameterReceiver_class, (t_method)sendPdVstFloatParameter); |
||||
makePdvstParameterReceivers(); |
||||
|
||||
vstGuiNameReceiver_class = class_new(gensym("vstGuiNameReceiver"), |
||||
0, |
||||
0, |
||||
sizeof(t_vstGuiNameReceiver), |
||||
0, |
||||
0); |
||||
|
||||
class_addsymbol(vstGuiNameReceiver_class,(t_method)sendPdVstGuiName); |
||||
makePdvstGuiNameReceiver(); |
||||
|
||||
*(get_sys_time_per_dsp_tick()) = (TIMEUNITPERSEC) * \
|
||||
((double)*(get_sys_schedblocksize())) / \
|
||||
*(get_sys_dacsr()); |
||||
//l sys_clearhist();
|
||||
//if (*(get_sys_sleepgrain()) < 1000) // JYG
|
||||
if (*(get_sys_sleepgrain()) < 100) |
||||
{ |
||||
*(get_sys_sleepgrain()) = *(get_sys_schedadvance()) / 4; |
||||
} |
||||
if (*(get_sys_sleepgrain()) < 100) |
||||
{ |
||||
*(get_sys_sleepgrain()) = 100; |
||||
} |
||||
else if (*(get_sys_sleepgrain()) > 5000) |
||||
{ |
||||
*(get_sys_sleepgrain()) = 5000; |
||||
} |
||||
sys_initmidiqueue(); |
||||
|
||||
#ifdef VSTMIDIOUTENABLE |
||||
pdvstData->midiOutQueueSize=0; |
||||
#endif // VSTMIDIOUTENABLE
|
||||
while (active) |
||||
{ |
||||
WaitForSingleObject(pdvstTransferMutex, INFINITE); |
||||
active = pdvstData->active; |
||||
// check sample rate
|
||||
if (pdvstData->sampleRate != (int)sys_getsr()) |
||||
{ |
||||
post("check samplerate"); |
||||
sys_setchsr(pdvstData->nChannels, |
||||
pdvstData->nChannels, |
||||
pdvstData->sampleRate); |
||||
} |
||||
// check for vstParameter changed
|
||||
if (pdvstData->guiState.direction == PD_RECEIVE && \
|
||||
pdvstData->guiState.updated) |
||||
{ |
||||
if(setPdvstGuiState((int)pdvstData->guiState.value.floatData)) |
||||
pdvstData->guiState.updated=0; |
||||
} |
||||
// JYG { check for vstplug instance name
|
||||
if (pdvstData->plugName.direction == PD_RECEIVE && \
|
||||
pdvstData->plugName.updated) |
||||
{ |
||||
if (setPdvstPlugName((char*)pdvstData->plugName.value.stringData)) |
||||
pdvstData->plugName.updated=0; |
||||
} |
||||
|
||||
if (pdvstData->hostTimeInfo.updated) |
||||
{ |
||||
pdvstData->hostTimeInfo.updated=0; |
||||
t_symbol *tempSym; |
||||
|
||||
if (timeInfo.flags!=pdvstData->hostTimeInfo.flags) |
||||
{ |
||||
timeInfo.flags=pdvstData->hostTimeInfo.flags; |
||||
|
||||
tempSym = gensym("vstTimeInfo.flags"); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_float(tempSym->s_thing, (float)timeInfo.flags); |
||||
} |
||||
else |
||||
{ |
||||
timeInfo.flags=0; |
||||
pdvstData->hostTimeInfo.updated=1; // keep flag as updated
|
||||
} |
||||
|
||||
} |
||||
|
||||
if ((timeInfo.flags&(kVstTransportChanged|kVstTransportPlaying|kVstTransportRecording))||(timeInfo.ppqPos!=(float)pdvstData->hostTimeInfo.ppqPos)) |
||||
{ |
||||
timeInfo.ppqPos=(float)pdvstData->hostTimeInfo.ppqPos; |
||||
|
||||
tempSym = gensym("vstTimeInfo.ppqPos"); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_float(tempSym->s_thing, timeInfo.ppqPos); |
||||
} |
||||
else |
||||
{ |
||||
timeInfo.ppqPos=0.; |
||||
pdvstData->hostTimeInfo.updated=1; // keep flag as updated
|
||||
} |
||||
} |
||||
if ((timeInfo.flags&kVstTransportChanged)|(timeInfo.tempo!=(float)pdvstData->hostTimeInfo.tempo)) |
||||
{ |
||||
timeInfo.tempo=(float)pdvstData->hostTimeInfo.tempo; |
||||
|
||||
tempSym = gensym("vstTimeInfo.tempo"); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_float(tempSym->s_thing, timeInfo.tempo); |
||||
} |
||||
else |
||||
{ |
||||
timeInfo.tempo=0.; |
||||
pdvstData->hostTimeInfo.updated=1; // keep flag as updated
|
||||
} |
||||
} |
||||
|
||||
if ((timeInfo.flags&kVstTransportChanged)|timeInfo.timeSigNumerator!=pdvstData->hostTimeInfo.timeSigNumerator) |
||||
{ |
||||
timeInfo.timeSigNumerator=pdvstData->hostTimeInfo.timeSigNumerator; |
||||
|
||||
tempSym = gensym("vstTimeInfo.timeSigNumerator"); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_float(tempSym->s_thing, (float)timeInfo.timeSigNumerator); |
||||
} |
||||
else |
||||
{ |
||||
timeInfo.timeSigNumerator=0; |
||||
pdvstData->hostTimeInfo.updated=1; // keep flag as updated
|
||||
} |
||||
} |
||||
if ((timeInfo.flags&kVstTransportChanged)| timeInfo.timeSigDenominator!=pdvstData->hostTimeInfo.timeSigDenominator) |
||||
{ |
||||
timeInfo.timeSigDenominator=pdvstData->hostTimeInfo.timeSigDenominator; |
||||
|
||||
tempSym = gensym("vstTimeInfo.timeSigDenominator"); |
||||
if (tempSym->s_thing) |
||||
{ |
||||
pd_float(tempSym->s_thing, (float)timeInfo.timeSigDenominator); |
||||
} |
||||
else |
||||
{ |
||||
timeInfo.timeSigDenominator=0; |
||||
pdvstData->hostTimeInfo.updated=1; // keep flag as updated
|
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
// JYG }
|
||||
for (i = 0; i < pdvstData->nParameters; i++) |
||||
{ |
||||
if (pdvstData->vstParameters[i].direction == PD_RECEIVE && \
|
||||
pdvstData->vstParameters[i].updated) |
||||
{ |
||||
if (pdvstData->vstParameters[i].type == FLOAT_TYPE) |
||||
{ |
||||
if (setPdvstFloatParameter(i, |
||||
pdvstData->vstParameters[i].value.floatData)) |
||||
{ |
||||
pdvstData->vstParameters[i].updated = 0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
// check for new midi-in message (VSTi)
|
||||
if (pdvstData->midiQueueUpdated) |
||||
{ |
||||
for (i = 0; i < pdvstData->midiQueueSize; i++) |
||||
{ |
||||
if (pdvstData->midiQueue[i].messageType == NOTE_ON) |
||||
{ |
||||
inmidi_noteon(0, |
||||
pdvstData->midiQueue[i].channelNumber, |
||||
pdvstData->midiQueue[i].dataByte1, |
||||
pdvstData->midiQueue[i].dataByte2); |
||||
} |
||||
else if (pdvstData->midiQueue[i].messageType == NOTE_OFF) |
||||
{ |
||||
inmidi_noteon(0, |
||||
pdvstData->midiQueue[i].channelNumber, |
||||
pdvstData->midiQueue[i].dataByte1, |
||||
0); |
||||
} |
||||
else if (pdvstData->midiQueue[i].messageType == CONTROLLER_CHANGE) |
||||
{ |
||||
inmidi_controlchange(0, |
||||
pdvstData->midiQueue[i].channelNumber, |
||||
pdvstData->midiQueue[i].dataByte1, |
||||
pdvstData->midiQueue[i].dataByte2); |
||||
} |
||||
else if (pdvstData->midiQueue[i].messageType == PROGRAM_CHANGE) |
||||
{ |
||||
inmidi_programchange(0, |
||||
pdvstData->midiQueue[i].channelNumber, |
||||
pdvstData->midiQueue[i].dataByte1); |
||||
} |
||||
else if (pdvstData->midiQueue[i].messageType == PITCH_BEND) |
||||
{ |
||||
int value = (((int)pdvstData->midiQueue[i].dataByte2) * 16) + \
|
||||
(int)pdvstData->midiQueue[i].dataByte1; |
||||
|
||||
inmidi_pitchbend(0, |
||||
pdvstData->midiQueue[i].channelNumber, |
||||
value); |
||||
} |
||||
else if (pdvstData->midiQueue[i].messageType == CHANNEL_PRESSURE) |
||||
{ |
||||
inmidi_aftertouch(0, |
||||
pdvstData->midiQueue[i].channelNumber, |
||||
pdvstData->midiQueue[i].dataByte1); |
||||
} |
||||
else if (pdvstData->midiQueue[i].messageType == KEY_PRESSURE) |
||||
{ |
||||
inmidi_polyaftertouch(0, |
||||
pdvstData->midiQueue[i].channelNumber, |
||||
pdvstData->midiQueue[i].dataByte1, |
||||
pdvstData->midiQueue[i].dataByte2); |
||||
} |
||||
else if (pdvstData->midiQueue[i].messageType == OTHER) |
||||
{ |
||||
// FIXME: what to do?
|
||||
} |
||||
else |
||||
{ |
||||
post("pdvstData->midiQueue error"); // FIXME: error?
|
||||
} |
||||
} |
||||
pdvstData->midiQueueSize = 0; |
||||
pdvstData->midiQueueUpdated = 0; |
||||
} |
||||
|
||||
/// flush vstmidi out messages here
|
||||
#ifdef VSTMIDIOUTENABLE |
||||
if (msw_nmidiout==0) |
||||
{ |
||||
int i=pdvstData->midiOutQueueSize; // si la midiOutQueue n'a pas été vidée, rajouter des éléments à la fin de celle-ci
|
||||
while (midi_outhead != _midi_outtail) |
||||
{ |
||||
int statusType = midi_outqueue[_midi_outtail].q_byte1 & 0xF0; |
||||
int statusChannel = midi_outqueue[_midi_outtail].q_byte1 & 0x0F; |
||||
|
||||
// faut il gérer midi_outqueue[_midi_outtail].q_onebyte ?
|
||||
|
||||
///copie de la pile midi_outqueue dans la pile vst midiOutQueue
|
||||
pdvstData->midiOutQueue[i].channelNumber= statusChannel; |
||||
pdvstData->midiOutQueue[i].statusByte = midi_outqueue[_midi_outtail].q_byte1; |
||||
pdvstData->midiOutQueue[i].dataByte1= midi_outqueue[_midi_outtail].q_byte2; |
||||
pdvstData->midiOutQueue[i].dataByte2= midi_outqueue[_midi_outtail].q_byte3; |
||||
|
||||
if (statusType == 0x90) |
||||
if (midi_outqueue[_midi_outtail].q_byte3==0) |
||||
// note off
|
||||
{ |
||||
pdvstData->midiOutQueue[i].messageType = NOTE_OFF; |
||||
pdvstData->midiOutQueue[i].statusByte = statusChannel|0x80; |
||||
// post("note_off[%d] : %d",i,midi_outqueue[_midi_outtail].q_byte2);
|
||||
|
||||
} |
||||
|
||||
else |
||||
{ |
||||
// note on
|
||||
pdvstData->midiOutQueue[i].messageType = NOTE_ON; |
||||
//post("note_on[%d] : %d",i,midi_outqueue[_midi_outtail].q_byte2);
|
||||
|
||||
} |
||||
else if (statusType == 0xA0) |
||||
// key pressure
|
||||
pdvstData->midiOutQueue[i].messageType = KEY_PRESSURE; |
||||
else if (statusType == 0xB0) |
||||
// controller change
|
||||
pdvstData->midiOutQueue[i].messageType = CONTROLLER_CHANGE; |
||||
else if (statusType == 0xC0) |
||||
// program change
|
||||
pdvstData->midiOutQueue[i].messageType = PROGRAM_CHANGE; |
||||
else if (statusType == 0xD0) |
||||
// channel pressure
|
||||
pdvstData->midiOutQueue[i].messageType = CHANNEL_PRESSURE; |
||||
else if (statusType == 0xE0) |
||||
// pitch bend
|
||||
pdvstData->midiOutQueue[i].messageType = PITCH_BEND; |
||||
else |
||||
// something else
|
||||
pdvstData->midiOutQueue[i].messageType = OTHER; |
||||
|
||||
|
||||
_midi_outtail = (_midi_outtail + 1 == MIDIQSIZE ? 0 : _midi_outtail + 1); |
||||
i = i + 1; |
||||
if (i>= MAXMIDIOUTQUEUESIZE) |
||||
break; |
||||
|
||||
} |
||||
if (i>0) |
||||
{ |
||||
pdvstData->midiOutQueueSize=i; |
||||
pdvstData->midiOutQueueUpdated=1; |
||||
} |
||||
else |
||||
{ |
||||
pdvstData->midiOutQueueSize=0; |
||||
pdvstData->midiOutQueueUpdated=0; |
||||
} |
||||
} |
||||
#endif // VSTMIDIOUTENABLE
|
||||
|
||||
// run at approx. real-time
|
||||
blockTime = (int)((float)(pdvstData->blockSize) / \
|
||||
(float)pdvstData->sampleRate * 1000.0); |
||||
if (blockTime < 1) |
||||
{ |
||||
blockTime = 1; |
||||
} |
||||
if (pdvstData->syncToVst) |
||||
{ |
||||
ReleaseMutex(pdvstTransferMutex); |
||||
if (WaitForSingleObject(vstProcEvent, 1000) == WAIT_TIMEOUT) |
||||
{ |
||||
// we have probably lost sync by now (1 sec)
|
||||
WaitForSingleObject(pdvstTransferMutex, 100); |
||||
pdvstData->syncToVst = 0; |
||||
ReleaseMutex(pdvstTransferMutex); |
||||
} |
||||
ResetEvent(vstProcEvent); |
||||
scheduler_tick(); |
||||
SetEvent(pdProcEvent); |
||||
} |
||||
else |
||||
{ |
||||
ReleaseMutex(pdvstTransferMutex); |
||||
scheduler_tick(); |
||||
Sleep(blockTime); |
||||
} |
||||
GetExitCodeProcess(vstHostProcess, &vstHostProcessStatus); |
||||
if (vstHostProcessStatus != STILL_ACTIVE) |
||||
{ |
||||
active = 0; |
||||
} |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
int pd_extern_sched(char *flags) |
||||
{ |
||||
int i, argc; |
||||
char *argv[MAXARGS]; |
||||
//l sys_audioapi = API_NONE;
|
||||
|
||||
|
||||
t_audiosettings as; |
||||
|
||||
sys_get_audio_settings(&as); |
||||
as.a_api = API_NONE; |
||||
sys_set_audio_settings(&as); |
||||
|
||||
//
|
||||
for (i = 0; i < MAXARGS; i++) |
||||
{ |
||||
argv[i] = (char *)malloc(MAXSTRLEN * sizeof(char)); |
||||
} |
||||
argc = tokenizeCommandLineString(flags, argv); |
||||
parseArgs(argc, argv); |
||||
pdvstTransferMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, pdvstTransferMutexName); |
||||
vstProcEvent = OpenEvent(EVENT_ALL_ACCESS, 0, vstProcEventName); |
||||
pdProcEvent = OpenEvent(EVENT_ALL_ACCESS, 0, pdProcEventName); |
||||
pdvstTransferFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, |
||||
0, |
||||
pdvstTransferFileMapName); |
||||
pdvstData = (pdvstTransferData *)MapViewOfFile(pdvstTransferFileMap, |
||||
FILE_MAP_ALL_ACCESS, |
||||
0, |
||||
0, |
||||
sizeof(pdvstTransferData)); |
||||
WaitForSingleObject(pdvstTransferMutex, INFINITE); |
||||
//l *(get_sys_schedadvance()) = *(get_sys_main_advance()) * 1000;
|
||||
//l post("Hello, appel sys_setchsr dans _main. Version 64");
|
||||
sys_setchsr(pdvstData->nChannels, |
||||
pdvstData->nChannels, |
||||
pdvstData->sampleRate); |
||||
ReleaseMutex(pdvstTransferMutex); |
||||
//timeBeginPeriod(1);
|
||||
scheduler(); |
||||
UnmapViewOfFile(pdvstData); |
||||
CloseHandle(pdvstTransferFileMap); |
||||
CloseHandle(pdvstTransferMutex); |
||||
for (i = 0; i < MAXARGS; i++) |
||||
{ |
||||
free(argv[i]); |
||||
} |
||||
return (0); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,43 @@ |
||||
# Compile with MinGW.
|
||||
# Download "vstsdk2_4.zip" from https://archive.org/download/VST2SDK
|
||||
# extract the folder an place it:
|
||||
#
|
||||
# ├──build/
|
||||
# ├──vst-scheduler/
|
||||
# ├──vstsdk2.4/
|
||||
# ├──vst-template/
|
||||
#
|
||||
|
||||
FOO=../vstsdk2.4/
|
||||
FOO2=../vstsdk2.4/public.sdk/source/vst2.x/
|
||||
|
||||
|
||||
SOURCES= \
|
||||
pdvst.cpp \ |
||||
pdvstMain.cpp \ |
||||
pdvstEditor.cpp \ |
||||
$(FOO2)AudioEffect.cpp \ |
||||
$(FOO2)audioeffectx.cpp \ |
||||
$(empty) |
||||
|
||||
WINARCH := $(shell $(CC) -dumpmachine)
|
||||
|
||||
ifeq (i686% , $(WINARCH)) |
||||
arch = 32
|
||||
else |
||||
arch = 64
|
||||
endif |
||||
|
||||
|
||||
ALL: $(SOURCES) |
||||
g++ -Wall -I. -I$(FOO) -I$(FOO2) \
|
||||
$(SOURCES) -static-libgcc -static-libstdc++ -static -lpthread -shared -o pdvst-template.dll
|
||||
strip pdvst-template.dll
|
||||
cp pdvst-template.dll ../build/Release$(arch)/.template/pdvst-template.dll
|
||||
cp pdvst-template.dll ../build/Release$(arch)/Pd_Gain.dll
|
||||
cp pdvst-template.dll ../build/Release$(arch)/Pd_Gain-gui.dll
|
||||
cp pdvst-template.dll ../build/Release$(arch)/Pd_Gain-nogui.dll
|
||||
cp pdvst-template.dll ../build/Release$(arch)/Pd_Midi.dll
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,175 @@ |
||||
/* PdVst v0.0.2 - VST - Pd bridging plugin
|
||||
** Copyright (C) 2004 Joseph A. Sarlo |
||||
** |
||||
** This program is free software; you can redistribute it and/orsig |
||||
** modify it under the terms of the GNU General Public License |
||||
** as published by the Free Software Foundation; either version 2 |
||||
** of the License, or (at your option) any later version. |
||||
** |
||||
** This program is distributed in the hope that it will be useful, |
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
** GNU General Public License for more details. |
||||
** |
||||
** You should have received a copy of the GNU General Public License |
||||
** along with this program; if not, write to the Free Software |
||||
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
** |
||||
** jsarlo@ucsd.edu |
||||
*/ |
||||
|
||||
#ifndef __PDVST_H |
||||
#define __PDVST_H |
||||
|
||||
#include "audioeffectx.h" |
||||
#include "pdvstEditor.hpp" |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
#include <ctype.h> |
||||
#include <stdarg.h> |
||||
|
||||
#define PDBLKSIZE 64 |
||||
#define MAXEXTERNS 128 |
||||
#define MAXVSTBUFSIZE 4096 |
||||
#define MAXPARAMS 128 |
||||
#define MAXPROGRAMS 128 |
||||
#define MAXCHANS 128 |
||||
#define MAXFILENAMELEN 1024 |
||||
#define MAXSTRLEN 4096 |
||||
#define MAXEXTERNS 128 |
||||
#define PDWAITMAX 1000 |
||||
#define SETUPFILEEXT ".pdv" |
||||
#define DEFPDVSTBUFFERSIZE 1024 |
||||
|
||||
extern "C" |
||||
{ |
||||
#include "pdvstTransfer.h" |
||||
} |
||||
|
||||
/* program data */ |
||||
typedef struct _pdvstProgram |
||||
{ |
||||
char name[MAXSTRLEN]; |
||||
float paramValue[MAXPARAMETERS]; |
||||
} pdvstProgram; |
||||
|
||||
class pdVstBuffer |
||||
{ |
||||
|
||||
friend class pdvst; |
||||
|
||||
public: |
||||
pdVstBuffer(int nChans); |
||||
~pdVstBuffer(); |
||||
void resize(int newSize); |
||||
|
||||
protected: |
||||
int nChannels; |
||||
int inFrameCount; |
||||
int outFrameCount; |
||||
int size; |
||||
float **in; |
||||
float **out; |
||||
}; |
||||
|
||||
class pdvst : public AudioEffectX |
||||
{ |
||||
friend class pdvstEditor; |
||||
|
||||
public: |
||||
pdvst(audioMasterCallback audioMaster); |
||||
~pdvst(); |
||||
|
||||
virtual void process(float **inputs, float **outputs, VstInt32 sampleFrames); |
||||
virtual void processReplacing(float **inputs, float **outputs, |
||||
VstInt32 sampleFrames); |
||||
virtual VstInt32 processEvents (VstEvents* events); |
||||
virtual void setProgram(VstInt32 prgmNum); |
||||
virtual VstInt32 getProgram(); |
||||
virtual void setProgramName(char *name); |
||||
virtual void getProgramName(char *name); |
||||
virtual void setParameter(VstInt32 index, float value); |
||||
virtual float getParameter(VstInt32 index); |
||||
virtual void getParameterLabel(VstInt32 index, char *label); |
||||
virtual void getParameterDisplay(VstInt32 index, char *text); |
||||
virtual void getParameterName(VstInt32 index, char *text); |
||||
virtual bool getEffectName(char* name); |
||||
virtual bool getOutputProperties(VstInt32 index, VstPinProperties* properties); |
||||
virtual VstInt32 canDo (char* text); |
||||
// virtual VstInt32 canMono ();
|
||||
virtual void suspend(); |
||||
virtual void resume(); |
||||
void sendGuiAction(int action); |
||||
void sendPlugName(char * name ); // JYG : to send plug name to puredatapatch
|
||||
|
||||
LPTSTR displayString;//= new TCHAR[MAXSTRINGSIZE];
|
||||
|
||||
HWND pdGui; |
||||
|
||||
protected: |
||||
static int referenceCount; |
||||
void debugLog(char *fmt, ...); |
||||
FILE *debugFile; |
||||
int pdInFrameCount; |
||||
int pdOutFrameCount; |
||||
pdVstBuffer *audioBuffer; |
||||
char pluginPath[MAXFILENAMELEN]; |
||||
char vstPluginPath[MAXFILENAMELEN]; |
||||
char pluginName[MAXSTRLEN]; |
||||
long pluginId; |
||||
char pdFile[MAXFILENAMELEN]; |
||||
char errorMessage[MAXFILENAMELEN]; |
||||
char externalLib[MAXEXTERNS][MAXSTRLEN]; |
||||
float vstParam[MAXPARAMS]; |
||||
char **vstParamName; |
||||
int nParameters; |
||||
pdvstProgram *program; |
||||
int nPrograms; |
||||
int nChannels; |
||||
int nExternalLibs; |
||||
bool customGui; |
||||
int customGuiHeight; |
||||
int customGuiWidth; |
||||
|
||||
bool isASynth; |
||||
bool dspActive; |
||||
HANDLE pdvstTransferMutex, |
||||
pdvstTransferFileMap, |
||||
vstProcEvent, |
||||
pdProcEvent; |
||||
pdvstTransferData *pdvstData; |
||||
char pdvstTransferMutexName[1024]; |
||||
char pdvstTransferFileMapName[1024]; |
||||
char vstProcEventName[1024]; |
||||
char pdProcEventName[1024]; |
||||
char guiName[1024]; |
||||
bool guiNameUpdated; // used to signal to editor that the parameter guiName has changed
|
||||
void startPd(); |
||||
void parseSetupFile(); |
||||
|
||||
void updatePdvstParameters(); |
||||
void setSyncToVst(int value); |
||||
// {JYG
|
||||
DWORD timeFromStartup; // to measure time before vst::setProgram call
|
||||
#ifdef VSTMIDIOUTENABLE |
||||
/** Stores a single midi event.
|
||||
* The 'events' fields points to midiEvent. |
||||
*/ |
||||
VstEvents midiOutEvents; |
||||
/** Last played note information is stored in midiEvent.
|
||||
*/ |
||||
VstMidiEvent midiEvent; |
||||
|
||||
// version alternative (http://stackoverflow.com/questions/359125/how-to-store-data-in-variable-length-arrays-without-causing-memory-corruption)
|
||||
struct VstEvents *evnts; |
||||
VstMidiEvent midiEvnts[MAXMIDIOUTQUEUESIZE]; |
||||
|
||||
int nbFramesWithoutMidiOutEvent; |
||||
#endif //VSTMIDIOUTENABLE
|
||||
int syncDefeatNumber; |
||||
|
||||
|
||||
// JYG }
|
||||
}; |
||||
|
||||
#endif |
@ -0,0 +1,217 @@ |
||||
/* PdVst v0.0.2 - VST - Pd bridging plugin
|
||||
** Copyright (C) 2004 Joseph A. Sarlo |
||||
** |
||||
** This program is free software; you can redistribute it and/orsig |
||||
** modify it under the terms of the GNU General Public License |
||||
** as published by the Free Software Foundation; either version 2 |
||||
** of the License, or (at your option) any later version. |
||||
** |
||||
** This program is distributed in the hope that it will be useful, |
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
** GNU General Public License for more details. |
||||
** |
||||
** You should have received a copy of the GNU General Public License |
||||
** along with this program; if not, write to the Free Software |
||||
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
** |
||||
** jsarlo@ucsd.edu |
||||
*/ |
||||
|
||||
#ifndef __pdvstEditor |
||||
#include "pdvstEditor.hpp" |
||||
#endif |
||||
|
||||
#ifndef __PDVST_H |
||||
#include "pdvst.hpp" |
||||
#endif |
||||
|
||||
#include <stdio.h> |
||||
#include <windows.h> |
||||
|
||||
extern HINSTANCE hInstance; |
||||
//extern int pdGuiWindowHeight, pdGuiWindowWidth;
|
||||
int useCount = 0; |
||||
|
||||
pdvstEditor::pdvstEditor(AudioEffect *effect) |
||||
: AEffEditor(effect) |
||||
{ |
||||
systemWindowHidden=false; |
||||
effect->setEditor(this); |
||||
|
||||
editWindow = NULL; |
||||
//((pdvst *)(effect))->debugLog("begin editor");
|
||||
} |
||||
|
||||
pdvstEditor::~pdvstEditor() |
||||
{ |
||||
} |
||||
|
||||
bool pdvstEditor::getRect(ERect **erect) |
||||
{ |
||||
static ERect r = {0,0,((pdvst *)this->effect)->customGuiHeight,((pdvst *)this->effect)->customGuiWidth}; |
||||
*erect = &r; |
||||
return (true); |
||||
} |
||||
|
||||
|
||||
bool pdvstEditor::open(void *ptr) |
||||
{ |
||||
|
||||
|
||||
systemWindow = ptr; |
||||
|
||||
|
||||
|
||||
WNDCLASS myWindowClass; |
||||
|
||||
useCount++; |
||||
if (useCount == 1) |
||||
{ |
||||
myWindowClass.style = 0; |
||||
myWindowClass.lpfnWndProc = (WNDPROC)windowProc; |
||||
myWindowClass.cbClsExtra = 0; |
||||
myWindowClass.cbWndExtra = 0; |
||||
myWindowClass.hInstance = hInstance; |
||||
myWindowClass.hIcon = 0; |
||||
myWindowClass.hCursor = 0; |
||||
myWindowClass.hbrBackground = GetSysColorBrush(COLOR_APPWORKSPACE); |
||||
// myWindowClass.hbrBackground = CreateSolidBrush(RGB(180, 180, 180));
|
||||
myWindowClass.lpszMenuName = 0; |
||||
myWindowClass.lpszClassName = "pdvstWindowClass"; |
||||
RegisterClass(&myWindowClass); |
||||
} |
||||
LPTSTR plugName= new TCHAR[MAXSTRINGSIZE]; |
||||
|
||||
GetWindowText((HWND)systemWindow,plugName,MAXSTRINGSIZE); |
||||
((pdvst *)this->effect)->sendPlugName((char *) plugName ); |
||||
|
||||
// sprintf( ((pdvst *)this->effect)->displayString,"valeurSetParameter=%f",((pdvst *)this->effect)->vstParam[0]);
|
||||
|
||||
|
||||
//((pdvst *)this->effect)->sendPlugName((char *) ((pdvst *)this->effect)->displayString );
|
||||
//////
|
||||
editWindow = CreateWindowEx(0, "pdvstWindowClass", "Window", |
||||
WS_CHILD | WS_VISIBLE, 0,0,((pdvst *)this->effect)->customGuiWidth,((pdvst *)this->effect)->customGuiHeight, |
||||
(HWND)systemWindow, NULL, hInstance, NULL); |
||||
SetWindowLongPtr(editWindow, GWLP_USERDATA, (LONG_PTR)this); |
||||
|
||||
/* openButton = CreateWindowEx(0, "Button", "open", WS_CHILD | WS_VISIBLE,
|
||||
70, 24, 120, 25, editWindow, NULL, hInstance, |
||||
NULL); |
||||
*/ |
||||
|
||||
((pdvst *)this->effect)->sendGuiAction(1); |
||||
return (true); |
||||
} |
||||
|
||||
|
||||
|
||||
void pdvstEditor::close() |
||||
{ |
||||
if (pdGuiWindow) |
||||
{ |
||||
// detach pdGuiWindow from editWindow
|
||||
SetParent(pdGuiWindow,NULL); |
||||
//Remove WS_CHILD style and add WS_POPUP style
|
||||
DWORD style = GetWindowLong(pdGuiWindow,GWL_STYLE); |
||||
// style = style & ~(WS_POPUPWINDOW);
|
||||
style = style | WS_POPUP; |
||||
style = style & ~(WS_CHILD); |
||||
style = style |(WS_SYSMENU); |
||||
style = style | (WS_BORDER); |
||||
SetWindowLong(pdGuiWindow,GWL_STYLE,style); |
||||
systemWindowHidden=false; |
||||
pdGuiWindow=NULL; |
||||
} |
||||
|
||||
if (editWindow) |
||||
{ |
||||
((pdvst *)this->effect)->sendGuiAction(0); |
||||
DestroyWindow(editWindow); |
||||
} |
||||
|
||||
editWindow = NULL; |
||||
useCount = 0; |
||||
UnregisterClass("pdvstWindowClass", hInstance); |
||||
} |
||||
|
||||
void pdvstEditor::idle() |
||||
{ |
||||
|
||||
// JYG :: masquer la fenêtre GUI créée par hôte VST pour laisser puredata le faire
|
||||
// SetWindowPos((HWND)systemWindow,HWND_TOPMOST,-300,-300,0,0,SWP_NOSIZE); // déplacer la fenetre
|
||||
// SetWindowPos((HWND)systemWindow,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_HIDEWINDOW); //masquer la fenêtre
|
||||
// systemWindowHidden=true;
|
||||
// JYG
|
||||
if (((pdvst *)this->effect)->guiNameUpdated) |
||||
if (editWindow)//&&!pdGuiWindow)
|
||||
{ |
||||
HWND tref=NULL; |
||||
parms.ref = &tref; |
||||
strcpy(parms.s,(char*)((pdvst *)this->effect)->guiName); |
||||
parms.exact = false; |
||||
EnumWindows(enumwnd,(LPARAM)&parms); |
||||
pdGuiWindow = tref; |
||||
|
||||
// pdGuiWindow=FindWindow(NULL,"Pd_Gain(gui).pd - C:/Program Files (x86)/Ableton/Live 8.0.4/Program/pdvst");
|
||||
// pdGuiWindow=FindWindow(NULL,(char*)((pdvst *)this->effect)->guiName);
|
||||
if (pdGuiWindow) |
||||
{ |
||||
if(SetParent(pdGuiWindow,(HWND)editWindow))//systemWindow))
|
||||
{ |
||||
((pdvst *)this->effect)->guiNameUpdated=0; |
||||
//Remove WS_POPUP style and add WS_CHILD style
|
||||
DWORD style = GetWindowLong(pdGuiWindow,GWL_STYLE); |
||||
// style = style & ~(WS_POPUPWINDOW);
|
||||
style = style & ~(WS_POPUP); |
||||
style = style & ~(WS_CHILD); // WS_CHILD Crashes tcltk with reaper
|
||||
style = style & ~(WS_SYSMENU); |
||||
style = style & ~(WS_BORDER); |
||||
style = style & ~(WS_HSCROLL); |
||||
style = style & ~(WS_VSCROLL); |
||||
style = style & ~(WS_SIZEBOX); |
||||
style = style & ~(WS_CAPTION); |
||||
SetWindowLong(pdGuiWindow,GWL_STYLE,style); |
||||
MoveWindow(pdGuiWindow, 0,0,((pdvst *)this->effect)->customGuiWidth,((pdvst *)this->effect)->customGuiHeight,TRUE); |
||||
systemWindowHidden=true; |
||||
} |
||||
} |
||||
} |
||||
AEffEditor::idle(); |
||||
} |
||||
|
||||
LONG WINAPI pdvstEditor::windowProc(HWND hwnd, UINT message, |
||||
WPARAM wParam, LPARAM lParam) |
||||
{ |
||||
pdvstEditor *self = (pdvstEditor *)GetWindowLongPtr(hwnd, GWLP_USERDATA); |
||||
if (message == WM_COMMAND) |
||||
{ |
||||
if (HIWORD(wParam) == BN_CLICKED && |
||||
(HWND)lParam == self->openButton) |
||||
{ |
||||
// ((pdvst *)self->effect)->sendGuiAction(1);
|
||||
} |
||||
} |
||||
|
||||
return (DefWindowProc(hwnd, message, wParam, lParam)); |
||||
} |
||||
|
||||
|
||||
|
||||
BOOL CALLBACK enumwnd(HWND hwnd,LPARAM lParam) |
||||
{ |
||||
enumparms *parms = (enumparms *)lParam; |
||||
char buf[256]; |
||||
GetWindowText(hwnd,buf,sizeof buf); |
||||
if(parms->exact? strcmp(buf,parms->s) == 0 : strstr(buf,parms->s) != NULL) { |
||||
*parms->ref = hwnd; |
||||
return FALSE; |
||||
} |
||||
else { |
||||
// also search for child windows
|
||||
EnumChildWindows(hwnd,enumwnd,lParam); |
||||
return TRUE; |
||||
} |
||||
} |
||||
// ***********
|
@ -0,0 +1,61 @@ |
||||
/* PdVst v0.0.2 - VST - Pd bridging plugin
|
||||
** Copyright (C) 2004 Joseph A. Sarlo |
||||
** |
||||
** This program is free software; you can redistribute it and/orsig |
||||
** modify it under the terms of the GNU General Public License |
||||
** as published by the Free Software Foundation; either version 2 |
||||
** of the License, or (at your option) any later version. |
||||
** |
||||
** This program is distributed in the hope that it will be useful, |
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
** GNU General Public License for more details. |
||||
** |
||||
** You should have received a copy of the GNU General Public License |
||||
** along with this program; if not, write to the Free Software |
||||
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
** |
||||
** jsarlo@ucsd.edu |
||||
*/ |
||||
|
||||
#ifndef __pdvstEditor |
||||
#define __pdvstEditor |
||||
#include <stdio.h> |
||||
#include <windows.h> |
||||
#include "aeffeditor.h" |
||||
|
||||
typedef struct _enumparms |
||||
{ |
||||
HWND *ref; |
||||
char s[1024]; |
||||
bool exact; |
||||
}enumparms; |
||||
|
||||
class pdvstEditor : public AEffEditor |
||||
{ |
||||
friend class pdvst; |
||||
public: |
||||
pdvstEditor(AudioEffect *effect); |
||||
virtual ~pdvstEditor (); |
||||
|
||||
HWND openButton;; |
||||
HWND editWindow; |
||||
HWND pdGuiWindow; |
||||
static LONG WINAPI windowProc(HWND mhwnd, UINT message, |
||||
WPARAM wParam, LPARAM lParam); |
||||
|
||||
protected: |
||||
virtual bool getRect(ERect **erect); |
||||
virtual bool open(void *ptr); |
||||
virtual void close(); |
||||
virtual void idle(); |
||||
|
||||
|
||||
private: |
||||
void *systemWindow; |
||||
bool systemWindowHidden; |
||||
enumparms parms; |
||||
|
||||
}; |
||||
#endif |
||||
static BOOL CALLBACK enumwnd(HWND hwnd,LPARAM lParam); |
@ -0,0 +1,383 @@ |
||||
/* PdVst v0.0.2 - VST - Pd bridging plugin
|
||||
** Copyright (C) 2004 Joseph A. Sarlo |
||||
** |
||||
** This program is free software; you can redistribute it and/orsig |
||||
** modify it under the terms of the GNU General Public License |
||||
** as published by the Free Software Foundation; either version 2 |
||||
** of the License, or (at your option) any later version. |
||||
** |
||||
** This program is distributed in the hope that it will be useful, |
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
** GNU General Public License for more details. |
||||
** |
||||
** You should have received a copy of the GNU General Public License |
||||
** along with this program; if not, write to the Free Software |
||||
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
** |
||||
** jsarlo@ucsd.edu |
||||
*/ |
||||
#include <windows.h> |
||||
#include <math.h> |
||||
#include "pdvst.hpp" |
||||
#include <unistd.h> |
||||
|
||||
static AudioEffect *effect = 0; |
||||
bool oome = false; |
||||
//HINSTANCE hInstance;
|
||||
bool globalIsASynth = false; |
||||
bool globalDebug = false; |
||||
int globalNChannels = 0; |
||||
int globalNPrograms = 0; |
||||
int globalNParams = 0; |
||||
int globalNExternalLibs = 0; |
||||
long globalPluginId = 'pdvp'; |
||||
char globalExternalLib[MAXEXTERNS][MAXSTRLEN]; |
||||
char globalVstParamName[MAXPARAMS][MAXSTRLEN]; |
||||
char globalPluginPath[MAXFILENAMELEN]; |
||||
char globalVstPluginPath[MAXFILENAMELEN]; |
||||
char globalPluginName[MAXSTRLEN]; |
||||
char globalPdFile[MAXFILENAMELEN]; |
||||
char globalPureDataPath[MAXFILENAMELEN]; |
||||
char globalHostPdvstPath[MAXFILENAMELEN]; |
||||
bool globalCustomGui = false; |
||||
int globalCustomGuiWidth= 320; |
||||
int globalCustomGuiHeight= 150; |
||||
pdvstProgram globalProgram[MAXPROGRAMS]; |
||||
|
||||
char *trimWhitespace(char *str); |
||||
void parseSetupFile(); |
||||
|
||||
|
||||
#include "audioeffect.h" |
||||
|
||||
//------------------------------------------------------------------------
|
||||
/** Must be implemented externally. */ |
||||
extern AudioEffect* createEffectInstance (audioMasterCallback audioMaster); |
||||
|
||||
extern "C" { |
||||
#if defined (__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) |
||||
#define VST_EXPORT __attribute__ ((visibility ("default"))) |
||||
#else |
||||
#define VST_EXPORT |
||||
#endif |
||||
|
||||
VST_EXPORT AEffect *VSTPluginMain(audioMasterCallback audioMaster) |
||||
{ |
||||
// get vst version
|
||||
if (!audioMaster(0, audioMasterVersion, 0, 0, 0, 0)) |
||||
return 0; // old version
|
||||
|
||||
// Create the AudioEffect
|
||||
AudioEffect* effect = createEffectInstance (audioMaster); |
||||
if (!effect) |
||||
return 0; |
||||
|
||||
return effect->getAeffect(); |
||||
} |
||||
|
||||
// support for old hosts not looking for VSTPluginMain
|
||||
#if (TARGET_API_MAC_CARBON && __ppc__) |
||||
VST_EXPORT AEffect* main_macho (audioMasterCallback audioMaster) { return VSTPluginMain (audioMaster); } |
||||
#elif WIN32 |
||||
VST_EXPORT AEffect* MAIN (audioMasterCallback audioMaster) { return VSTPluginMain (audioMaster); } |
||||
#elif BEOS |
||||
VST_EXPORT AEffect* main_plugin (audioMasterCallback audioMaster) { return VSTPluginMain (audioMaster); } |
||||
#endif |
||||
|
||||
} // extern "C"
|
||||
|
||||
|
||||
|
||||
|
||||
#if WIN32 |
||||
#include <windows.h> |
||||
void* hInstance; |
||||
|
||||
extern "C" { |
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved) |
||||
{ |
||||
hInstance = hInst; |
||||
parseSetupFile(); |
||||
return 1; |
||||
} |
||||
} // extern "C"
|
||||
#endif |
||||
|
||||
|
||||
char *trimWhitespace(char *str) |
||||
{ |
||||
char *buf; |
||||
|
||||
if (strlen(str) > 0) |
||||
{ |
||||
buf = str; |
||||
while (isspace(*buf) && (buf - str) <= (int)strlen(str)) |
||||
buf++; |
||||
memmove(str, buf, (strlen(buf) + 1) * sizeof(char)); |
||||
if (strlen(str) > 0) |
||||
{ |
||||
buf = str + strlen(str) - 1; |
||||
while (isspace(*buf) && (buf >= str)) |
||||
{ |
||||
*buf = 0; |
||||
buf--; |
||||
} |
||||
} |
||||
} |
||||
return (str); |
||||
} |
||||
|
||||
void parseSetupFile() |
||||
{ |
||||
FILE *setupFile; |
||||
char setupFileName[MAXFILENAMELEN]; |
||||
char tFileName[MAXFILENAMELEN]; |
||||
char line[MAXSTRLEN]; |
||||
char param[MAXSTRLEN]; |
||||
char value[MAXSTRLEN]; |
||||
char vstDataPath[MAXSTRLEN]; |
||||
char vstSetupFileName[MAXSTRLEN]; // path to setup file if it is located in vst subdir
|
||||
int i, equalPos, progNum = -1; |
||||
|
||||
// find filepaths
|
||||
GetModuleFileName((HMODULE)hInstance, |
||||
(LPTSTR)tFileName, |
||||
(DWORD)MAXFILENAMELEN); |
||||
|
||||
if (strrchr(tFileName, '\\')) |
||||
{ |
||||
strcpy(globalPluginName, strrchr(tFileName, '\\') + 1); |
||||
} |
||||
else |
||||
{ |
||||
strcpy(globalPluginName, tFileName); |
||||
} |
||||
|
||||
// alternate setup file path in vst plugins folder
|
||||
if (strrchr(tFileName, '\\')) |
||||
{ |
||||
|
||||
strcpy(vstDataPath, tFileName); |
||||
*(strrchr(vstDataPath, '\\') + 1) = 0; |
||||
sprintf(vstDataPath, "%s%s\\", vstDataPath,globalPluginName); |
||||
// remove .dll extension (from globalPluginName)
|
||||
if (strstr(vstDataPath, ".dll")) |
||||
*(strstr(vstDataPath, ".dll")) = 0; |
||||
if (strstr(vstDataPath, ".DLL")) |
||||
*(strstr(vstDataPath, ".DLL")) = 0; |
||||
sprintf(vstDataPath, "%s\\", vstDataPath); //
|
||||
// path to alternate setup file
|
||||
sprintf(vstSetupFileName,"%s%s",vstDataPath,globalPluginName); |
||||
// remove .dll extension
|
||||
if (strstr(vstSetupFileName, ".dll")) |
||||
*(strstr(vstSetupFileName, ".dll")) = 0; |
||||
if (strstr(vstSetupFileName, ".DLL")) |
||||
*(strstr(vstSetupFileName, ".DLL")) = 0; |
||||
// add SETUPFILEEXT extension
|
||||
sprintf(vstSetupFileName,"%s%s",vstSetupFileName,SETUPFILEEXT); |
||||
//MessageBox(NULL, vstDataPath,"vstDataPath",MB_OK) ;
|
||||
//MessageBox(NULL, vstSetupFileName,"vstSetupFileName",MB_OK) ;
|
||||
|
||||
|
||||
} |
||||
|
||||
|
||||
GetModuleFileName(NULL, |
||||
(LPTSTR)tFileName, |
||||
(DWORD)MAXFILENAMELEN); |
||||
if (strrchr(tFileName, '\\')) |
||||
{ |
||||
strcpy(globalPluginPath, tFileName); |
||||
*(strrchr(globalPluginPath, '\\') + 1) = 0; |
||||
sprintf(globalPluginPath, "%spdvst\\", globalPluginPath); |
||||
} |
||||
else |
||||
{ |
||||
strcpy(globalPluginPath, tFileName); |
||||
} |
||||
strcpy(globalHostPdvstPath,globalPluginPath); |
||||
|
||||
// remove .dll extension
|
||||
if (strstr(strlwr(globalPluginName), ".dll")) |
||||
*(strstr(strlwr(globalPluginName), ".dll")) = 0; |
||||
sprintf(setupFileName, |
||||
"%s%s%s", |
||||
globalPluginPath, |
||||
globalPluginName, |
||||
SETUPFILEEXT); |
||||
|
||||
|
||||
|
||||
// initialize program info
|
||||
|
||||
|
||||
|
||||
strcpy(globalProgram[0].name, "Default"); |
||||
memset(globalProgram[0].paramValue, 0, MAXPARAMS * sizeof(float)); |
||||
// initialize parameter info
|
||||
globalNParams = 0; |
||||
for (i = 0; i < MAXPARAMS; i++) |
||||
strcpy(globalVstParamName[i], "<unnamed>"); |
||||
globalNPrograms = 1; |
||||
|
||||
|
||||
// check existence of setup file in vst-subfolder
|
||||
if( access(vstSetupFileName, F_OK ) != -1 ) |
||||
// if exists choose this alternate file
|
||||
{ |
||||
setupFile = fopen(vstSetupFileName, "r"); |
||||
//strcpy(setupFileName,vstSetupFileName);
|
||||
strcpy(globalPluginPath,vstDataPath); |
||||
|
||||
} |
||||
else |
||||
setupFile = fopen(setupFileName, "r"); |
||||
// parse the setup file
|
||||
if (setupFile) { |
||||
while (fgets(line, sizeof(line), setupFile)) |
||||
{ |
||||
equalPos = strchr(line, '=') - line; |
||||
if (equalPos > 0 && line[0] != '#') |
||||
{ |
||||
strcpy(param, line); |
||||
param[equalPos] = 0; |
||||
strcpy(value, line + equalPos + 1); |
||||
strcpy(param, trimWhitespace(strlwr(param))); |
||||
strcpy(value, trimWhitespace(value)); |
||||
// number of channels
|
||||
if (strcmp(param, "channels") == 0) |
||||
globalNChannels = atoi(value); |
||||
|
||||
// main PD patch
|
||||
if (strcmp(param, "main") == 0) |
||||
{ |
||||
// strcpy(globalPdFile, strlwr(value));
|
||||
strcpy(globalPdFile, value); |
||||
} |
||||
if (strcmp(param, "pdpath") == 0) |
||||
{ |
||||
// strcpy(globalPureDataPath, strlwr(value));
|
||||
strcpy(globalPureDataPath, value); |
||||
|
||||
} |
||||
// vst plugin ID
|
||||
if (strcmp(param, "id") == 0) |
||||
{ |
||||
globalPluginId = 0; |
||||
for (i = 0; i < 4; i++) |
||||
globalPluginId += (long)pow((double)16,(int) (i * 2)) * value[3 - i]; |
||||
} |
||||
// is vst instrument
|
||||
if (strcmp(param, "synth") == 0) |
||||
{ |
||||
if (strcmp(strlwr(value), "true") == 0) |
||||
{ |
||||
globalIsASynth = true; |
||||
} |
||||
else if (strcmp(strlwr(value), "false") == 0) |
||||
{ |
||||
globalIsASynth = false; |
||||
} |
||||
} |
||||
// external libraries
|
||||
if (strcmp(param, "lib") == 0) |
||||
{ |
||||
while (strlen(value) > 0) |
||||
{ |
||||
if (strchr(value, ',') == NULL) |
||||
{ |
||||
strcpy(globalExternalLib[globalNExternalLibs], value); |
||||
value[0] = 0; |
||||
} |
||||
else |
||||
{ |
||||
int commaIndex = strchr(value, ',') - value; |
||||
strncpy(globalExternalLib[globalNExternalLibs], |
||||
value, |
||||
commaIndex); |
||||
memmove(value, |
||||
value + commaIndex + 1, |
||||
(strlen(value) - commaIndex) * sizeof(char)); |
||||
strcpy(value, trimWhitespace(value)); |
||||
} |
||||
globalNExternalLibs++; |
||||
} |
||||
} |
||||
// has custom gui
|
||||
if (strcmp(param, "customgui") == 0) |
||||
{ |
||||
if (strcmp(strlwr(value), "true") == 0) |
||||
{ |
||||
globalCustomGui = true; |
||||
} |
||||
else if (strcmp(strlwr(value), "false") == 0) |
||||
{ |
||||
globalCustomGui = false; |
||||
} |
||||
|
||||
} |
||||
// custom gui height
|
||||
if (strcmp(param, "guiheight") == 0) |
||||
globalCustomGuiHeight = atoi(value); |
||||
|
||||
// custom gui width
|
||||
if (strcmp(param, "guiwidth") == 0) |
||||
{ |
||||
globalCustomGuiWidth = atoi(value); |
||||
|
||||
} |
||||
// debug (show Pd GUI)
|
||||
if (strcmp(param, "debug") == 0) |
||||
{ |
||||
if (strcmp(strlwr(value), "true") == 0) |
||||
{ |
||||
globalDebug = true; |
||||
} |
||||
else if (strcmp(strlwr(value), "false") == 0) |
||||
{ |
||||
globalDebug = false; |
||||
} |
||||
} |
||||
// number of parameters
|
||||
if (strcmp(param, "parameters") == 0) |
||||
{ |
||||
int numParams = atoi(value); |
||||
|
||||
if (numParams >= 0 && numParams < MAXPARAMS) |
||||
globalNParams = numParams; |
||||
} |
||||
// parameters names
|
||||
if (strstr(param, "nameparameter") == \
|
||||
param && globalNPrograms < MAXPARAMS) |
||||
{ |
||||
int paramNum = atoi(param + strlen("nameparameter")); |
||||
|
||||
if (paramNum < MAXPARAMS && paramNum >= 0) |
||||
strcpy(globalVstParamName[paramNum], value); |
||||
} |
||||
// program name
|
||||
if (strcmp(param, "program") == 0 && \
|
||||
globalNPrograms < MAXPROGRAMS) |
||||
{ |
||||
progNum++; |
||||
strcpy(globalProgram[progNum].name, value); |
||||
globalNPrograms = progNum + 1; |
||||
} |
||||
// program parameters
|
||||
if (strstr(param, "parameter") == \
|
||||
param && globalNPrograms < MAXPROGRAMS && |
||||
!isalpha(param[strlen("parameter")])) |
||||
{ |
||||
int paramNum = atoi(param + strlen("parameter")); |
||||
|
||||
if (paramNum < MAXPARAMS && paramNum >= 0) |
||||
globalProgram[progNum].paramValue[paramNum] = \
|
||||
(float)atof(value); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
fclose(setupFile); |
||||
} |
@ -0,0 +1,135 @@ |
||||
/* PdVst v0.0.2 - VST - Pd bridging plugin
|
||||
** Copyright (C) 2004 Joseph A. Sarlo |
||||
** |
||||
** This program is free software; you can redistribute it and/orsig |
||||
** modify it under the terms of the GNU General Public License |
||||
** as published by the Free Software Foundation; either version 2 |
||||
** of the License, or (at your option) any later version. |
||||
** |
||||
** This program is distributed in the hope that it will be useful, |
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
** GNU General Public License for more details. |
||||
** |
||||
** You should have received a copy of the GNU General Public License |
||||
** along with this program; if not, write to the Free Software |
||||
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
** |
||||
** jsarlo@ucsd.edu |
||||
*/ |
||||
|
||||
#ifndef __pdvstTransfer_H |
||||
#define __pdvstTransfer_H |
||||
|
||||
#include <stdio.h> |
||||
#define VSTMIDIOUTENABLE |
||||
#define MAXCHANNELS 16 |
||||
#define MAXPARAMETERS 128 |
||||
#define MAXBLOCKSIZE 256 |
||||
#define MAXSTRINGSIZE 4096 |
||||
#define MAXMIDIQUEUESIZE 1024 |
||||
|
||||
//#ifdef VSTMIDIOUTENABLE
|
||||
#define MAXMIDIOUTQUEUESIZE 1024 |
||||
//#endif // VSTMIDIOUTENABLE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef enum _pdvstParameterDataType |
||||
{ |
||||
FLOAT_TYPE, |
||||
STRING_TYPE |
||||
} pdvstParameterDataType; |
||||
|
||||
typedef enum _pdvstParameterState |
||||
{ |
||||
PD_SEND, |
||||
PD_RECEIVE |
||||
} pdvstParameterState; |
||||
|
||||
typedef enum _pdvstMidiMessageType |
||||
{ |
||||
NOTE_OFF, |
||||
NOTE_ON, |
||||
KEY_PRESSURE, |
||||
CONTROLLER_CHANGE, |
||||
PROGRAM_CHANGE, |
||||
CHANNEL_PRESSURE, |
||||
PITCH_BEND, |
||||
OTHER |
||||
} pdvstMidiMessageType; |
||||
|
||||
typedef union _pdvstParameterData |
||||
{ |
||||
float floatData; |
||||
char stringData[MAXSTRINGSIZE]; |
||||
} pdvstParameterData; |
||||
|
||||
typedef struct _pdvstParameter |
||||
{ |
||||
int updated; |
||||
pdvstParameterDataType type; |
||||
pdvstParameterData value; |
||||
pdvstParameterState direction; |
||||
} pdvstParameter; |
||||
|
||||
typedef struct _pdvstMidiMessage |
||||
{ |
||||
pdvstMidiMessageType messageType; |
||||
int channelNumber; |
||||
char statusByte; |
||||
char dataByte1; |
||||
char dataByte2; |
||||
} pdvstMidiMessage; |
||||
|
||||
typedef struct _vstTimeInfo |
||||
{ |
||||
int updated; |
||||
//-------------------------------------------------------------------------------------------------------
|
||||
double samplePos; ///< current Position in audio samples (always valid)
|
||||
double sampleRate; ///< current Sample Rate in Herz (always valid)
|
||||
double nanoSeconds; ///< System Time in nanoseconds (10^-9 second)
|
||||
double ppqPos; ///< Musical Position, in Quarter Note (1.0 equals 1 Quarter Note)
|
||||
double tempo; ///< current Tempo in BPM (Beats Per Minute)
|
||||
double barStartPos; ///< last Bar Start Position, in Quarter Note
|
||||
double cycleStartPos; ///< Cycle Start (left locator), in Quarter Note
|
||||
double cycleEndPos; ///< Cycle End (right locator), in Quarter Note
|
||||
int timeSigNumerator; ///< Time Signature Numerator (e.g. 3 for 3/4)
|
||||
int timeSigDenominator; ///< Time Signature Denominator (e.g. 4 for 3/4)
|
||||
int smpteOffset; ///< SMPTE offset (in SMPTE subframes (bits; 1/80 of a frame)). The current SMPTE position can be calculated using #samplePos, #sampleRate, and #smpteFrameRate.
|
||||
int smpteFrameRate; ///< @see VstSmpteFrameRate
|
||||
int samplesToNextClock; ///< MIDI Clock Resolution (24 Per Quarter Note), can be negative (nearest clock)
|
||||
int flags; ///< @see VstTimeInfoFlags
|
||||
//-------------------------------------------------------------------------------------------------------
|
||||
}pdvstTimeInfo; |
||||
|
||||
|
||||
typedef struct _pdvstTransferData |
||||
{ |
||||
int active; |
||||
int syncToVst; |
||||
int nChannels; |
||||
int sampleRate; |
||||
int blockSize; |
||||
int nParameters; |
||||
int midiQueueSize; |
||||
int midiQueueUpdated; |
||||
float samples[MAXCHANNELS][MAXBLOCKSIZE]; |
||||
pdvstParameter vstParameters[MAXPARAMETERS]; |
||||
pdvstMidiMessage midiQueue[MAXMIDIQUEUESIZE]; |
||||
pdvstParameter guiState; |
||||
pdvstParameter plugName; // transmitted by host
|
||||
pdvstParameter guiName; // transmitted by pd : name of gui window to be embedded
|
||||
// #ifdef VSTMIDIOUTENABLE
|
||||
int midiOutQueueSize; |
||||
int midiOutQueueUpdated; |
||||
pdvstMidiMessage midiOutQueue[MAXMIDIOUTQUEUESIZE]; |
||||
|
||||
// #endif // VSTMIDIOUTENABLE
|
||||
pdvstTimeInfo hostTimeInfo; |
||||
|
||||
} pdvstTransferData; |
||||
|
||||
#endif |
Loading…
Reference in new issue