VSTPlugin helper function for fx with nodeproxies

hey, i have seen this great addFxToBus wrapper Parametric Equalizer - #2 by jamshark70 and was wondering if somebody has created something similiar for NodeProxies. After doing a lot of community work lately, i was hoping that somebody did that already before investigating all the helpfiles. Thanks alot :slight_smile:

At some point i was trying to come up with a ProtoDef for that, but was not really sure how to figure out the params of each VST, which one might want to use, to then be able to modulate these via LFOs.

(
ProtoDef(\makeVST) { |inputProxy, plugin, params = #[]|

	~initDef = { |self|

		VSTPlugin.search;

	};

	~init = { |self|

		self.makeNodeProxy;
		self.makeController;

	};

	~makeNodeProxy = { |self|

		self.nodeProxy.clear;

		self.nodeProxy ?? {
			self.nodeProxy = NodeProxy.audio(s, 2);
		};

		self.nodeProxy[0] = \vst -> {

			var numChannels = 2;

			VSTPlugin.ar(
				input: NamedControl.ar(\in, 0 ! numChannels),
				numOut: numChannels,
				params: [],//self.params,
				info: self.plugin
			);
		};

		self.nodeProxy.set(\in, self.inputProxy);

	};

	~makeController = { |self|

		self.controller = VSTPluginNodeProxyController(self.nodeProxy).open;

	};

};
)

(
~vst = Prototype(\makeVST) {

	~inputProxy = topEnvironment[\pulsarMLP][\synth].nodeProxy;

	~plugin = "kHs Filter Table.vst3";

	~params = [
					0, \pos.kr(0.5),
					1, \cutoff.kr(0.5),
					2, \res.kr(0.25),
					3, \mix.kr(1)
				];

};
)

After a VSTPlugin.search, you can first find the plugin by name:

// operating on symbols
k = VSTPlugin.pluginKeys.detect { |key| key.asString.containsi("decentsampler") };
-> DecentSampler.vst3

Then this points to a VSTPluginDesc:

VSTPlugin.plugins[k].dump

Instance of VSTPluginDesc {    (0x7fd1a1a24ab8, gc=18, fmt=00, flg=00, set=05)
  instance variables [24]
    key : Symbol 'DecentSampler.vst3'
    path : "/home/xxx/.vst3/DecentSampler.vst3"
    name : "DecentSampler"
    vendor : "Decidedly"
    category : "Instrument|Synth"
    version : "1.13.0"
    sdkVersion : "VST 3.7.12"
    id : "ABCDEF019182FAEB446C647944736D70"
    inputs : instance of Array (0x7fd1a0297a68, size=0, set=0)
    outputs : instance of Array (0x7fd1a1a23d98, size=17, set=5)
    parameters : instance of Array (0x62dad6c3a178, size=34, set=6)
    programs : instance of Array (0x62dad6ab60b8, size=1, set=2)
    presets : instance of Array (0x7fd1a004c398, size=0, set=0)
    editor : true
    editorResizable : true
    synth : true
    singlePrecision : true
    doublePrecision : false
    midiInput : true
    midiOutput : true
    sysexInput : false
    sysexOutput : false
    bridged : false
    prParamIndexMap : instance of IdentityDictionary (0x7fd1a1597db8, size=5, set=3)
}

Then .parameters is an array of Events, containing some metadata about parameters:

VSTPlugin.plugins[k].parameters.do { |parm| parm.postln }; ""

('name': Main Volume, 'label': dB, 'automatable': true)
('name': Main Tuning, 'label': semitones, 'automatable': true)
('name': , 'label': , 'automatable': true)
('name': , 'label': , 'automatable': true)
('name': , 'label': , 'automatable': true)
... and a lot more of those

If you have the parameter name, you can also get its index by .findParamIndex.

hjh

thank you very much. I will have a look into these :slight_smile: