When I need a smoothly functioning and feature-rich EQ GUI, my favorite solution is VSTPlugin with ZL Equalizer.
ZL Equalizer is a free, open-source near-clone of FabFilter Pro-Q. The GUI is quite nice; it would be so difficult to emulate this GUI in SC that I think it isn’t worth trying. Also, you get dynamic EQ features for free, which aren’t implemented in either MasterEQ or ddwEQ. Native releases for macOS, Windows and Linux (no need for WINE). CPU use isn’t heavy. There’s not much to dislike here.
The VSTPlugin workflow isn’t hard, just has a number of steps which take some figuring out at first: 1/ prepare a SynthDef (.add); 2/ make a Synth node; 3/ point a VSTPluginController at the synth node; 4/ open the plugin; 5/ open the editor.
// line-by-line way
(
SynthDef(\vstfx2, { |out = 0, bypass = 0|
var sig = In.ar(out, 2);
sig = VSTPlugin.ar(sig, 2, bypass);
ReplaceOut.ar(out, sig);
}).add;
)
// main bus here
// change [out: myBus], and target and addAction for other cases
a = Synth(\vstfx2, target: s.defaultGroup, addAction: \addAfter);
c = VSTPluginController(a);
c.open("ZL Equalizer.vst3"); // async, wait a bit before running the editor
c.editor;
c.writeProgram(".../path/to/my_eq_preset.vstpreset");
c.close;
a.free;
For frequent use, I would package it into a helper function:
(
~addFxToBus = { |vstName = "ZL Equalizer.vst3", busIndex = 0, presetPath = nil, target(s.defaultGroup), addAction = \addAfter, openEditor = true|
var node = Synth(\vstfx2, [out: busIndex],
target: target, addAction: addAction
);
var ctl = VSTPluginController(node);
ctl.open(vstName, action: { |vstctl, ok|
if(ok) {
if(presetPath.notNil) {
ctl.readProgram(presetPath, { |vstctl, ok|
if(ok.not) {
"% could not read preset file '%'"
.format(vstName, presetPath)
.warn;
} {
"% ready\n".postf(vstName);
if(openEditor) { ctl.editor };
};
})
} {
"% ready\n".postf(vstName);
if(openEditor) { ctl.editor };
}
} {
"Could not open %".format(vstName).warn;
};
});
ctl // gives access to "ctl.synth" as well
};
)
Saving a preset, btw, is myVSTCtl.writeProgram(".../path/to/preset.vstpreset") (after you’ve configured the EQ bands of course).
It’s tempting to approach this problem from the point of view that SC should be able to handle everything. But I think that VST plugin authors put a lot of time into user interfaces – more time than we are likely to spend on it, and using better GUI frameworks – so that UX is frankly better than we have with SC’s Qt GUIs. Christof (spacechild1) has done us the really amazing service of making it possible for us to bring these highly developed interfaces into SC (and Pd). The only convincing reason not to use them is to avoid dependencies on external software. YMMV on that. For myself, I think VSTPlugin is great and I find myself using it more and more.
hjh
PS Also ZL Compressor, from the same dev, is way way WAAAAYYYY better than SC’s Compander.
