MasterFX a highly configurable chain of effects on the main outputs
see also: ProxyChain
(
s.boot;
// add a few global filter functions to use - these are then available by name.
ProxyChain.add(
\leakDC, \filter -> { |in, leak=0.99| LeakDC.ar(in, leak) },
\rollClip, \filter -> { |in, clip=0.99, pole=0.2|
OnePole.ar(in.clip2(clip), pole ** 0.7);
},
\krush, \filter -> { |in, bits=16, downsamp=2|
var down;
in = in.round(0.5 ** bits);
down = Latch.ar(in, Impulse.ar(SampleRate.ir / downsamp.max(2)));
// below 1/2 downsamp, do xfade:
blend(in, down, (downsamp - 1).clip(0, 1));
},
\ampFin, \filter -> { |in, limDrive=1, ampLimit=0.8, postAmp=1 |
Limiter.ar(in * limDrive, ampLimit) * postAmp;
}
);
// and specs for them fof gui control.
Spec.add(\leak, [0.5, 0.999, \exp]);
Spec.add(\clip, [0.0, 1, \amp]);
Spec.add(\pole, [0, 0.95, \lin]);
Spec.add(\bits, [16, 1]);
Spec.add(\downsamp, [1, 100, \exp]);
Spec.add(\limDrive, \ampx4);
Spec.add(\ampLimit, \amp);
Spec.add(\postAmp, \ampx4);
)
*new(server, numChannels, slotNames, busnum)
server: the server on which the MasterFX chain will run;
numChannels: the number of channels it will work on,
default is server.numOutputBusChannels
slotNames: the names of the filters/functions to be used, in order of execution;
busnum: the busnumber where it will process audio, default = 0.
(
m = MasterFX.new(server: s,
numChannels: 8,
slotNames: [\leakDC, \krush, \rollClip, \ampFin],
busIndex: 0);
g = m.gui;
)
{ PinkNoise.ar(0.5) * LFNoise2.kr([5, 8, 13, 21]).max(0); }.play;
s.scope(8);
// kick the effects in at full wet level
m.pxChain.add(\leakDC, 1);
m.pxChain.add(\rollClip, 1);
m.pxChain.add(\dualComp, 1);
m.pxChain.add(\ampFin, 1);
// make a more specific gui - see also ProxyChainGui
(
m.gui(\Mestre, 20, [
[\leakDC, \slotCtl, 1],
[\rollClip, \slotCtl, 1],
[\krush, \slotCtl, 1],
[\ampFin, \slotCtl, 1],
[\RESET, \extra, { m.pxChain.add(\leakDC, 1).add(\ampFin, 1) }],
])
)
m.pxChain.remove(\leakDC, 1);
m.pxChain.remove(\rollClip, 1);
m.pxChain.remove(\krush);
m.pxChain.remove(\ampFin, 1);
// removing a MasterFX
MasterFX.all; // all masterFX, one per server, live here.
MasterFX.clear(\localhost); // clear one specific masterfx
MasterFX.all; // gone now.
MasterFX(Server.internal, 8, [\leakDC, \rollClip, \dualComp, \ampFin]);
MasterFX.all;
MasterFX.clear; // clear all mfxes
MasterFX.all;
p = ProxySpace.push;
~pink = { PinkNoise.ar * SinOsc.ar };
~pink.play;
ProxyMixer(p);
z = MasterFX(s, 8, [\leakDC, \rollClip, \dualComp, \ampFin]);
z.gui;
ToDo:
maybe at some point one will want separate MasterFX for different output groups
on the same server. in that case, remove storage by server name, and use freely
given names.